sclass CircularByteBuffer { byte[] buffer; long base; // elements dropped due to overcapacity int size; // elements actually contained *(int capacity) { buffer = new byte[capacity]; } synchronized void add(byte a) { if (size == buffer.length) { --size; ++base; } buffer[(int) ((base+size) % buffer.length)] = a; ++size; } synchronized byte get(long pos) { if (pos < base || pos >= base+size) ret 0; ret buffer[(int) (pos % buffer.length)]; } synchronized int size() { ret size; } synchronized int capacity() { ret buffer.length; } synchronized bool isFull() { ret size() == capacity(); } synchronized long getBase() { ret base; } }