package com.supaham.commons.utils;
import java.util.AbstractSet;
import java.util.Collection;
import java.util.Iterator;
import java.util.WeakHashMap;
import javax.annotation.Nonnull;
/**
* Represents a delegation for a {@link WeakHashMap} that supports taking a single Element instead
* of a WeakHashMap with object fillers, etc.
* @param <E> Type of set
*/
public class WeakSet<E> extends AbstractSet<E> {
private static final Object OBJECT_FILLER = new Object();
private final WeakHashMap<E, Object> map;
public WeakSet() {
this.map = new WeakHashMap<>();
}
public WeakSet(int expectedSize) {
this.map = new WeakHashMap<>(expectedSize);
}
public WeakSet(int expectedSize, float loadFactor) {
this.map = new WeakHashMap<>(expectedSize, loadFactor);
}
public WeakSet(Collection<? extends E> c) {
this.map = new WeakHashMap<>(c.size());
addAll(c);
}
@Override public boolean add(E e) {
this.map.put(e, OBJECT_FILLER);
return true;
}
@Override public boolean remove(Object o) {
return this.map.remove(o) != null;
}
@Nonnull @Override public Iterator<E> iterator() {
return map.keySet().iterator();
}
@Override public int size() {
return map.size();
}
}