package edu.stanford.nlp.util; import java.util.concurrent.ConcurrentHashMap; import java.util.Collection; import java.util.Iterator; import java.io.Serializable; import java.util.Set; /** * A thin wrapper on a ConcurrentHashMap, turning it into a * ConcurrentHashSet. Such a thing already exists in Java 1.6, using * code such as * <br> * <code> * Collections.newSetFromMap(new ConcurrentHashMap<Object,Boolean>()) * </code> * <br> * However, this isn't available in Java 1.5, so we do it ourselves. * <br> * @author John Bauer */ public class ConcurrentHashSet<E> implements Set<E>, Serializable { private static final long serialVersionUID = 198752987264L; private ConcurrentHashMap<E, Boolean> backingMap = new ConcurrentHashMap<E, Boolean>(); private static final Boolean TRUE = true; public boolean add(E e) { Boolean v = backingMap.put(e, TRUE); return (v == null); } public boolean addAll(Collection<? extends E> c) { boolean modified = false; for (E e : c) { if (add(e)) { modified = true; } } return modified; } public void clear() { backingMap.clear(); } public boolean contains(Object o) { return backingMap.containsKey(o); } public boolean containsAll(Collection<?> c) { return backingMap.keySet().containsAll(c); } public boolean equals(Object o) { return backingMap.keySet().equals(o); } public int hashCode() { return backingMap.hashCode(); } public boolean isEmpty() { return backingMap.isEmpty(); } public Iterator<E> iterator() { return backingMap.keySet().iterator(); } public boolean remove(Object o) { Boolean v = backingMap.remove(o); return (v != null); } public boolean removeAll(Collection<?> c) { return backingMap.keySet().removeAll(c); } public boolean retainAll(Collection<?> c) { return backingMap.keySet().retainAll(c); } public int size() { return backingMap.size(); } public Object[] toArray() { return backingMap.keySet().toArray(); } public <T> T[] toArray(T[] a) { return backingMap.keySet().toArray(a); } }