package hep.aida.ref.tuple;
/**
*
* @author The FreeHEP team @ SLAC.
*
*/
public class TupleCursor implements FTupleCursor{
private int endRow;
private int startRow;
private int currentRow;
private boolean hasRandomAccess;
protected TupleCursor(AbstractTuple tuple) {
startRow = tuple.startRow();
endRow = startRow+tuple.rows();
hasRandomAccess = tuple.supportsRandomAccess();
initCursor();
}
public TupleCursor(int startRow, int endRow, boolean hasRandomAccess ) {
if ( endRow < startRow ) throw new IllegalArgumentException("Wrong endRow. It has to be greater or equal to startRow");
this.endRow = endRow;
this.startRow = startRow;
this.hasRandomAccess = hasRandomAccess;
initCursor();
}
private void initCursor() {
currentRow = startRow-1;
}
public int row() {
return currentRow;
}
public void start() {
initCursor();
}
public boolean next() {
if (currentRow+1 < endRow ) {
currentRow++;
return true;
}
return false;
}
public void setRow(int n) {
if ( ! hasRandomAccess ) throw new IllegalArgumentException("The Tuple does not support random access");
if (n < 0 || n >= endRow) throw new IndexOutOfBoundsException();
currentRow = n;
}
public void close() {
}
public void skip(int rows) {
if ( rows < 0 ) throw new IllegalArgumentException("Illegal number of rows "+rows);
setRow( currentRow+rows );
}
}