package org.atomnuke.util;
import java.lang.ref.WeakReference;
import java.util.Iterator;
import java.util.List;
/**
*
* @author zinic
*/
public class WeakReferenceCollection<R> implements ReferenceCollection<R> {
private class WeakReferenceIterator implements Iterator<R> {
private final Iterator<WeakReference<R>> delegateItr;
public WeakReferenceIterator(Iterator<WeakReference<R>> delegateItr) {
this.delegateItr = delegateItr;
}
@Override
public boolean hasNext() {
return delegateItr.hasNext();
}
@Override
public R next() {
do {
final WeakReference<R> next = delegateItr.next();
final R nextItem = next.get();
if (nextItem != null) {
return nextItem;
}
remove();
} while (hasNext());
return null;
}
@Override
public void remove() {
delegateItr.remove();
}
}
private final List<WeakReference<R>> referenceList;
public WeakReferenceCollection(List<WeakReference<R>> referenceList) {
this.referenceList = referenceList;
}
@Override
public Iterator<R> iterator() {
return new WeakReferenceIterator(referenceList.iterator());
}
@Override
public void add(R reference) {
referenceList.add(new WeakReference<R>(reference));
}
}