public BytesRef fillSlice(BytesRef b, long start, int length) { assert length >= 0: "length=" + length; assert length <= (blocks.length*blockSize)+1; final int index = (int) (start >> blockBits); final int offset = (int) (start & blockMask); b.length = length; if (blockSize - offset >= length) { // Within block b.bytes = blocks[index]; b.offset = offset; } else if (length <= blockSize*2) { // Split b.bytes = new byte[length]; b.offset = 0; System.arraycopy(blocks[index], offset, b.bytes, 0, blockSize-offset); System.arraycopy(blocks[1+index], 0, b.bytes, blockSize-offset, length-(blockSize-offset)); } else { // Spans variable number of blocks b.bytes = new byte[length]; b.offset = 0; final int blockSpan = length/blockSize; System.arraycopy(blocks[index], offset, b.bytes, 0, blockSize-offset); for (int i=1; i < blockSpan; i++) { System.arraycopy(blocks[i+index], 0, b.bytes, i*blockSize-offset, blockSize); } System.arraycopy(blocks[blockSpan+index], 0, b.bytes, blockSpan*blockSize-offset, length % blockSize); } return b; }