in src/main/java/com/twitter/whiskey/util/AbstractMultiMap.java [240:284]
public Iterator<E> iterator() {
return new Iterator<E>() {
Iterator<Map.Entry<K, G>> entryIterator = map.entrySet().iterator();
Iterator<V> valueIterator;
K currentKey;
E removeable;
int sentinel = mutations;
@Override
public boolean hasNext() {
if (valueIterator == null || !valueIterator.hasNext()) {
if (entryIterator.hasNext()) {
Map.Entry<K, G> entry = entryIterator.next();
valueIterator = entry.getValue().iterator();
currentKey = entry.getKey();
} else {
return false;
}
}
// Because we remove empty collections, we know that valueIterator
// must contain at least one value.
return true;
}
@Override
public E next() {
if (!hasNext()) throw new NoSuchElementException();
removeable = newEntry(currentKey, valueIterator.next());
if (sentinel != mutations) throw new ConcurrentModificationException();
return removeable;
}
@Override
public void remove() {
if (removeable == null) throw new IllegalStateException();
removeEntry(removeable);
removeable = null;
if (++sentinel != mutations) throw new ConcurrentModificationException();
}
};
}