package org.mapdb;
import net.jcip.annotations.ThreadSafe;
import org.eclipse.collections.api.LazyLongIterable;
import org.eclipse.collections.api.LongIterable;
import org.eclipse.collections.api.bag.primitive.MutableLongBag;
import org.eclipse.collections.api.block.function.primitive.LongToObjectFunction;
import org.eclipse.collections.api.block.function.primitive.ObjectLongIntToObjectFunction;
import org.eclipse.collections.api.block.function.primitive.ObjectLongToObjectFunction;
import org.eclipse.collections.api.block.predicate.primitive.LongPredicate;
import org.eclipse.collections.api.block.procedure.primitive.LongIntProcedure;
import org.eclipse.collections.api.block.procedure.primitive.LongProcedure;
import org.eclipse.collections.api.iterator.MutableLongIterator;
import org.eclipse.collections.api.list.MutableList;
import org.eclipse.collections.api.list.primitive.ImmutableLongList;
import org.eclipse.collections.api.list.primitive.LongList;
import org.eclipse.collections.api.list.primitive.MutableLongList;
import org.eclipse.collections.api.set.primitive.MutableLongSet;
import org.eclipse.collections.impl.list.mutable.primitive.LongArrayList;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* long list
*
* @author 佐井
* @since 2016-09-14 07:29
*
* //TODO migrate to Eclipse Collections, see https://github.com/eclipse/eclipse-collections/issues/196
*/
@ThreadSafe
class ThreadSafeLongArrayList implements MutableLongList {
public ThreadSafeLongArrayList() {
list = new LongArrayList();
}
private LongArrayList list;
private ReadWriteLock readWriteLock = new ReentrantReadWriteLock(false);
private Lock readLock = readWriteLock.readLock();
private Lock writeLock = readWriteLock.writeLock();
@Override
public void addAtIndex(int index, long element) {
writeLock.lock();
try {
list.addAtIndex(index, element);
} finally {
writeLock.unlock();
}
}
@Override
public boolean addAllAtIndex(int index, long... source) {
writeLock.lock();
try {
return list.addAllAtIndex(index, source);
} finally {
writeLock.unlock();
}
}
@Override
public boolean addAllAtIndex(int index, LongIterable source) {
writeLock.lock();
try {
return list.addAllAtIndex(index, source);
} finally {
writeLock.unlock();
}
}
@Override
public long removeAtIndex(int index) {
writeLock.lock();
try {
return list.removeAtIndex(index);
} finally {
writeLock.unlock();
}
}
@Override
public long set(int index, long element) {
writeLock.lock();
try {
return list.set(index, element);
} finally {
writeLock.unlock();
}
}
@Override
public MutableLongIterator longIterator() {
return list.longIterator();
}
@Override
public long[] toArray() {
readLock.lock();
try {
return list.toArray();
} finally {
readLock.unlock();
}
}
@Override
public boolean contains(long value) {
readLock.lock();
try {
return list.contains(value);
} finally {
readLock.unlock();
}
}
@Override
public boolean containsAll(long... source) {
readLock.lock();
try {
return list.containsAll(source);
} finally {
readLock.unlock();
}
}
@Override
public boolean containsAll(LongIterable source) {
readLock.lock();
try {
return list.containsAll(source);
} finally {
readLock.unlock();
}
}
@Override
public void forEach(LongProcedure procedure) {
list.forEach(procedure);
}
@Override
public void each(LongProcedure procedure) {
readLock.lock();
try {
list.each(procedure);
} finally {
readLock.unlock();
}
}
@Override
public boolean add(long element) {
writeLock.lock();
try {
return list.add(element);
} finally {
writeLock.unlock();
}
}
@Override
public boolean addAll(long... source) {
writeLock.lock();
try {
return list.addAll(source);
} finally {
writeLock.unlock();
}
}
@Override
public boolean addAll(LongIterable source) {
writeLock.lock();
try {
return list.addAll(source);
} finally {
writeLock.unlock();
}
}
@Override
public boolean remove(long value) {
writeLock.lock();
try {
return list.remove(value);
} finally {
writeLock.unlock();
}
}
@Override
public boolean removeAll(LongIterable source) {
writeLock.lock();
try {
return list.removeAll(source);
} finally {
writeLock.unlock();
}
}
@Override
public boolean removeAll(long... source) {
writeLock.lock();
try {
return list.removeAll(source);
} finally {
writeLock.unlock();
}
}
@Override
public boolean retainAll(LongIterable elements) {
writeLock.lock();
try {
return list.retainAll(elements);
} finally {
writeLock.unlock();
}
}
@Override
public boolean retainAll(long... source) {
writeLock.lock();
try {
return list.retainAll(source);
} finally {
writeLock.unlock();
}
}
@Override
public void clear() {
writeLock.lock();
try {
list.clear();
} finally {
writeLock.unlock();
}
}
@Override
public long get(int index) {
readLock.lock();
try {
return list.get(index);
} finally {
readLock.unlock();
}
}
@Override
public long dotProduct(LongList list) {
readLock.lock();
try {
return list.dotProduct(list);
} finally {
readLock.unlock();
}
}
@Override
public int binarySearch(long value) {
readLock.lock();
try {
return list.binarySearch(value);
} finally {
readLock.unlock();
}
}
@Override
public int lastIndexOf(long value) {
readLock.lock();
try {
return list.lastIndexOf(value);
} finally {
readLock.unlock();
}
}
@Override
public long getLast() {
readLock.lock();
try {
return list.getLast();
} finally {
readLock.unlock();
}
}
@Override
public LazyLongIterable asReversed() {
return list.asReversed();
}
@Override
public long getFirst() {
readLock.lock();
try {
return list.getFirst();
} finally {
readLock.unlock();
}
}
@Override
public int indexOf(long value) {
readLock.lock();
try {
return list.indexOf(value);
} finally {
readLock.unlock();
}
}
@Override
public MutableLongList select(LongPredicate predicate) {
readLock.lock();
try {
return list.select(predicate);
} finally {
readLock.unlock();
}
}
@Override
public MutableLongList reject(LongPredicate predicate) {
readLock.lock();
try {
return list.reject(predicate);
} finally {
readLock.unlock();
}
}
@Override
public MutableLongList with(long element) {
writeLock.lock();
try {
return list.with(element);
} finally {
writeLock.unlock();
}
}
@Override
public MutableLongList without(long element) {
writeLock.lock();
try {
return list.without(element);
} finally {
writeLock.unlock();
}
}
@Override
public MutableLongList withAll(LongIterable elements) {
writeLock.lock();
try {
return list.withAll(elements);
} finally {
writeLock.unlock();
}
}
@Override
public MutableLongList withoutAll(LongIterable elements) {
writeLock.lock();
try {
return list.withoutAll(elements);
} finally {
writeLock.unlock();
}
}
@Override
public <V> MutableList<V> collect(LongToObjectFunction<? extends V> function) {
readLock.lock();
try {
return list.collect(function);
} finally {
readLock.unlock();
}
}
@Override
public long detectIfNone(LongPredicate predicate, long ifNone) {
readLock.lock();
try {
return list.detectIfNone(predicate, ifNone);
} finally {
readLock.unlock();
}
}
@Override
public int count(LongPredicate predicate) {
readLock.lock();
try {
return list.count(predicate);
} finally {
readLock.unlock();
}
}
@Override
public boolean anySatisfy(LongPredicate predicate) {
readLock.lock();
try {
return list.anySatisfy(predicate);
} finally {
readLock.unlock();
}
}
@Override
public boolean allSatisfy(LongPredicate predicate) {
readLock.lock();
try {
return list.allSatisfy(predicate);
} finally {
readLock.unlock();
}
}
@Override
public boolean noneSatisfy(LongPredicate predicate) {
readLock.lock();
try {
return list.noneSatisfy(predicate);
} finally {
readLock.unlock();
}
}
@Override
public MutableLongList toList() {
readLock.lock();
try {
return list.toList();
} finally {
readLock.unlock();
}
}
@Override
public MutableLongSet toSet() {
readLock.lock();
try {
return list.toSet();
} finally {
readLock.unlock();
}
}
@Override
public MutableLongBag toBag() {
readLock.lock();
try {
return list.toBag();
} finally {
readLock.unlock();
}
}
@Override
public LazyLongIterable asLazy() {
readLock.lock();
try {
return list.asLazy();
} finally {
readLock.unlock();
}
}
@Override
public <T> T injectInto(T injectedValue, ObjectLongToObjectFunction<? super T, ? extends T> function) {
readLock.lock();
try {
return list.injectInto(injectedValue, function);
} finally {
readLock.unlock();
}
}
@Override
public long sum() {
readLock.lock();
try {
return list.sum();
} finally {
readLock.unlock();
}
}
@Override
public long max() {
readLock.lock();
try {
return list.max();
} finally {
readLock.unlock();
}
}
@Override
public long maxIfEmpty(long defaultValue) {
readLock.lock();
try {
return list.maxIfEmpty(defaultValue);
} finally {
readLock.unlock();
}
}
@Override
public long min() {
readLock.lock();
try {
return list.min();
} finally {
readLock.unlock();
}
}
@Override
public long minIfEmpty(long defaultValue) {
readLock.lock();
try {
return list.minIfEmpty(defaultValue);
} finally {
readLock.unlock();
}
}
@Override
public double average() {
readLock.lock();
try {
return list.average();
} finally {
readLock.unlock();
}
}
@Override
public double median() {
readLock.lock();
try {
return list.median();
} finally {
readLock.unlock();
}
}
@Override
public long[] toSortedArray() {
readLock.lock();
try {
return list.toSortedArray();
} finally {
readLock.unlock();
}
}
@Override
public MutableLongList toSortedList() {
readLock.lock();
try {
return list.toSortedList();
} finally {
readLock.unlock();
}
}
@Override
public MutableLongList reverseThis() {
writeLock.lock();
try {
return list.reverseThis();
} finally {
writeLock.unlock();
}
}
@Override
public MutableLongList toReversed() {
writeLock.lock();
try {
return list.toReversed();
} finally {
writeLock.unlock();
}
}
@Override
public MutableLongList distinct() {
readLock.lock();
try {
return list.distinct();
} finally {
readLock.unlock();
}
}
@Override
public <T> T injectIntoWithIndex(T injectedValue, ObjectLongIntToObjectFunction<? super T, ? extends T> function) {
readLock.lock();
try {
return list.injectIntoWithIndex(injectedValue, function);
} finally {
readLock.unlock();
}
}
@Override
public void forEachWithIndex(LongIntProcedure procedure) {
readLock.lock();
try {
list.forEachWithIndex(procedure);
} finally {
readLock.unlock();
}
}
@Override
public MutableLongList sortThis() {
writeLock.lock();
try {
return list.sortThis();
} finally {
writeLock.unlock();
}
}
@Override
public MutableLongList asUnmodifiable() {
readLock.lock();
try {
return list.asUnmodifiable();
} finally {
readLock.unlock();
}
}
@Override
public MutableLongList asSynchronized() {
return this;
}
@Override
public ImmutableLongList toImmutable() {
readLock.lock();
try {
return list.toImmutable();
} finally {
readLock.unlock();
}
}
@Override
public MutableLongList subList(int fromIndex, int toIndex) {
throw new UnsupportedOperationException("subList not yet implemented!");
}
@Override
public int size() {
readLock.lock();
try {
return list.size();
} finally {
readLock.unlock();
}
}
@Override
public boolean isEmpty() {
readLock.lock();
try {
return list.isEmpty();
} finally {
readLock.unlock();
}
}
@Override
public boolean notEmpty() {
readLock.lock();
try {
return list.notEmpty();
} finally {
readLock.unlock();
}
}
@Override
public String makeString() {
readLock.lock();
try {
return list.makeString();
} finally {
readLock.unlock();
}
}
@Override
public String makeString(String separator) {
readLock.lock();
try {
return list.makeString(separator);
} finally {
readLock.unlock();
}
}
@Override
public String makeString(String start, String separator, String end) {
readLock.lock();
try {
return list.makeString(start, separator, end);
} finally {
readLock.unlock();
}
}
@Override
public void appendString(Appendable appendable) {
readLock.lock();
try {
list.appendString(appendable);
} finally {
readLock.unlock();
}
}
@Override
public void appendString(Appendable appendable, String separator) {
readLock.lock();
try {
list.appendString(appendable, separator);
} finally {
readLock.unlock();
}
}
@Override
public void appendString(Appendable appendable, String start, String separator, String end) {
readLock.lock();
try {
list.appendString(appendable, start, separator, end);
} finally {
readLock.unlock();
}
}
}