package org.droidplanner.android.utils.collection;
/**
* Created by Fredia Huya-Kouadio on 1/23/15.
*/
public class CircularQueue<T> {
private final T[] buffer;
private int bufferSize;
private int bufferIndex;
public CircularQueue(int capacity) {
buffer = (T[]) new Object[capacity];
bufferSize = 0;
bufferIndex = 0;
}
private int getAndIncrementIndex() {
int index = bufferIndex;
bufferIndex = (bufferIndex + 1) % buffer.length;
return index;
}
private int decrementAndGetIndex() {
bufferIndex = (buffer.length + bufferIndex - 1) % buffer.length;
return bufferIndex;
}
public int capacity() {
return buffer.length;
}
public void clear() {
bufferSize = 0;
bufferIndex = 0;
for (int i = 0; i < buffer.length; i++) {
buffer[i] = null;
}
}
public int size() {
return bufferSize;
}
public boolean isEmpty() {
return bufferSize == 0;
}
public void add(T item) {
buffer[getAndIncrementIndex()] = item;
bufferSize++;
}
public T poll() {
if (isEmpty())
return null;
int index = decrementAndGetIndex();
T item = buffer[index];
buffer[index] = null;
bufferSize--;
return item;
}
}