package org.multiverse.collections; import org.multiverse.api.Stm; import org.multiverse.api.Txn; import org.multiverse.api.collections.TxnCollection; import org.multiverse.api.collections.TxnIterator; import org.multiverse.api.references.TxnRefFactory; import java.util.Collection; import static org.multiverse.api.TxnThreadLocal.getThreadLocalTxn; public abstract class AbstractTxnCollection<E> implements TxnCollection<E> { protected final Stm stm; protected final TxnRefFactory defaultRefFactory; protected AbstractTxnCollection(Stm stm) { if (stm == null) { throw new NullPointerException(); } this.stm = stm; this.defaultRefFactory = stm.getDefaultRefFactory(); } @Override public Stm getStm() { return stm; } @Override public boolean isEmpty() { return isEmpty(getThreadLocalTxn()); } @Override public boolean isEmpty(final Txn txn) { return size(txn) == 0; } @Override public int size() { return size(getThreadLocalTxn()); } @Override public void clear() { clear(getThreadLocalTxn()); } @Override public boolean contains(final Object item) { return contains(getThreadLocalTxn(), item); } @Override public boolean containsAll(Collection<?> c) { return containsAll(getThreadLocalTxn(), c); } @Override public boolean containsAll(Txn txn, Collection<?> c) { if (c == null) { throw new NullPointerException(); } if (c.isEmpty()) { return true; } if (isEmpty(txn)) { return false; } for (Object item : c) { if (!contains(txn, item)) { return false; } } return true; } @Override public boolean remove(Object o) { return remove(getThreadLocalTxn(), o); } @Override public boolean add(final E item) { return add(getThreadLocalTxn(), item); } @Override public boolean addAll(final Collection<? extends E> c) { return addAll(getThreadLocalTxn(), c); } @Override public boolean addAll(final Txn txn, final Collection<? extends E> c) { if (c == null) { throw new NullPointerException(); } if (c.isEmpty()) { return false; } boolean change = false; for (E item : c) { if (add(txn, item)) { change = true; } } return change; } @Override public boolean addAll(final TxnCollection<? extends E> c) { return addAll(getThreadLocalTxn(), c); } @Override public boolean addAll(final Txn txn, final TxnCollection<? extends E> c) { if (c == null) { throw new NullPointerException(); } if (c.isEmpty(txn)) { return false; } boolean change = false; for (TxnIterator<? extends E> it = c.iterator(txn); it.hasNext(txn);) { if (add(txn, it.next(txn))) { change = true; } } return change; } @Override public TxnIterator<E> iterator() { return iterator(getThreadLocalTxn()); } @Override public String toString() { return toString(getThreadLocalTxn()); } @Override public Object[] toArray() { throw new UnsupportedOperationException(); } @Override public <T> T[] toArray(T[] a) { throw new UnsupportedOperationException(); } @Override public boolean removeAll(Collection<?> c) { throw new UnsupportedOperationException(); } @Override public boolean retainAll(Collection<?> c) { throw new UnsupportedOperationException(); } }