sclass WeakCompactHashSet extends AbstractSet {
Set set = new CompactHashSet;
ReferenceQueue queue = new ReferenceQueue();
sclass MyWeakReference extends WeakReference {
int hash;
*() {}
*(O o, ReferenceQueue queue) {
super(o, queue);
hash = o.hashCode();
}
public int hashCode() { ret hash; }
public bool equals(O o) {
ret o instanceof MyWeakReference
&& eq(get(), ((MyWeakReference) o).get());
}
}
void reap() {
MyWeakReference ref;
while ((ref = (MyWeakReference) queue.poll()) != null)
set.remove(ref);
}
public int size() { reap(); ret set.size(); }
public Iterator iterator() {
final Iterator> it = iterator(set);
ret iteratorFromFunction(func() -> A {
while (it.hasNext()) {
MyWeakReference ref = it.next();
A a = ref.get();
if (a != null) ret a;
// todo: clean up entry
}
null;
});
}
public bool contains(O o) {
reap();
ret set.contains(new MyWeakReference(o, queue));
}
public bool add(A a) {
reap();
ret set.add(new MyWeakReference(a, queue));
}
public bool remove(O o) {
reap();
ret set.remove(new MyWeakReference(o, queue));
}
}