package net.sf.openrocket.util;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
/**
* A Set that additionally implements the Monitorable interface.
*
* @author Sampo Niskanen <sampo.niskanen@iki.fi>
*/
public class MonitorableSet<E> extends HashSet<E> implements Monitorable {
private int modID;
@Override
public boolean add(E e) {
modID++;
return super.add(e);
};
@Override
public boolean addAll(Collection<? extends E> c) {
modID++;
return super.addAll(c);
}
@Override
public void clear() {
modID++;
super.clear();
}
@Override
public Iterator<E> iterator() {
return new MonitorableIterator<E>(super.iterator());
}
@Override
public boolean remove(Object o) {
modID++;
return super.remove(o);
}
@Override
public boolean removeAll(Collection<?> c) {
modID++;
return super.removeAll(c);
}
@Override
public boolean retainAll(Collection<?> c) {
modID++;
return super.retainAll(c);
}
@Override
public int getModID() {
return modID;
}
@SuppressWarnings("unchecked")
@Override
public MonitorableSet<E> clone() {
return (MonitorableSet<E>) super.clone();
}
private class MonitorableIterator<F> implements Iterator<F> {
private final Iterator<F> iterator;
public MonitorableIterator(Iterator<F> iterator) {
this.iterator = iterator;
}
@Override
public boolean hasNext() {
return iterator.hasNext();
}
@Override
public F next() {
return iterator.next();
}
@Override
public void remove() {
iterator.remove();
modID++;
}
}
}