package io.atomix.catalyst.buffer; import io.atomix.catalyst.util.Assert; import java.nio.ByteBuffer; import java.nio.ByteOrder; /** * Byte buffer bytes. */ public abstract class ByteBufferBytes extends AbstractBytes { protected ByteBuffer buffer; protected ByteBufferBytes(ByteBuffer buffer) { this.buffer = buffer; } public Bytes reset(ByteBuffer buffer) { buffer.clear(); this.buffer = Assert.notNull(buffer, "buffer"); return this; } /** * Allocates a new byte buffer. * * @param size the buffer size * @return a newly allocated byte buffer */ protected abstract ByteBuffer newByteBuffer(long size); @Override public Bytes resize(long newSize) { ByteBuffer oldBuffer = buffer; ByteBuffer newBuffer = newByteBuffer(newSize); oldBuffer.position(0).limit(buffer.capacity()); newBuffer.position(0).limit(buffer.capacity()); newBuffer.put(oldBuffer); newBuffer.clear(); return reset(newBuffer); } @Override public byte[] array() { return buffer.array(); } /** * Returns the underlying {@link ByteBuffer}. * * @return the underlying byte buffer */ public ByteBuffer byteBuffer() { return buffer; } @Override public Bytes zero() { return this; } @Override public long size() { return buffer.capacity(); } @Override public ByteOrder order() { return buffer.order(); } @Override public Bytes order(ByteOrder order) { return reset(buffer.order(order)); } /** * Returns the index for the given offset. */ private int index(long offset) { return (int) offset; } @Override public Bytes zero(long offset) { for (int i = index(offset); i < buffer.capacity(); i++) { buffer.put(i, (byte) 0); } return this; } @Override public Bytes zero(long offset, long length) { for (int i = index(offset); i < offset + length; i++) { buffer.put(i, (byte) 0); } return this; } @Override public Bytes read(long position, byte[] bytes, long offset, long length) { for (int i = 0; i < length; i++) { bytes[index(offset) + i] = (byte) readByte(position + i); } return this; } @Override public Bytes read(long position, Bytes bytes, long offset, long length) { for (int i = 0; i < length; i++) { bytes.writeByte(offset + i, readByte(position + i)); } return this; } @Override public Bytes write(long position, byte[] bytes, long offset, long length) { for (int i = 0; i < length; i++) { buffer.put((int) position + i, (byte) bytes[index(offset) + i]); } return this; } @Override public Bytes write(long position, Bytes bytes, long offset, long length) { for (int i = 0; i < length; i++) { buffer.put((int) position + i, (byte) bytes.readByte(offset + i)); } return this; } @Override public int readByte(long offset) { return buffer.get(index(offset)); } @Override public char readChar(long offset) { return buffer.getChar(index(offset)); } @Override public short readShort(long offset) { return buffer.getShort(index(offset)); } @Override public int readInt(long offset) { return buffer.getInt(index(offset)); } @Override public long readLong(long offset) { return buffer.getLong(index(offset)); } @Override public float readFloat(long offset) { return buffer.getFloat(index(offset)); } @Override public double readDouble(long offset) { return buffer.getDouble(index(offset)); } @Override public Bytes writeByte(long offset, int b) { buffer.put(index(offset), (byte) b); return this; } @Override public Bytes writeChar(long offset, char c) { buffer.putChar(index(offset), c); return this; } @Override public Bytes writeShort(long offset, short s) { buffer.putShort(index(offset), s); return this; } @Override public Bytes writeInt(long offset, int i) { buffer.putInt(index(offset), i); return this; } @Override public Bytes writeLong(long offset, long l) { buffer.putLong(index(offset), l); return this; } @Override public Bytes writeFloat(long offset, float f) { buffer.putFloat(index(offset), f); return this; } @Override public Bytes writeDouble(long offset, double d) { buffer.putDouble(index(offset), d); return this; } }