package net.i2p.util; import java.util.AbstractSet; import java.util.Collection; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; /** * Implement on top of a ConcurrentHashMap with a dummy value. * * @author zzz */ public class ConcurrentHashSet<E> extends AbstractSet<E> implements Set<E> { private static final Object DUMMY = new Object(); private final Map<E, Object> _map; public ConcurrentHashSet() { _map = new ConcurrentHashMap<E, Object>(); } public ConcurrentHashSet(int capacity) { _map = new ConcurrentHashMap<E, Object>(capacity); } @Override public boolean add(E o) { return _map.put(o, DUMMY) == null; } @Override public void clear() { _map.clear(); } @Override public boolean contains(Object o) { return _map.containsKey(o); } @Override public boolean isEmpty() { return _map.isEmpty(); } @Override public boolean remove(Object o) { return _map.remove(o) != null; } public int size() { return _map.size(); } public Iterator<E> iterator() { return _map.keySet().iterator(); } @Override public boolean addAll(Collection<? extends E> c) { boolean rv = false; for (E e : c) rv |= _map.put(e, DUMMY) == null; return rv; } }