package org.basex.io.random;
/**
* This class provides a simple, clock-based buffer management.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
final class Buffers {
/** Number of buffers (must be 1 << n). */
private static final int BUFFERS = 1 << 4;
/** Buffers. */
private final Buffer[] buf = new Buffer[BUFFERS];
/** Current buffer offset. */
private int off;
/**
* Constructor.
*/
Buffers() {
for(int b = 0; b < BUFFERS; ++b) buf[b] = new Buffer();
}
/**
* Returns all buffers.
* @return buffers
*/
Buffer[] all() {
return buf;
}
/**
* Returns the current buffer.
* @return current buffer
*/
Buffer current() {
return buf[off];
}
/**
* Chooses a buffer and sets the offset.
* @param p buffer pointer
* @return true if cursor has changed
*/
boolean cursor(final long p) {
final int o = off;
do {
if(buf[off].pos == p) return false;
} while((off = off + 1 & BUFFERS - 1) != o);
off = o + 1 & BUFFERS - 1;
return true;
}
}