package org.limewire.collection;
import java.util.HashSet;
import java.util.Set;
/**
* A round-robin queue where types are unique.
<pre>
LinkedList<String> ll = new LinkedList<String>();
ll.add("Abby");
ll.add("Bob");
ll.add("Bob"); //duplicate that isn't enqueue'd in rrq
System.out.println("ll size: " + ll.size());
RoundRobinSetQueue<String> rrq = new RoundRobinSetQueue<String>();
for(String o : ll)
rrq.enqueue(o);
System.out.println("rrq size: " + rrq.size() + " content: ");
for(int i = 0; i < rrq.size() ; i++)
System.out.println(rrq.next());
Output:
ll size: 3
rrq size: 2 content:
Abby
Bob
</pre>
*/
public class RoundRobinSetQueue<T> extends RoundRobinQueue<T> {
private Set<T> _uniqueness;
public RoundRobinSetQueue() {
super();
_uniqueness = new HashSet<T>();
}
/* (non-Javadoc)
* @see com.limegroup.gnutella.util.RoundRobinQueue#enqueue(java.lang.Object)
*/
@Override
public synchronized void enqueue(T value) {
if (_uniqueness.add(value))
super.enqueue(value);
}
/* (non-Javadoc)
* @see com.limegroup.gnutella.util.RoundRobinQueue#remove(java.lang.Object)
*/
@Override
public synchronized void remove(T o) {
if (_uniqueness.contains(o)) {
_uniqueness.remove(o);
super.remove(o);
}
}
/* (non-Javadoc)
* @see com.limegroup.gnutella.util.RoundRobinQueue#removeAllOccurences(java.lang.Object)
*/
@Override
public synchronized void removeAllOccurences(T o) {
remove(o);
}
}