| 292 | } |
| 293 | |
| 294 | @WeakOuter |
| 295 | private class EntrySet extends ForwardingSet<Entry<K, V>> { |
| 296 | final Set<Entry<K, V>> esDelegate = delegate.entrySet(); |
| 297 | |
| 298 | |
| 299 | @Override |
| 300 | protected Set<Entry<K, V>> delegate() { |
| 301 | return esDelegate; |
| 302 | } |
| 303 | |
| 304 | @Override |
| 305 | public void clear() { |
| 306 | AbstractBiMap.this.clear(); |
| 307 | } |
| 308 | |
| 309 | @Override |
| 310 | public boolean remove(Object object) { |
| 311 | if (!esDelegate.contains(object)) { |
| 312 | return false; |
| 313 | } |
| 314 | |
| 315 | // safe because esDelgate.contains(object). |
| 316 | Entry<?, ?> entry = (Entry<?, ?>) object; |
| 317 | inverse.delegate.remove(entry.getValue()); |
| 318 | /* |
| 319 | * Remove the mapping in inverse before removing from esDelegate because |
| 320 | * if entry is part of esDelegate, entry might be invalidated after the |
| 321 | * mapping is removed from esDelegate. |
| 322 | */ |
| 323 | esDelegate.remove(entry); |
| 324 | return true; |
| 325 | } |
| 326 | |
| 327 | @Override |
| 328 | public Iterator<Entry<K, V>> iterator() { |
| 329 | final Iterator<Entry<K, V>> iterator = esDelegate.iterator(); |
| 330 | return new Iterator<Entry<K, V>>() { |
| 331 | Entry<K, V> entry; |
| 332 | |
| 333 | |
| 334 | @Override |
| 335 | public boolean hasNext() { |
| 336 | return iterator.hasNext(); |
| 337 | } |
| 338 | |
| 339 | @Override |
| 340 | public Entry<K, V> next() { |
| 341 | entry = iterator.next(); |
| 342 | |
| 343 | final Entry<K, V> finalEntry = entry; |
| 344 | return new ForwardingMapEntry<K, V>() { |
| 345 | @Override |
| 346 | protected Entry<K, V> delegate() { |
| 347 | return finalEntry; |
| 348 | } |
| 349 | |
| 350 | @Override |
| 351 | public V setValue(V value) { |