package org.deeplearning4j.parallelism;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import java.io.Serializable;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
/**
* This is simplified ConcurrentHashSet implementation
*
* PLEASE NOTE: This class does NOT implement real equals & hashCode
*
* @author raver119@gmail.com
*/
// TODO: add equals/hashcode if needed
public class ConcurrentHashSet<E> implements Set<E>, Serializable {
private static final long serialVersionUID = 123456789L;
// we're using concurrenthashmap behind the scenes
private ConcurrentHashMap<E, Boolean> backingMap;
public ConcurrentHashSet() {
backingMap = new ConcurrentHashMap<>();
}
public ConcurrentHashSet(@NonNull Collection<E> collection) {
this();
addAll(collection);
}
@Override
public int size() {
return backingMap.size();
}
@Override
public boolean isEmpty() {
return backingMap.isEmpty();
}
@Override
public boolean contains(Object o) {
return backingMap.containsKey(o);
}
@Override
public Iterator<E> iterator() {
return new Iterator<E>() {
private Iterator<Map.Entry<E, Boolean>> iterator = backingMap.entrySet().iterator();
@Override
public boolean hasNext() {
return iterator.hasNext();
}
@Override
public E next() {
return iterator.next().getKey();
}
@Override
public void remove() {
// do nothing
}
};
}
@Override
public Object[] toArray() {
throw new UnsupportedOperationException();
}
@Override
public <T> T[] toArray(T[] a) {
throw new UnsupportedOperationException();
}
@Override
public boolean add(@NonNull E e) {
Boolean ret = backingMap.putIfAbsent(e, Boolean.TRUE);
return ret == null;
}
@Override
public boolean remove(Object o) {
return backingMap.remove(o);
}
@Override
public boolean containsAll(Collection<?> c) {
for (Object o : c) {
if (!contains(o))
return false;
}
return true;
}
@Override
public boolean addAll(Collection<? extends E> c) {
for (E e : c)
add(e);
return true;
}
@Override
public boolean retainAll(Collection<?> c) {
return false;
}
@Override
public boolean removeAll(Collection<?> c) {
for (Object o : c)
remove(o);
return true;
}
@Override
public void clear() {
backingMap.clear();
}
}