class BufferRing<B extends BufferRing.ReleasableBuffer> {
    public BufferRing(BufferFactory<B> factory, int size) {
        buffers = new Object[size];
        for (int i = 0; i < size; i++) {
            buffers[i] = factory.create();
        }
        position = 0;
    }

    public interface BufferFactory<B extends ReleasableBuffer> {
        B create();
    }

    public interface ReleasableBuffer {
        void release();
    }

    private Object[] buffers;
    private int position;

    public int capacity() {
        return buffers.length;
    }

    public int position() {
        return position;
    }
    public BufferRing position(int position) {
        this.position = ((position % buffers.length) + buffers.length) % buffers.length;
        return this;
    }

    @SuppressWarnings("unchecked")
    public B get() {
        return (B)buffers[position];
    }

    @SuppressWarnings("unchecked")
    public B get(int offset) {
        return (B)buffers[((position + offset) % buffers.length + buffers.length) % buffers.length];
    }

    @SuppressWarnings("unchecked")
    public void release() {<FILL_FUNCTION_BODY>}
}

        for (int i = 0; i < buffers.length; i++) {
            ((B)buffers[i]).release();
        }
        buffers = null;
    
<no_super_class>