private int pageSizeFor(int index) { if (index < pageIndexFor(pageGrowthAreaSize)) { return initialPageSize << index; } else { return maximalPageSize; } }
private long addressForPage(int index) { int postIndex = index - pageIndexFor(pageGrowthAreaSize); if (postIndex > 0) { return pageGrowthAreaSize + (((long) maximalPageSize) * postIndex); } else { return (initialPageSize << index) - initialPageSize; } }
private int pageSizeFor(int index) { if (index < pageIndexFor(pageGrowthAreaSize)) { return initialPageSize << index; } else { return maximalPageSize; } }
private long addressForPage(int index) { int postIndex = index - pageIndexFor(pageGrowthAreaSize); if (postIndex > 0) { return pageGrowthAreaSize + (((long) maximalPageSize) * postIndex); } else { return (initialPageSize << index) - initialPageSize; } }
private int pageIndexFor(long address) { if (address > pageGrowthAreaSize) { return (int) ((address - pageGrowthAreaSize) / maximalPageSize + pageIndexFor(pageGrowthAreaSize)); } else { return Long.SIZE - Long.numberOfLeadingZeros((address / initialPageSize) + 1) - 1; } }
private int pageIndexFor(long address) { if (address > pageGrowthAreaSize) { return (int) ((address - pageGrowthAreaSize) / maximalPageSize + pageIndexFor(pageGrowthAreaSize)); } else { return Long.SIZE - Long.numberOfLeadingZeros((address / initialPageSize) + 1) - 1; } }
private int pageAddressFor(long address) { return (int) (address - addressForPage(pageIndexFor(address))); }
private int pageAddressFor(long address) { return (int) (address - addressForPage(pageIndexFor(address))); }
public void writeByte(long address, byte value) { int pageIndex = pageIndexFor(address); int pageAddress = pageAddressFor(address); pages.get(pageIndex).asByteBuffer().put(pageAddress, value); }
public byte readByte(long address) { int pageIndex = pageIndexFor(address); int pageAddress = pageAddressFor(address); return pages.get(pageIndex).asByteBuffer().get(pageAddress); }
public void writeByte(long address, byte value) { int pageIndex = pageIndexFor(address); int pageAddress = pageAddressFor(address); pages.get(pageIndex).asByteBuffer().put(pageAddress, value); }
public byte readByte(long address) { int pageIndex = pageIndexFor(address); int pageAddress = pageAddressFor(address); return pages.get(pageIndex).asByteBuffer().get(pageAddress); }
public void writeLong(long address, long value) { int pageIndex = pageIndexFor(address); int pageAddress = pageAddressFor(address); int pageSize = pageSizeFor(pageIndex); if (pageAddress + 8 <= pageSize) { pages.get(pageIndex).asByteBuffer().putLong(pageAddress, value); } else { for (int i = 0; i < 8; i++) { ByteBuffer buffer = pages.get(pageIndex).asByteBuffer(); buffer.position(pageAddress); buffer.put((byte) (value >> (Byte.SIZE * (7 - i)))); address++; pageIndex = pageIndexFor(address); pageAddress = pageAddressFor(address); } } }
public void writeLong(long address, long value) { int pageIndex = pageIndexFor(address); int pageAddress = pageAddressFor(address); int pageSize = pageSizeFor(pageIndex); if (pageAddress + 8 <= pageSize) { pages.get(pageIndex).asByteBuffer().putLong(pageAddress, value); } else { for (int i = 0; i < 8; i++) { ByteBuffer buffer = pages.get(pageIndex).asByteBuffer(); buffer.position(pageAddress); buffer.put((byte) (value >> (Byte.SIZE * (7 - i)))); address++; pageIndex = pageIndexFor(address); pageAddress = pageAddressFor(address); } } }
public void writeShort(long address, short value) { int pageIndex = pageIndexFor(address); int pageAddress = pageAddressFor(address); int pageSize = pageSizeFor(pageIndex); if (pageAddress + 2 <= pageSize) { pages.get(pageIndex).asByteBuffer().putShort(pageAddress, value); } else { for (int i = 0; i < 2; i++) { ByteBuffer buffer = pages.get(pageIndex).asByteBuffer(); buffer.position(pageAddress); buffer.put((byte) (value >> (Byte.SIZE * (1 - i)))); address++; pageIndex = pageIndexFor(address); pageAddress = pageAddressFor(address); } } }
public int readInt(long address) { int pageIndex = pageIndexFor(address); int pageAddress = pageAddressFor(address); int pageSize = pageSizeFor(pageIndex); if (pageAddress + 4 <= pageSize) { return pages.get(pageIndex).asByteBuffer().getInt(pageAddress); } else { int value = 0; for (int i = 0; i < 4; i++) { ByteBuffer buffer = pages.get(pageIndex).asByteBuffer(); value |= (0xff & buffer.get(pageAddress)) << (Byte.SIZE * (3 - i)); address++; pageIndex = pageIndexFor(address); pageAddress = pageAddressFor(address); } return value; } }
public long readLong(long address) { int pageIndex = pageIndexFor(address); int pageAddress = pageAddressFor(address); int pageSize = pageSizeFor(pageIndex); if (pageAddress + 8 <= pageSize) { return pages.get(pageIndex).asByteBuffer().getLong(pageAddress); } else { long value = 0; for (int i = 0; i < 8; i++) { ByteBuffer buffer = pages.get(pageIndex).asByteBuffer(); value |= (0xffL & buffer.get(pageAddress)) << (Byte.SIZE * (7 - i)); address++; pageIndex = pageIndexFor(address); pageAddress = pageAddressFor(address); } return value; } }
public short readShort(long address) { int pageIndex = pageIndexFor(address); int pageAddress = pageAddressFor(address); int pageSize = pageSizeFor(pageIndex); if (pageAddress + 2 <= pageSize) { return pages.get(pageIndex).asByteBuffer().getShort(pageAddress); } else { short value = 0; for (int i = 0; i < 2; i++) { ByteBuffer buffer = pages.get(pageIndex).asByteBuffer(); value |= (0xff & buffer.get(pageAddress)) << (Byte.SIZE * (1 - i)); address++; pageIndex = pageIndexFor(address); pageAddress = pageAddressFor(address); } return value; } }
public void release(long address) { int lastPage = pageIndexFor(address); for (int i = pages.size() - 1; i > lastPage; i--) { Page p = pages.remove(i); allocator.expand(-p.size()); freePage(p); } validatePages(); }
public void release(long address) { int lastPage = pageIndexFor(address); for (int i = pages.size() - 1; i > lastPage; i--) { Page p = pages.remove(i); allocator.expand(-p.size()); freePage(p); } validatePages(); }