content: package com.google.flatbuffers;
  
  import java.nio.ByteBuffer;
  import java.nio.ByteOrder;
  
  public class ByteBufferReadWriteBuf implements ReadWriteBuf {
  
    private final ByteBuffer buffer;
  
    public ByteBufferReadWriteBuf(ByteBuffer bb) {
      this.buffer = bb;
      this.buffer.order(ByteOrder.LITTLE_ENDIAN);
    }
  
    @Override
    public void clear() {
      buffer.clear();
    }
  
    @Override
    public boolean getBoolean(int index) {
      return get(index) != 0;
    }
  
    @Override
    public byte get(int index) {
      return buffer.get(index);
    }
  
    @Override
    public short getShort(int index) {
      return buffer.getShort(index);
    }
  
    @Override
    public int getInt(int index) {
      return buffer.getInt(index);
    }
  
    @Override
    public long getLong(int index) {
      return buffer.getLong(index);
    }
  
    @Override
    public float getFloat(int index) {
      return buffer.getFloat(index);
    }
  
    @Override
    public double getDouble(int index) {
      return buffer.getDouble(index);
    }
  
    @Override
    public String getString(int start, int size) {
      return Utf8Safe.decodeUtf8Buffer(buffer, start, size);
    }
  
    @Override
    public byte[] data() {
      return buffer.array();
    }
  
    @Override
    public void putBoolean(boolean value) {
      buffer.put(value ? (byte)1 : (byte)0);
    }
  
    @Override
    public void put(byte[] value, int start, int length) {
      buffer.put(value, start, length);
    }
  
    @Override
    public void put(byte value) {
      buffer.put(value);
    }
  
    @Override
    public void putShort(short value) {
      buffer.putShort(value);
    }
  
    @Override
    public void putInt(int value) {
      buffer.putInt(value);
    }
  
    @Override
    public void putLong(long value) {
      buffer.putLong(value);
    }
  
    @Override
    public void putFloat(float value) {
      buffer.putFloat(value);
    }
  
    @Override
    public void putDouble(double value) {
      buffer.putDouble(value);
    }
  
    @Override
    public void setBoolean(int index, boolean value) {
      set(index, value ? (byte)1 : (byte)0);
    }
  
    @Override
    public void set(int index, byte value) {
      requestCapacity(index + 1);
      buffer.put(index, value);
    }
  
    @Override
    public void set(int index, byte[] value, int start, int length) {
      requestCapacity(index + (length - start));
      int curPos = buffer.position();
      buffer.position(index);
      buffer.put(value, start, length);
      buffer.position(curPos);
    }
  
    @Override
    public void setShort(int index, short value) {
      requestCapacity(index + 2);
      buffer.putShort(index, value);
    }
  
    @Override
    public void setInt(int index, int value) {
      requestCapacity(index + 4);
      buffer.putInt(index, value);
    }
  
    @Override
    public void setLong(int index, long value) {
      requestCapacity(index + 8);
      buffer.putLong(index, value);
    }
  
    @Override
    public void setFloat(int index, float value) {
      requestCapacity(index + 4);
      buffer.putFloat(index, value);
    }
  
    @Override
    public void setDouble(int index, double value) {
      requestCapacity(index + 8);
      buffer.putDouble(index, value);
    }
  
    @Override
    public int writePosition() {
      return buffer.position();
    }
  
    @Override
    public int limit() {
      return buffer.limit();
    }
  
    @Override
    public boolean requestCapacity(int capacity) {
      return capacity <= buffer.limit();
    }
  
  }
  