package dml.runtime; import jvstm.VBox; import java.util.Collection; import java.util.Iterator; import java.util.AbstractSet; import java.util.Set; public class VSet<E> extends AbstractSet<E> implements Set<E> { private VBox<FunctionalSet<E>> elements = new VBox<FunctionalSet<E>>(FunctionalSet.EMPTY); public VSet() { } public VSet(Collection<? extends E> coll) { this(); addAll(coll); } public int size() { return elements.get().size(); } public boolean contains(Object o) { return elements.get().contains(o); } public void clear() { elements.put(FunctionalSet.EMPTY); } public Iterator<E> iterator() { return new VSetIterator<E>(elements.get()); } public boolean add(E o) { FunctionalSet<E> oldSet = elements.get(); FunctionalSet<E> newSet = oldSet.add(o); if (newSet == oldSet) { return false; } else { elements.put(newSet); return true; } } public boolean remove(Object o) { FunctionalSet<E> oldSet = elements.get(); FunctionalSet<E> newSet = oldSet.remove(o); if (newSet == oldSet) { return false; } else { elements.put(newSet); return true; } } private class VSetIterator<E> implements Iterator<E> { private Iterator<E> iterator; private E current = null; private boolean canRemove = false; VSetIterator(FunctionalSet<E> funcSet) { this.iterator = funcSet.iterator(); } public boolean hasNext() { return iterator.hasNext(); } public E next() { E result = iterator.next(); canRemove = true; current = result; return current; } public void remove() { if (! canRemove) { throw new IllegalStateException(); } else { canRemove = false; VSet.this.remove(current); } } } }