package org.multiverse.collections; import org.multiverse.api.Stm; import org.multiverse.api.Txn; import org.multiverse.api.collections.TxnIterator; import org.multiverse.api.collections.TxnSet; import java.util.Map; import static org.multiverse.api.TxnThreadLocal.getThreadLocalTxn; public final class NaiveTxnHashSet<E> extends AbstractTxnCollection<E> implements TxnSet<E> { private final NaiveTxnHashMap<E, Object> map; public NaiveTxnHashSet(Stm stm) { super(stm); this.map = new NaiveTxnHashMap<E, Object>(stm); } @Override public boolean add(Txn tx, E e) { return map.put(tx, e, this) == null; } @Override public boolean contains(Object item) { return contains(getThreadLocalTxn(), item); } @Override public boolean contains(Txn tx, Object o) { return map.get(tx, o) != null; } @Override public boolean remove(Object item) { return remove(getThreadLocalTxn(), item); } @Override public boolean remove(Txn tx, Object item) { return map.remove(tx, item) != null; } @Override public int size(Txn tx) { return map.size(tx); } @Override public void clear(Txn tx) { map.clear(tx); } @Override public TxnIterator<E> iterator(Txn tx) { return map.keySet(tx).iterator(tx); } static class It<E> extends AbstractTxnIterator<E> { private final TxnIterator<Map.Entry<E, Object>> iterator; It(TxnIterator<Map.Entry<E, Object>> iterator) { this.iterator = iterator; } @Override public boolean hasNext(Txn tx) { return iterator.hasNext(tx); } @Override public E next(Txn tx) { return iterator.next(tx).getKey(); } @Override public void remove(Txn tx) { iterator.remove(tx); } } @Override public String toString(Txn tx) { TxnIterator<E> it = iterator(tx); if(! it.hasNext(tx)) { return "[]"; } StringBuilder result = new StringBuilder(); result.append('['); while(it.hasNext(tx)) { E item = it.next(tx); result.append(item); if(it.hasNext(tx)) { result.append(","); } } result.append(']'); return result.toString(); } }