private PrimitiveLongArrayQueue createQueue() { return new PrimitiveLongArrayQueue(); } }
@Test void addAllElementsFromOtherQueue() { PrimitiveLongArrayQueue queue = createQueue(); queue.enqueue( 1 ); queue.enqueue( 2 ); PrimitiveLongArrayQueue otherQueue = createQueue(); otherQueue.enqueue( 3 ); otherQueue.enqueue( 4 ); queue.addAll( otherQueue ); assertTrue( otherQueue.isEmpty() ); assertEquals( 0, otherQueue.size() ); assertEquals( 4, queue.size() ); for ( int value = 1; value <= 4; value++ ) { assertEquals( value, queue.dequeue() ); } assertTrue( queue.isEmpty() ); }
@Test void tailBeforeHeadCorrectSize() { PrimitiveLongArrayQueue queue = createQueue(); for ( int i = 0; i < 14; i++ ) { queue.enqueue( i ); } for ( int i = 0; i < 10; i++ ) { assertEquals( i, queue.dequeue() ); } for ( int i = 14; i < 24 ; i++ ) { queue.enqueue( i ); } assertEquals( 14, queue.size() ); }
@Test void tailBeforeHeadCorrectIteration() { PrimitiveLongArrayQueue queue = createQueue(); for ( int i = 0; i < 14; i++ ) { queue.enqueue( i ); } for ( int i = 0; i < 10; i++ ) { assertEquals( i, queue.dequeue() ); } for ( int i = 14; i < 24 ; i++ ) { queue.enqueue( i ); } assertEquals( 14, queue.size() ); LongIterator iterator = queue.longIterator(); for ( int j = 10; j < 24; j++ ) { assertTrue( iterator.hasNext() ); assertEquals( j, iterator.next() ); } assertFalse( iterator.hasNext() ); }
public long dequeue() { if ( isEmpty() ) { throw new IllegalStateException( "Fail to poll first element. Queue is empty." ); } long value = values[head]; head = (head + 1) & (values.length - 1); return value; }
private void readIdBatch0() throws IOException { if ( stackPosition == 0 ) { return; } long startPosition = max( stackPosition - batchSize * ID_ENTRY_SIZE, 0 ); int bytesToRead = toIntExact( stackPosition - startPosition ); ByteBuffer readBuffer = ByteBuffer.allocate( bytesToRead ); channel.position( startPosition ); channel.readAll( readBuffer ); stackPosition = startPosition; readBuffer.flip(); int idsRead = bytesToRead / ID_ENTRY_SIZE; for ( int i = 0; i < idsRead; i++ ) { long id = readBuffer.getLong(); readFromDisk.enqueue( id ); } if ( aggressiveMode ) { truncate( startPosition ); } }
@Test void failToRemoveElementFromNewEmptyQueue() { assertThrows( IllegalStateException.class, () -> createQueue().dequeue() ); }
@Override public void close() throws IOException { ByteBuffer writeBuffer = ByteBuffer.allocate( batchSize * ID_ENTRY_SIZE ); flushFreeIds( writeBuffer ); freeIds.addAll( readFromDisk ); flushFreeIds( writeBuffer ); if ( !aggressiveMode ) { compact( writeBuffer ); } channel.force( false ); }
public void clear() { initValues( DEFAULT_CAPACITY ); }
public void enqueue( long value ) { values[tail] = value; tail = (tail + 1) & (values.length - 1); if ( tail == head ) { ensureCapacity(); } }
public long[] getIds( int numberOfIds ) { if ( freeIdCount == 0 ) { return PrimitiveLongCollections.EMPTY_LONG_ARRAY; } int reusableIds = (int) min( numberOfIds, freeIdCount ); long[] ids = new long[reusableIds]; int cursor = 0; while ( (cursor < reusableIds) && !freeIds.isEmpty() ) { ids[cursor++] = freeIds.dequeue(); } while ( cursor < reusableIds ) { ids[cursor++] = getIdFromDisk(); } freeIdCount -= reusableIds; return ids; }
@Test void tailBeforeHeadCorrectResize() { PrimitiveLongArrayQueue queue = createQueue(); for ( int i = 0; i < 14; i++ ) { queue.enqueue( i ); } for ( int i = 0; i < 10; i++ ) { assertEquals( i, queue.dequeue() ); } for ( int i = 14; i < 34 ; i++ ) { queue.enqueue( i ); } assertEquals( 24, queue.size() ); for ( int j = 10; j < 34; j++ ) { assertEquals( j, queue.dequeue() ); } }
@Test void newQueueIsEmpty() { assertTrue( createQueue().isEmpty() ); }
private void readIdBatch0() throws IOException { if ( stackPosition == 0 ) { return; } long startPosition = max( stackPosition - batchSize * ID_ENTRY_SIZE, 0 ); int bytesToRead = toIntExact( stackPosition - startPosition ); ByteBuffer readBuffer = ByteBuffer.allocate( bytesToRead ); channel.position( startPosition ); channel.readAll( readBuffer ); stackPosition = startPosition; readBuffer.flip(); int idsRead = bytesToRead / ID_ENTRY_SIZE; for ( int i = 0; i < idsRead; i++ ) { long id = readBuffer.getLong(); readFromDisk.enqueue( id ); } if ( aggressiveMode ) { truncate( startPosition ); } }