public Iterator iterator()

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();
                }
            };
        }