package net.i2p.router.util;
import java.util.AbstractSet;
import java.util.Iterator;
import java.util.NoSuchElementException;
/**
* Like Collections.singleton() but item is removable,
* clear() is supported, and the iterator supports remove().
* Item may not be null. add() and addAll() unsupported.
* Unsynchronized.
*
* @since 0.9.7
*/
public class RemovableSingletonSet<E> extends AbstractSet<E> {
private E _elem;
public RemovableSingletonSet(E element) {
if (element == null)
throw new NullPointerException();
_elem = element;
}
@Override
public void clear() {
_elem = null;
}
@Override
public boolean contains(Object o) {
return o != null && o.equals(_elem);
}
@Override
public boolean isEmpty() {
return _elem == null;
}
@Override
public boolean remove(Object o) {
boolean rv = o.equals(_elem);
if (rv)
_elem = null;
return rv;
}
public int size() {
return _elem != null ? 1 : 0;
}
public Iterator<E> iterator() {
return new RSSIterator();
}
private class RSSIterator implements Iterator<E> {
boolean done;
public boolean hasNext() {
return _elem != null && !done;
}
public E next() {
if (!hasNext())
throw new NoSuchElementException();
done = true;
return _elem;
}
public void remove() {
if (_elem == null || !done)
throw new IllegalStateException();
_elem = null;
}
}
}