package com.hwlcn.ldap.util; import com.hwlcn.core.annotation.Mutable; import com.hwlcn.core.annotation.ThreadSafety; import java.lang.ref.WeakReference; import java.util.Collection; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.WeakHashMap; @Mutable() @ThreadSafety(level=ThreadSafetyLevel.NOT_THREADSAFE) public final class WeakHashSet<T> implements Set<T> { private final WeakHashMap<T,WeakReference<T>> m; public WeakHashSet() { m = new WeakHashMap<T,WeakReference<T>>(16); } public WeakHashSet(final int initialCapacity) { m = new WeakHashMap<T,WeakReference<T>>(initialCapacity); } public void clear() { m.clear(); } public boolean isEmpty() { return m.isEmpty(); } public int size() { return m.size(); } public boolean contains(final Object e) { return m.containsKey(e); } public boolean containsAll(final Collection<?> c) { return m.keySet().containsAll(c); } public T get(final T e) { final WeakReference<T> r = m.get(e); if (r == null) { return null; } else { return r.get(); } } public boolean add(final T e) { if (m.containsKey(e)) { return false; } else { m.put(e, new WeakReference<T>(e)); return true; } } public boolean addAll(final Collection<? extends T> c) { boolean changed = false; for (final T e : c) { if (! m.containsKey(e)) { m.put(e, new WeakReference<T>(e)); changed = true; } } return changed; } public T addAndGet(final T e) { final WeakReference<T> r = m.get(e); if (r != null) { final T existingElement = r.get(); if (existingElement != null) { return existingElement; } } m.put(e, new WeakReference<T>(e)); return e; } public boolean remove(final Object e) { return (m.remove(e) != null); } public boolean removeAll(final Collection<?> c) { boolean changed = false; for (final Object o : c) { final Object e = m.remove(o); if (e != null) { changed = true; } } return changed; } public boolean retainAll(final Collection<?> c) { boolean changed = false; final Iterator<Map.Entry<T,WeakReference<T>>> iterator = m.entrySet().iterator(); while (iterator.hasNext()) { final Map.Entry<T,WeakReference<T>> e = iterator.next(); if (! c.contains(e.getKey())) { iterator.remove(); changed = true; } } return changed; } public Iterator<T> iterator() { return m.keySet().iterator(); } public Object[] toArray() { return m.keySet().toArray(); } public <E> E[] toArray(final E[] a) { return m.keySet().toArray(a); } public int hashCode() { return m.keySet().hashCode(); } public boolean equals(final Object o) { return ((o != null) && (o instanceof Set) && m.keySet().equals(o)); } @Override() public String toString() { return m.keySet().toString(); } }