| 382 | } |
| 383 | |
| 384 | @WeakOuter |
| 385 | private final class EntrySet extends ForwardingSet<Entry<K, V>> { |
| 386 | final Set<Entry<K, V>> esDelegate = delegate.entrySet(); |
| 387 | |
| 388 | @Override |
| 389 | protected Set<Entry<K, V>> delegate() { |
| 390 | return esDelegate; |
| 391 | } |
| 392 | |
| 393 | @Override |
| 394 | public void clear() { |
| 395 | AbstractBiMap.this.clear(); |
| 396 | } |
| 397 | |
| 398 | @Override |
| 399 | public boolean remove(@Nullable Object object) { |
| 400 | /* |
| 401 | * `o instanceof Entry` is guaranteed by `contains`, but we check it here to satisfy our |
| 402 | * nullness checker. |
| 403 | */ |
| 404 | if (!esDelegate.contains(object) || !(object instanceof Entry)) { |
| 405 | return false; |
| 406 | } |
| 407 | |
| 408 | Entry<?, ?> entry = (Entry<?, ?>) object; |
| 409 | inverse.delegate.remove(entry.getValue()); |
| 410 | /* |
| 411 | * Remove the mapping in inverse before removing from esDelegate because |
| 412 | * if entry is part of esDelegate, entry might be invalidated after the |
| 413 | * mapping is removed from esDelegate. |
| 414 | */ |
| 415 | esDelegate.remove(entry); |
| 416 | return true; |
| 417 | } |
| 418 | |
| 419 | @Override |
| 420 | public Iterator<Entry<K, V>> iterator() { |
| 421 | return entrySetIterator(); |
| 422 | } |
| 423 | |
| 424 | // See java.util.Collections.CheckedEntrySet for details on attacks. |
| 425 | |
| 426 | @Override |
| 427 | public @Nullable Object[] toArray() { |
| 428 | return standardToArray(); |
| 429 | } |
| 430 | |
| 431 | @Override |
| 432 | @SuppressWarnings("nullness") // bug in our checker's handling of toArray signatures |
| 433 | public <T extends @Nullable Object> T[] toArray(T[] array) { |
| 434 | return standardToArray(array); |
| 435 | } |
| 436 | |
| 437 | @Override |
| 438 | public boolean contains(@Nullable Object o) { |
| 439 | return Maps.containsEntryImpl(delegate(), o); |
| 440 | } |
| 441 | |