package org.limewire.collection; import java.util.Iterator; import java.util.LinkedList; /** * A round-robin queue. {@link #next()} returns an item on the queue and then * puts that item to the end of the queue. * * <pre> * RoundRobinQueue<Integer> rrq = new RoundRobinQueue<Integer>(); * rrq.enqueue(1); * rrq.enqueue(2); * * for(Integer i = rrq.size() + 1; i > 0; i--) * System.out.println(rrq.next()); * * Output: * 1 * 2 * 1 * </pre> * */ public class RoundRobinQueue<T> { private LinkedList<T> _current; /** * Do not create the terminating elements. */ public RoundRobinQueue() { _current = new LinkedList<T>(); } /** * Enqueues the specified object in the round-robin queue. * * @param value the object to add to the queue */ public synchronized void enqueue(T value) { _current.addLast(value); } /** * @return the next object in the round robin queue */ public synchronized T next() { T ret = _current.removeFirst(); _current.addLast(ret); return ret; } /** * Removes the next occurrence of the specified object. * * @param o the object to remove from the queue. */ public synchronized void remove(T o) { _current.remove(o); } /** * Removes all occurrences of the given object in the list. * * @param o the object to remove. */ public synchronized void removeAllOccurences(T o) { Iterator iterator = _current.iterator(); while (iterator.hasNext()) if (iterator.next().equals(o)) iterator.remove(); } public synchronized int size() { return _current.size(); } public synchronized void clear() { _current.clear(); } }