|
@@ -24,10 +24,22 @@ import java.util.Collection;
|
|
|
import java.util.Iterator;
|
|
|
import java.util.Queue;
|
|
|
|
|
|
+/**
|
|
|
+ * An {@code EvictingQueue} is a non-blocking queue which is limited to a maximum size; when new elements are added to a
|
|
|
+ * full queue, elements are evicted from the head of the queue to accommodate the new elements.
|
|
|
+ *
|
|
|
+ * @param <T> The type of elements in the queue.
|
|
|
+ */
|
|
|
public class EvictingQueue<T> implements Queue<T> {
|
|
|
private final int maximumSize;
|
|
|
private final ArrayDeque<T> queue;
|
|
|
|
|
|
+ /**
|
|
|
+ * Construct a new {@code EvictingQueue} that holds {@code maximumSize} elements.
|
|
|
+ *
|
|
|
+ * @param maximumSize The maximum number of elements that the queue can hold
|
|
|
+ * @throws IllegalArgumentException if {@code maximumSize} is less than zero
|
|
|
+ */
|
|
|
public EvictingQueue(int maximumSize) {
|
|
|
if (maximumSize < 0) {
|
|
|
throw new IllegalArgumentException("maximumSize < 0");
|
|
@@ -36,10 +48,20 @@ public class EvictingQueue<T> implements Queue<T> {
|
|
|
this.queue = new ArrayDeque<>(maximumSize);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * @return the number of additional elements that the queue can accommodate before evictions occur
|
|
|
+ */
|
|
|
public int remainingCapacity() {
|
|
|
return this.maximumSize - this.size();
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Add the given element to the queue, possibly forcing an eviction from the head if {@link #remainingCapacity()} is
|
|
|
+ * zero.
|
|
|
+ *
|
|
|
+ * @param t the element to add
|
|
|
+ * @return true if the element was added (always the case for {@code EvictingQueue}
|
|
|
+ */
|
|
|
@Override
|
|
|
public boolean add(T t) {
|
|
|
if (maximumSize == 0) {
|
|
@@ -52,6 +74,9 @@ public class EvictingQueue<T> implements Queue<T> {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * @see #add(Object)
|
|
|
+ */
|
|
|
@Override
|
|
|
public boolean offer(T t) {
|
|
|
return add(t);
|
|
@@ -62,6 +87,7 @@ public class EvictingQueue<T> implements Queue<T> {
|
|
|
return queue.remove();
|
|
|
}
|
|
|
|
|
|
+
|
|
|
@Override
|
|
|
public T poll() {
|
|
|
return queue.poll();
|
|
@@ -117,6 +143,13 @@ public class EvictingQueue<T> implements Queue<T> {
|
|
|
return queue.containsAll(c);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Add the given elements to the queue, possibly forcing evictions from the head if {@link #remainingCapacity()} is
|
|
|
+ * zero or becomes zero during the execution of this method.
|
|
|
+ *
|
|
|
+ * @param c the collection of elements to add
|
|
|
+ * @return true if any elements were added to the queue
|
|
|
+ */
|
|
|
@Override
|
|
|
public boolean addAll(Collection<? extends T> c) {
|
|
|
boolean modified = false;
|