// Has long indices!
persistable sclass SimpleCircularBuffer is Iterable {
A[] buffer;
long base; // elements dropped due to overcapacity
int size; // elements actually contained
*(int capacity) {
buffer = (A[]) new O[capacity];
}
synchronized void add(A a) {
if (size == buffer.length) {
--size;
++base;
}
buffer[(int) ((base+size) % buffer.length)] = a;
++size;
}
synchronized A get(long pos) {
if (pos < base || pos >= base+size) null;
ret buffer[(int) (pos % buffer.length)];
}
synchronized int size() {
ret size;
}
public Iterator iterator() {
ret new ItIt {
long i;
public bool hasNext() { ret i < size(); }
public A next() { ret get(i++); }
};
}
synchronized int capacity() {
ret buffer.length;
}
synchronized bool isFull() {
ret size() == capacity();
}
bool isEmpty() {
ret size() == 0;
}
synchronized long getBase() {
ret base;
}
// pop first actually contained element
synchronized A popFirst() {
if (isEmpty()) null;
A a = get(base);
--size;
++base;
ret a;
}
}