package com.sap.runlet.abstractinterpreter.util;
import java.util.Iterator;
/**
* An iterator that wraps another iterator and returns only those elements
* that are assigment compatible to class <tt>E</tt>.
*
* @author Axel Uhl D043530
*/
public class ClassFilterIterator<E> implements Iterator<E> {
private Iterator<?> iterator;
private Class<?> clazz;
private E next;
private boolean hasNext; // needed because iterators may return null values
public ClassFilterIterator(Class<?> clazz, Iterator<?> iterator) {
this.clazz = clazz;
this.iterator = iterator;
determineNext();
}
@SuppressWarnings("unchecked")
private void determineNext() {
boolean found = false;
hasNext = false;
while (!found && iterator.hasNext()) {
Object nextCandidate = iterator.next();
if (nextCandidate == null || clazz.isAssignableFrom(nextCandidate.getClass())) {
next = (E) nextCandidate;
hasNext = true;
found = true;
}
}
}
@Override
public boolean hasNext() {
return hasNext;
}
@Override
public E next() {
E result = next;
determineNext();
return result;
}
@Override
public void remove() {
throw new UnsupportedOperationException("remove not supported on this iterator type");
}
}