package com.indyforge.twod.engine.util.iteration; import java.util.Iterator; import java.util.NoSuchElementException; /** * An iterator implementation which uses a filter to iterator over a peer * iterator. * * @author Chistopher Probst * * @param <E> * The element type. */ public final class FilteredIterator<E> extends WrappedIterator<E> { // Used to filter elements during iteration private final Filter<? super E> filter; // The next and the remove pointer private E next = null, removePtr = null; /** * Creates a new filtered iterator. * * @param filter * The filter. * @param peerIterator * The peer iterator which will be filtered. */ public FilteredIterator(Filter<? super E> filter, Iterator<? extends E> peerIterator) { super(peerIterator); // Save the iteration filter this.filter = filter; } /* * (non-Javadoc) * * @see java.util.Iterator#hasNext() */ @Override public boolean hasNext() { // Alright! if (next != null) { return true; } // As long as there are elements... while (peerIterator.hasNext()) { // Get next E ptr = peerIterator.next(); // Seems to be a valid value! if (filter == null || filter.accept(ptr)) { // Save to next next = ptr; // Success... return true; } } return false; } /* * (non-Javadoc) * * @see java.util.Iterator#next() */ @Override public E next() { if (!hasNext()) { throw new NoSuchElementException(); } // Swap removePtr = next; // Consume next = null; return removePtr; } /* * (non-Javadoc) * * @see java.util.Iterator#remove() */ @Override public void remove() { if (removePtr != null) { peerIterator.remove(); removePtr = null; } } }