public byte[] readBytes() {
    int len = (int) readVLong();
    Requires.range(len, 0, paging.getPageSize(), "len");

    ensureCanGrow(len);
    byte[] blob = new byte[len];
    Unsafe.INSTANCE.copyMemory(null, address + position, blob, Unsafe.BYTEARRAY_BASEOFFSET, len);
    position += len;
    return blob;
  }
  public void readBytesTo(byte[] buffer, int offset, int length) {
    Requires.nonNull(buffer, "buffer");
    Requires.positive(offset, "offset");
    Requires.positive(length, "length");

    ensureCanGrow(length);
    Unsafe.INSTANCE.copyMemory(
        null,
        address + position,
        buffer,
        Unsafe.BYTEARRAY_BASEOFFSET + offset * Unsafe.BYTEARRAY_INDEXSCALE,
        length);
    position += length;
  }
 public double readDouble() {
   ensureCanGrow(8);
   double value = Unsafe.INSTANCE.getDouble(address + position);
   position += 8;
   return BigEndian.ioDouble(value);
 }
 public float readFloat() {
   ensureCanGrow(4);
   float value = Unsafe.INSTANCE.getFloat(address + position);
   position += 4;
   return BigEndian.ioFloat(value);
 }
 public long readLong() {
   ensureCanGrow(8);
   long value = Unsafe.INSTANCE.getLong(address + position);
   position += 8;
   return BigEndian.ioLong(value);
 }
 public int readInt() {
   ensureCanGrow(4);
   int value = Unsafe.INSTANCE.getInt(address + position);
   position += 4;
   return BigEndian.ioInt(value);
 }
 public short readShort() {
   ensureCanGrow(2);
   short value = Unsafe.INSTANCE.getShort(address + position);
   position += 2;
   return BigEndian.ioShort(value);
 }
 public char readChar() {
   ensureCanGrow(2);
   char value = Unsafe.INSTANCE.getChar(address + position);
   position += 2;
   return BigEndian.ioChar(value);
 }
 public byte readByte() {
   ensureCanGrow(1);
   byte value = Unsafe.INSTANCE.getByte(address + position);
   position++;
   return value;
 }