@Override protected long baseRamBytesUsed() { return super.baseRamBytesUsed() + RamUsageEstimator.NUM_BYTES_OBJECT_REF; }
@Override public final long get(long index) { assert index >= 0 && index < size: "index=" + index + " size=" + size; final int pageIndex = pageIndex(index); final int indexInPage = indexInPage(index); return subMutables[pageIndex].get(indexInPage); }
final int lastPageSize(long size) { final int sz = indexInPage(size); return sz == 0 ? pageSize() : sz; }
/** Similar to {@link ArrayUtil#grow(long[], int)}. */ public final T grow(long minSize) { assert minSize >= 0; if (minSize <= size()) { @SuppressWarnings("unchecked") final T result = (T) this; return result; } long extra = minSize >>> 3; if (extra < 3) { extra = 3; } final long newSize = minSize + extra; return resize(newSize); }
/** Create a new copy of size <code>newSize</code> based on the content of * this buffer. This method is much more efficient than creating a new * instance and copying values one by one. */ public final T resize(long newSize) { final T copy = newUnfilledCopy(newSize); final int numCommonPages = Math.min(copy.subMutables.length, subMutables.length); final long[] copyBuffer = new long[1024]; for (int i = 0; i < copy.subMutables.length; ++i) { final int valueCount = i == copy.subMutables.length - 1 ? lastPageSize(newSize) : pageSize(); final int bpv = i < numCommonPages ? subMutables[i].getBitsPerValue() : this.bitsPerValue; copy.subMutables[i] = newMutable(valueCount, bpv); if (i < numCommonPages) { final int copyLength = Math.min(valueCount, subMutables[i].size()); PackedInts.copy(subMutables[i], 0, copy.subMutables[i], 0, copyLength, copyBuffer); } } return copy; }
protected final void fillPages() { final int numPages = numBlocks(size, pageSize()); for (int i = 0; i < numPages; ++i) { // do not allocate for more entries than necessary on the last page final int valueCount = i == numPages - 1 ? lastPageSize(size) : pageSize(); subMutables[i] = newMutable(valueCount, bitsPerValue); } }
/** Create a new copy of size <code>newSize</code> based on the content of * this buffer. This method is much more efficient than creating a new * instance and copying values one by one. */ public final T resize(long newSize) { final T copy = newUnfilledCopy(newSize); final int numCommonPages = Math.min(copy.subMutables.length, subMutables.length); final long[] copyBuffer = new long[1024]; for (int i = 0; i < copy.subMutables.length; ++i) { final int valueCount = i == copy.subMutables.length - 1 ? lastPageSize(newSize) : pageSize(); final int bpv = i < numCommonPages ? subMutables[i].getBitsPerValue() : this.bitsPerValue; copy.subMutables[i] = newMutable(valueCount, bpv); if (i < numCommonPages) { final int copyLength = Math.min(valueCount, subMutables[i].size()); PackedInts.copy(subMutables[i], 0, copy.subMutables[i], 0, copyLength, copyBuffer); } } return copy; }
protected final void fillPages() { final int numPages = numBlocks(size, pageSize()); for (int i = 0; i < numPages; ++i) { // do not allocate for more entries than necessary on the last page final int valueCount = i == numPages - 1 ? lastPageSize(size) : pageSize(); subMutables[i] = newMutable(valueCount, bitsPerValue); } }
final int lastPageSize(long size) { final int sz = indexInPage(size); return sz == 0 ? pageSize() : sz; }
/** Similar to {@link ArrayUtil#grow(long[], int)}. */ public final T grow(long minSize) { assert minSize >= 0; if (minSize <= size()) { @SuppressWarnings("unchecked") final T result = (T) this; return result; } long extra = minSize >>> 3; if (extra < 3) { extra = 3; } final long newSize = minSize + extra; return resize(newSize); }
/** Create a new copy of size <code>newSize</code> based on the content of * this buffer. This method is much more efficient than creating a new * instance and copying values one by one. */ public final T resize(long newSize) { final T copy = newUnfilledCopy(newSize); final int numCommonPages = Math.min(copy.subMutables.length, subMutables.length); final long[] copyBuffer = new long[1024]; for (int i = 0; i < copy.subMutables.length; ++i) { final int valueCount = i == copy.subMutables.length - 1 ? lastPageSize(newSize) : pageSize(); final int bpv = i < numCommonPages ? subMutables[i].getBitsPerValue() : this.bitsPerValue; copy.subMutables[i] = newMutable(valueCount, bpv); if (i < numCommonPages) { final int copyLength = Math.min(valueCount, subMutables[i].size()); PackedInts.copy(subMutables[i], 0, copy.subMutables[i], 0, copyLength, copyBuffer); } } return copy; }
protected final void fillPages() { final int numPages = numBlocks(size, pageSize()); for (int i = 0; i < numPages; ++i) { // do not allocate for more entries than necessary on the last page final int valueCount = i == numPages - 1 ? lastPageSize(size) : pageSize(); subMutables[i] = newMutable(valueCount, bitsPerValue); } }
/** Set value at <code>index</code>. */ public final void set(long index, long value) { assert index >= 0 && index < size; final int pageIndex = pageIndex(index); final int indexInPage = indexInPage(index); subMutables[pageIndex].set(indexInPage, value); }
final int lastPageSize(long size) { final int sz = indexInPage(size); return sz == 0 ? pageSize() : sz; }
/** Similar to {@link ArrayUtil#grow(long[], int)}. */ public final T grow(long minSize) { assert minSize >= 0; if (minSize <= size()) { @SuppressWarnings("unchecked") final T result = (T) this; return result; } long extra = minSize >>> 3; if (extra < 3) { extra = 3; } final long newSize = minSize + extra; return resize(newSize); }