private void ensureArrayCapacity( int capacity ) { while ( capacity > this.capacity ) { int newCapacity = this.capacity * 2; long[] newArray = new long[newCapacity * longsPerItem]; // Copy contents to new array, newArray starting at 0 for ( int i = 0; i < itemsAhead; i++ ) { System.arraycopy( array, index( cursor + i ), newArray, index( i ), longsPerItem ); } this.array = newArray; this.capacity = newCapacity; this.cursor = 0; } }
public boolean seen( long baseNumber, long number, long[] meta ) { int diff = (int) (number - baseNumber); int index = cursor + diff - 1; if ( index >= cursor + itemsAhead ) { return false; } int absIndex = index( index ); long[] arrayRef = array; long num = arrayRef[absIndex]; if ( num != number ) { return false; } long[] metaCopy = Arrays.copyOfRange( arrayRef, absIndex + 1, absIndex + longsPerItem ); return Arrays.equals( meta, metaCopy ); } }
@Override public String toString() { StringBuilder builder = new StringBuilder(); for ( int i = 0; i < itemsAhead; i++ ) { long value = array[index( cursor + i )]; if ( value != UNSET ) { builder.append( builder.length() > 0 ? "," : "" ).append( value ); } } return builder.toString(); }
void offer( long baseNumber, long number, long[] meta ) { int diff = (int) (number - baseNumber); ensureArrayCapacity( diff ); int index = cursor + diff - 1; // If we offer a value a bit ahead of the last offered value then clear the values in between for ( int i = cursor + itemsAhead; i < index; i++ ) { array[index( i )] = UNSET; } int absIndex = index( index ); array[absIndex] = number; System.arraycopy( meta, 0, array, absIndex + 1, longsPerItem - 1 ); itemsAhead = max( itemsAhead, diff ); }
long pollHighestGapFree( long given, long[] meta ) { // assume that "given" would be placed at cursor long number = given; int length = itemsAhead - 1; int absIndex = 0; for ( int i = 0; i < length; i++ ) { advanceCursor(); absIndex = index( cursor ); if ( array[absIndex] == UNSET ) { // we found a gap, return the number before the gap break; } number++; assert array[absIndex] == number : "Expected index " + cursor + " to be " + number + ", but was " + array[absIndex] + ". This is for i=" + i; } // copy the meta values into the supplied meta System.arraycopy( array, absIndex + 1, meta, 0, longsPerItem - 1 ); return number; }
private void ensureArrayCapacity( int capacity ) { while ( capacity > this.capacity ) { int newCapacity = this.capacity * 2; long[] newArray = new long[newCapacity * longsPerItem]; // Copy contents to new array, newArray starting at 0 for ( int i = 0; i < itemsAhead; i++ ) { System.arraycopy( array, index( cursor + i ), newArray, index( i ), longsPerItem ); } this.array = newArray; this.capacity = newCapacity; this.cursor = 0; } }
void offer( long baseNumber, long number, long[] meta ) { int diff = (int) (number - baseNumber); ensureArrayCapacity( diff ); int index = cursor + diff - 1; // If we offer a value a bit ahead of the last offered value then clear the values in between for ( int i = cursor + itemsAhead; i < index; i++ ) { array[index( i )] = UNSET; } int absIndex = index( index ); array[absIndex] = number; System.arraycopy( meta, 0, array, absIndex + 1, longsPerItem - 1 ); itemsAhead = max( itemsAhead, diff ); }
@Override public String toString() { StringBuilder builder = new StringBuilder(); for ( int i = 0; i < itemsAhead; i++ ) { long value = array[index( cursor + i )]; if ( value != UNSET ) { builder.append( builder.length() > 0 ? "," : "" ).append( value ); } } return builder.toString(); }
public boolean seen( long baseNumber, long number, long[] meta ) { int diff = (int) (number - baseNumber); int index = cursor + diff - 1; if ( index >= cursor + itemsAhead ) { return false; } int absIndex = index( index ); long[] arrayRef = array; long num = arrayRef[absIndex]; if ( num != number ) { return false; } long[] metaCopy = Arrays.copyOfRange( arrayRef, absIndex + 1, absIndex + longsPerItem ); return Arrays.equals( meta, metaCopy ); } }
long pollHighestGapFree( long given, long[] meta ) { // assume that "given" would be placed at cursor long number = given; int length = itemsAhead - 1; int absIndex = 0; for ( int i = 0; i < length; i++ ) { advanceCursor(); absIndex = index( cursor ); if ( array[absIndex] == UNSET ) { // we found a gap, return the number before the gap break; } number++; assert array[absIndex] == number : "Expected index " + cursor + " to be " + number + ", but was " + array[absIndex] + ". This is for i=" + i; } // copy the meta values into the supplied meta System.arraycopy( array, absIndex + 1, meta, 0, longsPerItem - 1 ); return number; }