+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import io.atomix.utils.concurrent.ReferenceManager;
-import io.atomix.utils.memory.Memory;
-
-import java.nio.BufferOverflowException;
-import java.nio.BufferUnderflowException;
-import java.nio.ByteOrder;
-import java.nio.InvalidMarkException;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import static io.atomix.storage.buffer.Bytes.BOOLEAN;
-import static io.atomix.storage.buffer.Bytes.BYTE;
-import static io.atomix.storage.buffer.Bytes.SHORT;
-
-/**
- * Abstract buffer implementation.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public abstract class AbstractBuffer implements Buffer {
- static final int DEFAULT_INITIAL_CAPACITY = 4096;
- static final int MAX_SIZE = Integer.MAX_VALUE - 5;
-
- protected final Bytes bytes;
- private int offset;
- private int initialCapacity;
- private int capacity;
- private int maxCapacity;
- private int position;
- private int limit = -1;
- private int mark = -1;
- private final AtomicInteger references = new AtomicInteger();
- protected final ReferenceManager<Buffer> referenceManager;
- private SwappedBuffer swap;
-
- protected AbstractBuffer(Bytes bytes, ReferenceManager<Buffer> referenceManager) {
- this(bytes, 0, 0, 0, referenceManager);
- }
-
- protected AbstractBuffer(Bytes bytes, int offset, int initialCapacity, int maxCapacity, ReferenceManager<Buffer> referenceManager) {
- if (bytes == null) {
- throw new NullPointerException("bytes cannot be null");
- }
- if (offset < 0) {
- throw new IndexOutOfBoundsException("offset out of bounds of the underlying byte array");
- }
- this.bytes = bytes;
- this.offset = offset;
- this.capacity = 0;
- this.initialCapacity = initialCapacity;
- this.maxCapacity = maxCapacity;
- capacity(initialCapacity);
- this.referenceManager = referenceManager;
- references.set(1);
- }
-
- /**
- * Resets the buffer's internal offset and capacity.
- */
- protected AbstractBuffer reset(int offset, int capacity, int maxCapacity) {
- this.offset = offset;
- this.capacity = 0;
- this.initialCapacity = capacity;
- this.maxCapacity = maxCapacity;
- capacity(initialCapacity);
- references.set(0);
- rewind();
- return this;
- }
-
- @Override
- public Buffer acquire() {
- references.incrementAndGet();
- return this;
- }
-
- @Override
- public boolean release() {
- if (references.decrementAndGet() == 0) {
- if (referenceManager != null) {
- referenceManager.release(this);
- } else {
- bytes.close();
- }
- return true;
- }
- return false;
- }
-
- @Override
- public int references() {
- return references.get();
- }
-
- @Override
- public Bytes bytes() {
- return bytes;
- }
-
- @Override
- public ByteOrder order() {
- return bytes.order();
- }
-
- @Override
- public Buffer order(ByteOrder order) {
- if (order == null) {
- throw new NullPointerException("order cannot be null");
- }
- if (order == order()) {
- return this;
- }
- if (swap != null) {
- return swap;
- }
- swap = new SwappedBuffer(this, offset, capacity, maxCapacity, referenceManager);
- return swap;
- }
-
- @Override
- public boolean isDirect() {
- return bytes.isDirect();
- }
-
- @Override
- public boolean isFile() {
- return bytes.isFile();
- }
-
- @Override
- public boolean isReadOnly() {
- return false;
- }
-
- @Override
- public Buffer asReadOnlyBuffer() {
- return new ReadOnlyBuffer(this, referenceManager)
- .reset(offset, capacity, maxCapacity)
- .position(position)
- .limit(limit);
- }
-
- @Override
- public Buffer compact() {
- compact(offset(position), offset, (limit != -1 ? limit : capacity) - offset(position));
- return clear();
- }
-
- /**
- * Compacts the given bytes.
- */
- protected abstract void compact(int from, int to, int length);
-
- @Override
- public Buffer slice() {
- int maxCapacity = this.maxCapacity - position;
- int capacity = Math.min(Math.min(initialCapacity, maxCapacity), bytes.size() - offset(position));
- if (limit != -1) {
- capacity = maxCapacity = limit - position;
- }
- return new SlicedBuffer(this, bytes, offset(position), capacity, maxCapacity);
- }
-
- @Override
- public Buffer slice(int length) {
- checkSlice(position, length);
- return new SlicedBuffer(this, bytes, offset(position), length, length);
- }
-
- @Override
- public Buffer slice(int offset, int length) {
- checkSlice(offset, length);
- return new SlicedBuffer(this, bytes, offset(offset), length, length);
- }
-
- @Override
- public int offset() {
- return offset;
- }
-
- @Override
- public int capacity() {
- return capacity;
- }
-
- /**
- * Updates the buffer capacity.
- */
- public Buffer capacity(int capacity) {
- if (capacity > maxCapacity) {
- throw new IllegalArgumentException("capacity cannot be greater than maximum capacity");
- } else if (capacity < this.capacity) {
- throw new IllegalArgumentException("capacity cannot be decreased");
- } else if (capacity != this.capacity) {
- // It's possible that the bytes could already meet the requirements of the capacity.
- if (offset(capacity) > bytes.size()) {
- bytes.resize((int) Math.min(Memory.Util.toPow2(offset(capacity)), Integer.MAX_VALUE));
- }
- this.capacity = capacity;
- }
- return this;
- }
-
- @Override
- public int maxCapacity() {
- return maxCapacity;
- }
-
- @Override
- public int position() {
- return position;
- }
-
- @Override
- public Buffer position(int position) {
- if (limit != -1 && position > limit) {
- throw new IllegalArgumentException("position cannot be greater than limit");
- } else if (limit == -1 && position > maxCapacity) {
- throw new IllegalArgumentException("position cannot be greater than capacity");
- }
- if (position > capacity) {
- capacity((int) Math.min(maxCapacity, Memory.Util.toPow2(position)));
- }
- this.position = position;
- return this;
- }
-
- /**
- * Returns the real offset of the given relative offset.
- */
- private int offset(int offset) {
- return this.offset + offset;
- }
-
- @Override
- public int limit() {
- return limit;
- }
-
- @Override
- public Buffer limit(int limit) {
- if (limit > maxCapacity) {
- throw new IllegalArgumentException("limit cannot be greater than buffer capacity");
- }
- if (limit < -1) {
- throw new IllegalArgumentException("limit cannot be negative");
- }
- if (limit != -1 && offset(limit) > bytes.size()) {
- bytes.resize(offset(limit));
- }
- this.limit = limit;
- return this;
- }
-
- @Override
- public int remaining() {
- return (limit == -1 ? maxCapacity : limit) - position;
- }
-
- @Override
- public boolean hasRemaining() {
- return remaining() > 0;
- }
-
- @Override
- public Buffer flip() {
- limit = position;
- position = 0;
- mark = -1;
- return this;
- }
-
- @Override
- public Buffer mark() {
- this.mark = position;
- return this;
- }
-
- @Override
- public Buffer rewind() {
- position = 0;
- mark = -1;
- return this;
- }
-
- @Override
- public Buffer reset() {
- if (mark == -1) {
- throw new InvalidMarkException();
- }
- position = mark;
- return this;
- }
-
- @Override
- public Buffer skip(int length) {
- if (length > remaining()) {
- throw new IndexOutOfBoundsException("length cannot be greater than remaining bytes in the buffer");
- }
- position += length;
- return this;
- }
-
- @Override
- public Buffer clear() {
- position = 0;
- limit = -1;
- mark = -1;
- return this;
- }
-
- /**
- * Checks that the offset is within the bounds of the buffer.
- */
- protected void checkOffset(int offset) {
- if (offset(offset) < this.offset) {
- throw new IndexOutOfBoundsException();
- } else if (limit == -1) {
- if (offset > maxCapacity) {
- throw new IndexOutOfBoundsException();
- }
- } else {
- if (offset > limit) {
- throw new IndexOutOfBoundsException();
- }
- }
- }
-
- /**
- * Checks bounds for a slice.
- */
- protected int checkSlice(int offset, int length) {
- checkOffset(offset);
- if (limit == -1) {
- if (offset + length > capacity) {
- if (capacity < maxCapacity) {
- capacity(calculateCapacity(offset + length));
- } else {
- throw new BufferUnderflowException();
- }
- }
- } else {
- if (offset + length > limit) {
- throw new BufferUnderflowException();
- }
- }
- return offset(offset);
- }
-
- /**
- * Checks bounds for a read for the given length.
- */
- protected int checkRead(int length) {
- checkRead(position, length);
- int previousPosition = this.position;
- this.position = previousPosition + length;
- return offset(previousPosition);
- }
-
- /**
- * Checks bounds for a read.
- */
- protected int checkRead(int offset, int length) {
- checkOffset(offset);
- if (limit == -1) {
- if (offset + length > capacity) {
- if (capacity < maxCapacity) {
- if (this.offset + offset + length <= bytes.size()) {
- capacity = bytes.size() - this.offset;
- } else {
- capacity(calculateCapacity(offset + length));
- }
- } else {
- throw new BufferUnderflowException();
- }
- }
- } else {
- if (offset + length > limit) {
- throw new BufferUnderflowException();
- }
- }
- return offset(offset);
- }
-
- /**
- * Checks bounds for a write of the given length.
- */
- protected int checkWrite(int length) {
- checkWrite(position, length);
- int previousPosition = this.position;
- this.position = previousPosition + length;
- return offset(previousPosition);
- }
-
- /**
- * Checks bounds for a write.
- */
- protected int checkWrite(int offset, int length) {
- checkOffset(offset);
- if (limit == -1) {
- if (offset + length > capacity) {
- if (capacity < maxCapacity) {
- capacity(calculateCapacity(offset + length));
- } else {
- throw new BufferOverflowException();
- }
- }
- } else {
- if (offset + length > limit) {
- throw new BufferOverflowException();
- }
- }
- return offset(offset);
- }
-
- /**
- * Calculates the next capacity that meets the given minimum capacity.
- */
- private int calculateCapacity(int minimumCapacity) {
- int newCapacity = Math.min(Math.max(capacity, 2), minimumCapacity);
- while (newCapacity < Math.min(minimumCapacity, maxCapacity)) {
- newCapacity <<= 1;
- }
- return Math.min(newCapacity, maxCapacity);
- }
-
- @Override
- public Buffer zero() {
- bytes.zero(offset);
- return this;
- }
-
- @Override
- public Buffer zero(int offset) {
- checkOffset(offset);
- bytes.zero(offset(offset));
- return this;
- }
-
- @Override
- public Buffer zero(int offset, int length) {
- checkOffset(offset);
- bytes.zero(offset(offset), length);
- return this;
- }
-
- @Override
- public Buffer read(Buffer buffer) {
- int length = Math.min(buffer.remaining(), remaining());
- read(buffer.bytes(), buffer.offset() + buffer.position(), length);
- buffer.position(buffer.position() + length);
- return this;
- }
-
- @Override
- public Buffer read(Bytes bytes) {
- this.bytes.read(checkRead(bytes.size()), bytes, 0, bytes.size());
- return this;
- }
-
- @Override
- public Buffer read(Bytes bytes, int offset, int length) {
- this.bytes.read(checkRead(length), bytes, offset, length);
- return this;
- }
-
- @Override
- public Buffer read(int srcOffset, Bytes bytes, int dstOffset, int length) {
- this.bytes.read(checkRead(srcOffset, length), bytes, dstOffset, length);
- return this;
- }
-
- @Override
- public Buffer read(byte[] bytes) {
- this.bytes.read(checkRead(bytes.length), bytes, 0, bytes.length);
- return this;
- }
-
- @Override
- public Buffer read(byte[] bytes, int offset, int length) {
- this.bytes.read(checkRead(length), bytes, offset, length);
- return this;
- }
-
- @Override
- public Buffer read(int srcOffset, byte[] bytes, int dstOffset, int length) {
- this.bytes.read(checkRead(srcOffset, length), bytes, dstOffset, length);
- return this;
- }
-
- @Override
- public int readByte() {
- return bytes.readByte(checkRead(BYTE));
- }
-
- @Override
- public int readByte(int offset) {
- return bytes.readByte(checkRead(offset, BYTE));
- }
-
- @Override
- public int readUnsignedByte() {
- return bytes.readUnsignedByte(checkRead(BYTE));
- }
-
- @Override
- public int readUnsignedByte(int offset) {
- return bytes.readUnsignedByte(checkRead(offset, BYTE));
- }
-
- @Override
- public char readChar() {
- return bytes.readChar(checkRead(Bytes.CHARACTER));
- }
-
- @Override
- public char readChar(int offset) {
- return bytes.readChar(checkRead(offset, Bytes.CHARACTER));
- }
-
- @Override
- public short readShort() {
- return bytes.readShort(checkRead(SHORT));
- }
-
- @Override
- public short readShort(int offset) {
- return bytes.readShort(checkRead(offset, SHORT));
- }
-
- @Override
- public int readUnsignedShort() {
- return bytes.readUnsignedShort(checkRead(SHORT));
- }
-
- @Override
- public int readUnsignedShort(int offset) {
- return bytes.readUnsignedShort(checkRead(offset, SHORT));
- }
-
- @Override
- public int readMedium() {
- return bytes.readMedium(checkRead(3));
- }
-
- @Override
- public int readMedium(int offset) {
- return bytes.readMedium(checkRead(offset, 3));
- }
-
- @Override
- public int readUnsignedMedium() {
- return bytes.readUnsignedMedium(checkRead(3));
- }
-
- @Override
- public int readUnsignedMedium(int offset) {
- return bytes.readUnsignedMedium(checkRead(offset, 3));
- }
-
- @Override
- public int readInt() {
- return bytes.readInt(checkRead(Bytes.INTEGER));
- }
-
- @Override
- public int readInt(int offset) {
- return bytes.readInt(checkRead(offset, Bytes.INTEGER));
- }
-
- @Override
- public long readUnsignedInt() {
- return bytes.readUnsignedInt(checkRead(Bytes.INTEGER));
- }
-
- @Override
- public long readUnsignedInt(int offset) {
- return bytes.readUnsignedInt(checkRead(offset, Bytes.INTEGER));
- }
-
- @Override
- public long readLong() {
- return bytes.readLong(checkRead(Bytes.LONG));
- }
-
- @Override
- public long readLong(int offset) {
- return bytes.readLong(checkRead(offset, Bytes.LONG));
- }
-
- @Override
- public float readFloat() {
- return bytes.readFloat(checkRead(Bytes.FLOAT));
- }
-
- @Override
- public float readFloat(int offset) {
- return bytes.readFloat(checkRead(offset, Bytes.FLOAT));
- }
-
- @Override
- public double readDouble() {
- return bytes.readDouble(checkRead(Bytes.DOUBLE));
- }
-
- @Override
- public double readDouble(int offset) {
- return bytes.readDouble(checkRead(offset, Bytes.DOUBLE));
- }
-
- @Override
- public boolean readBoolean() {
- return bytes.readBoolean(checkRead(BYTE));
- }
-
- @Override
- public boolean readBoolean(int offset) {
- return bytes.readBoolean(checkRead(offset, BYTE));
- }
-
- @Override
- public String readString(Charset charset) {
- if (readBoolean(position)) {
- byte[] bytes = new byte[readUnsignedShort(position + BOOLEAN)];
- read(position + BOOLEAN + SHORT, bytes, 0, bytes.length);
- this.position += BOOLEAN + SHORT + bytes.length;
- return new String(bytes, charset);
- } else {
- this.position += BOOLEAN;
- }
- return null;
- }
-
- @Override
- public String readString(int offset, Charset charset) {
- if (readBoolean(offset)) {
- byte[] bytes = new byte[readUnsignedShort(offset + BOOLEAN)];
- read(offset + BOOLEAN + SHORT, bytes, 0, bytes.length);
- return new String(bytes, charset);
- }
- return null;
- }
-
- @Override
- public String readString() {
- return readString(Charset.defaultCharset());
- }
-
- @Override
- public String readString(int offset) {
- return readString(offset, Charset.defaultCharset());
- }
-
- @Override
- public String readUTF8() {
- return readString(StandardCharsets.UTF_8);
- }
-
- @Override
- public String readUTF8(int offset) {
- return readString(offset, StandardCharsets.UTF_8);
- }
-
- @Override
- public Buffer write(Buffer buffer) {
- int length = Math.min(buffer.remaining(), remaining());
- write(buffer.bytes(), buffer.offset() + buffer.position(), length);
- buffer.position(buffer.position() + length);
- return this;
- }
-
- @Override
- public Buffer write(Bytes bytes) {
- this.bytes.write(checkWrite(bytes.size()), bytes, 0, bytes.size());
- return this;
- }
-
- @Override
- public Buffer write(Bytes bytes, int offset, int length) {
- this.bytes.write(checkWrite(length), bytes, offset, length);
- return this;
- }
-
- @Override
- public Buffer write(int offset, Bytes bytes, int srcOffset, int length) {
- this.bytes.write(checkWrite(offset, length), bytes, srcOffset, length);
- return this;
- }
-
- @Override
- public Buffer write(byte[] bytes) {
- this.bytes.write(checkWrite(bytes.length), bytes, 0, bytes.length);
- return this;
- }
-
- @Override
- public Buffer write(byte[] bytes, int offset, int length) {
- this.bytes.write(checkWrite(length), bytes, offset, length);
- return this;
- }
-
- @Override
- public Buffer write(int offset, byte[] bytes, int srcOffset, int length) {
- this.bytes.write(checkWrite(offset, length), bytes, srcOffset, length);
- return this;
- }
-
- @Override
- public Buffer writeByte(int b) {
- bytes.writeByte(checkWrite(BYTE), b);
- return this;
- }
-
- @Override
- public Buffer writeByte(int offset, int b) {
- bytes.writeByte(checkWrite(offset, BYTE), b);
- return this;
- }
-
- @Override
- public Buffer writeUnsignedByte(int b) {
- bytes.writeUnsignedByte(checkWrite(BYTE), b);
- return this;
- }
-
- @Override
- public Buffer writeUnsignedByte(int offset, int b) {
- bytes.writeUnsignedByte(checkWrite(offset, BYTE), b);
- return this;
- }
-
- @Override
- public Buffer writeChar(char c) {
- bytes.writeChar(checkWrite(Bytes.CHARACTER), c);
- return this;
- }
-
- @Override
- public Buffer writeChar(int offset, char c) {
- bytes.writeChar(checkWrite(offset, Bytes.CHARACTER), c);
- return this;
- }
-
- @Override
- public Buffer writeShort(short s) {
- bytes.writeShort(checkWrite(SHORT), s);
- return this;
- }
-
- @Override
- public Buffer writeShort(int offset, short s) {
- bytes.writeShort(checkWrite(offset, SHORT), s);
- return this;
- }
-
- @Override
- public Buffer writeUnsignedShort(int s) {
- bytes.writeUnsignedShort(checkWrite(SHORT), s);
- return this;
- }
-
- @Override
- public Buffer writeUnsignedShort(int offset, int s) {
- bytes.writeUnsignedShort(checkWrite(offset, SHORT), s);
- return this;
- }
-
- @Override
- public Buffer writeMedium(int m) {
- bytes.writeMedium(checkWrite(3), m);
- return this;
- }
-
- @Override
- public Buffer writeMedium(int offset, int m) {
- bytes.writeMedium(checkWrite(offset, 3), m);
- return this;
- }
-
- @Override
- public Buffer writeUnsignedMedium(int m) {
- bytes.writeUnsignedMedium(checkWrite(3), m);
- return this;
- }
-
- @Override
- public Buffer writeUnsignedMedium(int offset, int m) {
- bytes.writeUnsignedMedium(checkWrite(offset, 3), m);
- return this;
- }
-
- @Override
- public Buffer writeInt(int i) {
- bytes.writeInt(checkWrite(Bytes.INTEGER), i);
- return this;
- }
-
- @Override
- public Buffer writeInt(int offset, int i) {
- bytes.writeInt(checkWrite(offset, Bytes.INTEGER), i);
- return this;
- }
-
- @Override
- public Buffer writeUnsignedInt(long i) {
- bytes.writeUnsignedInt(checkWrite(Bytes.INTEGER), i);
- return this;
- }
-
- @Override
- public Buffer writeUnsignedInt(int offset, long i) {
- bytes.writeUnsignedInt(checkWrite(offset, Bytes.INTEGER), i);
- return this;
- }
-
- @Override
- public Buffer writeLong(long l) {
- bytes.writeLong(checkWrite(Bytes.LONG), l);
- return this;
- }
-
- @Override
- public Buffer writeLong(int offset, long l) {
- bytes.writeLong(checkWrite(offset, Bytes.LONG), l);
- return this;
- }
-
- @Override
- public Buffer writeFloat(float f) {
- bytes.writeFloat(checkWrite(Bytes.FLOAT), f);
- return this;
- }
-
- @Override
- public Buffer writeFloat(int offset, float f) {
- bytes.writeFloat(checkWrite(offset, Bytes.FLOAT), f);
- return this;
- }
-
- @Override
- public Buffer writeDouble(double d) {
- bytes.writeDouble(checkWrite(Bytes.DOUBLE), d);
- return this;
- }
-
- @Override
- public Buffer writeDouble(int offset, double d) {
- bytes.writeDouble(checkWrite(offset, Bytes.DOUBLE), d);
- return this;
- }
-
- @Override
- public Buffer writeBoolean(boolean b) {
- bytes.writeBoolean(checkWrite(BYTE), b);
- return this;
- }
-
- @Override
- public Buffer writeBoolean(int offset, boolean b) {
- bytes.writeBoolean(checkWrite(offset, BYTE), b);
- return this;
- }
-
- @Override
- public Buffer writeString(String s, Charset charset) {
- if (s == null) {
- return writeBoolean(checkWrite(BOOLEAN), Boolean.FALSE);
- } else {
- byte[] bytes = s.getBytes(charset);
- checkWrite(position, BOOLEAN + SHORT + bytes.length);
- writeBoolean(Boolean.TRUE)
- .writeUnsignedShort(bytes.length)
- .write(bytes, 0, bytes.length);
- return this;
- }
- }
-
- @Override
- public Buffer writeString(int offset, String s, Charset charset) {
- if (s == null) {
- return writeBoolean(checkWrite(offset, BOOLEAN), Boolean.FALSE);
- } else {
- byte[] bytes = s.getBytes(charset);
- checkWrite(offset, BOOLEAN + SHORT + bytes.length);
- writeBoolean(offset, Boolean.TRUE)
- .writeUnsignedShort(offset + BOOLEAN, bytes.length)
- .write(offset + BOOLEAN + SHORT, bytes, 0, bytes.length);
- return this;
- }
- }
-
- @Override
- public Buffer writeString(String s) {
- return writeString(s, Charset.defaultCharset());
- }
-
- @Override
- public Buffer writeString(int offset, String s) {
- return writeString(offset, s, Charset.defaultCharset());
- }
-
- @Override
- public Buffer writeUTF8(String s) {
- return writeString(s, StandardCharsets.UTF_8);
- }
-
- @Override
- public Buffer writeUTF8(int offset, String s) {
- return writeString(offset, s, StandardCharsets.UTF_8);
- }
-
- @Override
- public Buffer flush() {
- bytes.flush();
- return this;
- }
-
- @Override
- public void close() {
- references.set(0);
- if (referenceManager != null) {
- referenceManager.release(this);
- } else {
- bytes.close();
- }
- }
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import java.nio.BufferOverflowException;
-import java.nio.BufferUnderflowException;
-import java.nio.ByteOrder;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-
-/**
- * Abstract bytes implementation.
- * <p>
- * This class provides common state and bounds checking functionality for all {@link Bytes} implementations.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public abstract class AbstractBytes implements Bytes {
- static final int MAX_SIZE = Integer.MAX_VALUE - 5;
-
- private boolean open = true;
- private SwappedBytes swap;
-
- /**
- * Checks whether the block is open.
- */
- protected void checkOpen() {
- if (!open) {
- throw new IllegalStateException("bytes not open");
- }
- }
-
- /**
- * Checks that the offset is within the bounds of the buffer.
- */
- protected void checkOffset(int offset) {
- checkOpen();
- if (offset < 0 || offset > size()) {
- throw new IndexOutOfBoundsException();
- }
- }
-
- /**
- * Checks bounds for a read.
- */
- protected int checkRead(int offset, int length) {
- checkOffset(offset);
- int position = offset + length;
- if (position > size()) {
- throw new BufferUnderflowException();
- }
- return position;
- }
-
- /**
- * Checks bounds for a write.
- */
- protected int checkWrite(int offset, int length) {
- checkOffset(offset);
- int position = offset + length;
- if (position > size()) {
- throw new BufferOverflowException();
- }
- return position;
- }
-
- @Override
- public boolean isDirect() {
- return false;
- }
-
- @Override
- public boolean isFile() {
- return false;
- }
-
- @Override
- public ByteOrder order() {
- return ByteOrder.BIG_ENDIAN;
- }
-
- @Override
- public Bytes order(ByteOrder order) {
- if (order == null) {
- throw new NullPointerException("order cannot be null");
- }
- if (order == order()) {
- return this;
- }
- if (swap != null) {
- return swap;
- }
- swap = new SwappedBytes(this);
- return swap;
- }
-
- @Override
- public boolean readBoolean(int offset) {
- return readByte(offset) == 1;
- }
-
- @Override
- public int readUnsignedByte(int offset) {
- return readByte(offset) & 0xFF;
- }
-
- @Override
- public int readUnsignedShort(int offset) {
- return readShort(offset) & 0xFFFF;
- }
-
- @Override
- public int readMedium(int offset) {
- return (readByte(offset)) << 16
- | (readByte(offset + 1) & 0xff) << 8
- | (readByte(offset + 2) & 0xff);
- }
-
- @Override
- public int readUnsignedMedium(int offset) {
- return (readByte(offset) & 0xff) << 16
- | (readByte(offset + 1) & 0xff) << 8
- | (readByte(offset + 2) & 0xff);
- }
-
- @Override
- public long readUnsignedInt(int offset) {
- return readInt(offset) & 0xFFFFFFFFL;
- }
-
- @Override
- public String readString(int offset) {
- return readString(offset, Charset.defaultCharset());
- }
-
- @Override
- public String readString(int offset, Charset charset) {
- if (readBoolean(offset)) {
- byte[] bytes = new byte[readUnsignedShort(offset + BYTE)];
- read(offset + BYTE + SHORT, bytes, 0, bytes.length);
- return new String(bytes, charset);
- }
- return null;
- }
-
- @Override
- public String readUTF8(int offset) {
- return readString(offset, StandardCharsets.UTF_8);
- }
-
- @Override
- public Bytes writeBoolean(int offset, boolean b) {
- return writeByte(offset, b ? 1 : 0);
- }
-
- @Override
- public Bytes writeUnsignedByte(int offset, int b) {
- return writeByte(offset, (byte) b);
- }
-
- @Override
- public Bytes writeUnsignedShort(int offset, int s) {
- return writeShort(offset, (short) s);
- }
-
- @Override
- public Bytes writeMedium(int offset, int m) {
- writeByte(offset, (byte) (m >>> 16));
- writeByte(offset + 1, (byte) (m >>> 8));
- writeByte(offset + 2, (byte) m);
- return this;
- }
-
- @Override
- public Bytes writeUnsignedMedium(int offset, int m) {
- return writeMedium(offset, m);
- }
-
- @Override
- public Bytes writeUnsignedInt(int offset, long i) {
- return writeInt(offset, (int) i);
- }
-
- @Override
- public Bytes writeString(int offset, String s) {
- return writeString(offset, s, Charset.defaultCharset());
- }
-
- @Override
- public Bytes writeString(int offset, String s, Charset charset) {
- if (s == null) {
- return writeBoolean(offset, Boolean.FALSE);
- } else {
- writeBoolean(offset, Boolean.TRUE);
- byte[] bytes = s.getBytes(charset);
- return writeUnsignedShort(offset + BYTE, bytes.length)
- .write(offset + BYTE + SHORT, bytes, 0, bytes.length);
- }
- }
-
- @Override
- public Bytes writeUTF8(int offset, String s) {
- return writeString(offset, s, StandardCharsets.UTF_8);
- }
-
- @Override
- public Bytes flush() {
- return this;
- }
-
- @Override
- public void close() {
- open = false;
- }
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import io.atomix.utils.concurrent.ReferenceCounted;
-
-import java.nio.ByteOrder;
-
-/**
- * Navigable byte buffer for input/output operations.
- * <p>
- * The byte buffer provides a fluent interface for reading bytes from and writing bytes to some underlying storage
- * implementation. The {@code Buffer} type is agnostic about the specific underlying storage implementation, but different
- * buffer implementations may be designed for specific storage layers.
- * <p>
- * Aside from the underlying storage implementation, this buffer works very similarly to Java's {@link java.nio.ByteBuffer}.
- * It intentionally exposes methods that can be easily understood by any developer with experience with {@code ByteBuffer}.
- * <p>
- * In order to support reading and writing from buffers, {@code Buffer} implementations maintain a series of pointers to
- * aid in navigating the buffer.
- * <p>
- * Most notable of these pointers is the {@code position}. When values are written to or read from the buffer, the
- * buffer increments its internal {@code position} according to the number of bytes read. This allows users to iterate
- * through the bytes in the buffer without maintaining external pointers.
- * <p>
- * <pre>
- * {@code
- * try (Buffer buffer = DirectBuffer.allocate(1024)) {
- * buffer.writeInt(1);
- * buffer.flip();
- * assert buffer.readInt() == 1;
- * }
- * }
- * </pre>
- * <p>
- * Buffers implement {@link ReferenceCounted} in order to keep track of the number of currently
- * held references to a given buffer. When a buffer is constructed, the buffer contains only {@code 1} reference. This
- * reference can be released via the {@link Buffer#close()} method which can be called automatically
- * by using a try-with-resources statement demonstrated above. Additional references to the buffer should be acquired via
- * {@link ReferenceCounted#acquire()} and released via
- * {@link ReferenceCounted#release}. Once all references to a buffer have been released - including
- * the initial reference - the memory will be freed (for in-memory buffers) and writes will be automatically flushed to
- * disk (for persistent buffers).
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public interface Buffer extends BytesInput<Buffer>, BufferInput<Buffer>, BytesOutput<Buffer>, BufferOutput<Buffer>, ReferenceCounted<Buffer> {
-
- /**
- * Returns whether the buffer has an array.
- *
- * @return Whether the buffer has an underlying array.
- */
- default boolean hasArray() {
- return false;
- }
-
- /**
- * Returns the underlying byte array.
- *
- * @return the underlying byte array
- * @throws UnsupportedOperationException if a heap array is not supported
- */
- default byte[] array() {
- throw new UnsupportedOperationException();
- }
-
- /**
- * Returns the byte order.
- * <p>
- * For consistency with {@link java.nio.ByteBuffer}, all buffer implementations are initially in {@link ByteOrder#BIG_ENDIAN} order.
- *
- * @return The byte order.
- */
- ByteOrder order();
-
- /**
- * Sets the byte order, returning a new swapped {@link Buffer} instance.
- * <p>
- * By default, all buffers are read and written in {@link ByteOrder#BIG_ENDIAN} order. This provides complete
- * consistency with {@link java.nio.ByteBuffer}. To flip buffers to {@link ByteOrder#LITTLE_ENDIAN} order, this
- * buffer's {@code Bytes} instance is decorated by a {@link SwappedBytes} instance which will reverse
- * read and written bytes using, e.g. {@link Integer#reverseBytes(int)}.
- *
- * @param order The byte order.
- * @return The updated buffer.
- */
- Buffer order(ByteOrder order);
-
- /**
- * Returns a boolean value indicating whether the buffer is a direct buffer.
- *
- * @return Indicates whether the buffer is a direct buffer.
- */
- boolean isDirect();
-
- /**
- * Returns a boolean value indicating whether the buffer is a read-only buffer.
- *
- * @return Indicates whether the buffer is a read-only buffer.
- */
- boolean isReadOnly();
-
- /**
- * Returns a boolean value indicating whether the buffer is backed by a file.
- *
- * @return Indicates whether the buffer is backed by a file.
- */
- boolean isFile();
-
- /**
- * Returns a read-only view of the buffer.
- * <p>
- * The returned buffer will share the underlying {@link Bytes} with which buffer, but the buffer's {@code limit},
- * {@code capacity}, and {@code position} will be independent of this buffer.
- *
- * @return A read-only buffer.
- */
- Buffer asReadOnlyBuffer();
-
- /**
- * Returns the buffer's starting offset within the underlying {@link Bytes}.
- * <p>
- * The offset is used to calculate the absolute position of the buffer's relative {@link Buffer#position() position}
- * within the underlying {@link Bytes}.
- *
- * @return The buffer's offset.
- */
- int offset();
-
- /**
- * Returns the buffer's capacity.
- * <p>
- * The capacity represents the total amount of storage space allocated to the buffer by the underlying storage
- * implementation. As bytes are written to the buffer, the buffer's capacity may grow up to {@link Buffer#maxCapacity()}.
- *
- * @return The buffer's capacity.
- */
- int capacity();
-
- /**
- * Sets the buffer's capacity.
- * <p>
- * The given capacity must be greater than the current {@link Buffer#capacity() capacity} and less than or equal to
- * {@link Buffer#maxCapacity()}. When the capacity is changed, the underlying {@link Bytes} will be resized via
- * {@link Bytes#resize(int)}.
- *
- * @param capacity The capacity to which to resize the buffer.
- * @return The resized buffer.
- * @throws IllegalArgumentException If the given {@code capacity} is less than the current {@code capacity}
- * or greater than {@link Buffer#maxCapacity()}
- */
- Buffer capacity(int capacity);
-
- /**
- * Returns the maximum allowed capacity for the buffer.
- * <p>
- * The maximum capacity is the limit up to which this buffer's {@link Buffer#capacity() capacity} can be expanded.
- * While the capacity grows, the maximum capacity is fixed from the moment the buffer is created and cannot change.
- *
- * @return The buffer's maximum capacity.
- */
- int maxCapacity();
-
- /**
- * Sets the buffer's current read/write position.
- * <p>
- * The position is an internal cursor that tracks where to write/read bytes in the underlying storage implementation.
- *
- * @param position The position to set.
- * @return This buffer.
- * @throws IllegalArgumentException If the given position is less than {@code 0} or more than {@link Buffer#limit()}
- */
- Buffer position(int position);
-
- /**
- * Returns the buffer's read/write limit.
- * <p>
- * The limit dictates the highest position to which bytes can be read from or written to the buffer. If the limit is
- * not explicitly set then it will always equal the buffer's {@link Buffer#maxCapacity() maxCapacity}. Note that the
- * limit may be set by related methods such as {@link Buffer#flip()}
- *
- * @return The buffer's limit.
- */
- int limit();
-
- /**
- * Sets the buffer's read/write limit.
- * <p>
- * The limit dictates the highest position to which bytes can be read from or written to the buffer. The limit must
- * be within the bounds of the buffer, i.e. greater than {@code 0} and less than or equal to {@link Buffer#capacity()}
- *
- * @param limit The limit to set.
- * @return This buffer.
- * @throws IllegalArgumentException If the given limit is less than {@code 0} or more than {@link Buffer#capacity()}
- */
- Buffer limit(int limit);
-
- /**
- * Returns the number of bytes remaining in the buffer until the {@link Buffer#limit()} is reached.
- * <p>
- * The bytes remaining is calculated by {@code buffer.limit() - buffer.position()}. If no limit is set on the buffer
- * then the {@link Buffer#maxCapacity() maxCapacity} will be used.
- *
- * @return The number of bytes remaining in the buffer.
- */
- @Override
- int remaining();
-
- /**
- * Returns a boolean indicating whether the buffer has bytes remaining.
- * <p>
- * If {@link Buffer#remaining()} is greater than {@code 0} then this method will return {@code true}, otherwise
- * {@code false}
- *
- * @return Indicates whether bytes are remaining in the buffer. {@code true} if {@link Buffer#remaining()} is
- * greater than {@code 0}, {@code false} otherwise.
- */
- @Override
- boolean hasRemaining();
-
- /**
- * Flips the buffer.
- * <p>
- * The limit is set to the current position and then the position is set to zero. If the mark is defined then it is discarded.
- * <pre>
- * {@code
- * assert buffer.writeLong(1234).flip().readLong() == 1234;
- * }
- * </pre>
- *
- * @return This buffer.
- */
- Buffer flip();
-
- /**
- * Sets a mark at the current position.
- * <p>
- * The mark is a simple internal reference to the buffer's current position. Marks can be used to reset the buffer
- * to a specific position after some operation.
- * <p>
- * <pre>
- * {@code
- * buffer.mark();
- * buffer.writeInt(1).writeBoolean(true);
- * buffer.reset();
- * assert buffer.readInt() == 1;
- * }
- * </pre>
- *
- * @return This buffer.
- */
- Buffer mark();
-
- /**
- * Resets the buffer's position to the previously-marked position.
- * <p>
- * Invoking this method neither changes nor discards the mark's value.
- *
- * @return This buffer.
- * @throws java.nio.InvalidMarkException If no mark is set.
- */
- Buffer reset();
-
- /**
- * Rewinds the buffer. The position is set to zero and the mark is discarded.
- *
- * @return This buffer.
- */
- Buffer rewind();
-
- /**
- * Advances the buffer's {@code position} {@code length} bytes.
- *
- * @param length The number of bytes to advance this buffer's {@code position}.
- * @return This buffer.
- * @throws IndexOutOfBoundsException If {@code length} is greater than {@link Buffer#remaining()}
- */
- @Override
- Buffer skip(int length);
-
- /**
- * Clears the buffer.
- * <p>
- * The position is set to zero, the limit is set to the capacity, and the mark is discarded.
- *
- * @return This buffer.
- */
- Buffer clear();
-
- /**
- * Compacts the buffer, moving bytes from the current position to the end of the buffer to the head of the buffer.
- *
- * @return This buffer.
- */
- Buffer compact();
-
- /**
- * Returns a duplicate of the buffer.
- *
- * @return A duplicate buffer.
- */
- Buffer duplicate();
-
- /**
- * Returns the bytes underlying the buffer.
- * <p>
- * The buffer is a wrapper around {@link Bytes} that handles writing sequences of bytes by tracking positions and
- * limits. This method returns the {@link Bytes} that this buffer wraps.
- *
- * @return The underlying bytes.
- */
- Bytes bytes();
-
- /**
- * Returns a view of this buffer starting at the current position.
- * <p>
- * The returned buffer will contain the same underlying {@link Bytes} instance as this buffer, but its pointers will
- * be offset by the current {@code position} of this buffer at the time the slice is created. Calls to
- * {@link Buffer#rewind()} and similar methods on the resulting {@link Buffer} will result in
- * the buffer's {@code position} being reset to the {@code position} of this buffer at the time the slice was created.
- * <p>
- * The returned buffer is reference counted separately from this buffer. Therefore, closing the returned buffer will
- * release the buffer back to the internal buffer poll and will not result in this buffer being closed. Users should
- * always call {@link Buffer#close()} once finished using the buffer slice.
- *
- * @return A slice of this buffer.
- * @see Buffer#slice(int)
- * @see Buffer#slice(int, int)
- */
- Buffer slice();
-
- /**
- * Returns a view of this buffer of the given length starting at the current position.
- * <p>
- * The returned buffer will contain the same underlying {@link Bytes} instance as this buffer, but its pointers will
- * be offset by the current {@code position} of this buffer at the time the slice is created. Calls to
- * {@link Buffer#rewind()} and similar methods on the resulting {@link Buffer} will result in
- * the buffer's {@code position} being reset to the {@code position} of this buffer at the time the slice was created.
- * <p>
- * The returned buffer is reference counted separately from this buffer. Therefore, closing the returned buffer will
- * release the buffer back to the internal buffer poll and will not result in this buffer being closed. Users should
- * always call {@link Buffer#close()} once finished using the buffer slice.
- *
- * @param length The length of the slice.
- * @return A slice of this buffer.
- * @see Buffer#slice()
- * @see Buffer#slice(int, int)
- */
- Buffer slice(int length);
-
- /**
- * Returns a view of this buffer starting at the given offset with the given length.
- * <p>
- * The returned buffer will contain the same underlying {@link Bytes} instance as this buffer, but its pointers will
- * be offset by the given {@code offset} and its length limited by the given {@code length}. Calls to
- * {@link Buffer#rewind()} and similar methods on the resulting {@link Buffer} will result in
- * the buffer's {@code position} being reset to the given {@code offset}.
- * <p>
- * The returned buffer is reference counted separately from this buffer. Therefore, closing the returned buffer will
- * release the buffer back to the internal buffer poll and will not result in this buffer being closed. Users should
- * always call {@link Buffer#close()} once finished using the buffer slice.
- *
- * @param offset The offset at which to begin the slice.
- * @param length The number of bytes in the slice.
- * @return The buffer slice.
- * @throws IndexOutOfBoundsException If the given offset is not contained within the bounds of this buffer
- * @throws java.nio.BufferUnderflowException If the length of the remaining bytes in the buffer is less than {@code length}
- * @see Buffer#slice()
- * @see Buffer#slice(int)
- */
- Buffer slice(int offset, int length);
-
- /**
- * Reads bytes into the given buffer.
- * <p>
- * Bytes will be read starting at the current buffer position until either {@link Buffer#limit()} has been reached.
- * If {@link Buffer#remaining()} is less than the {@link Buffer#remaining()} of the given buffer, a
- * {@link java.nio.BufferUnderflowException} will be thrown.
- *
- * @param buffer The buffer into which to read bytes.
- * @return The buffer.
- * @throws java.nio.BufferUnderflowException If the given {@link Buffer#remaining()} is greater than this buffer's
- * {@link Buffer#remaining()}
- */
- @Override
- Buffer read(Buffer buffer);
-
- /**
- * Reads bytes into the given byte array.
- * <p>
- * Bytes will be read starting at the current buffer position until either the byte array {@code length} or the
- * {@link Buffer#limit()} has been reached. If {@link Buffer#remaining()}
- * is less than the {@code length} of the given byte array, a {@link java.nio.BufferUnderflowException} will be
- * thrown.
- *
- * @param bytes The byte array into which to read bytes.
- * @return The buffer.
- * @throws java.nio.BufferUnderflowException If the given byte array's {@code length} is greater than
- * {@link Buffer#remaining()}
- * @see Buffer#read(Bytes, int, int)
- * @see Buffer#read(int, Bytes, int, int)
- */
- @Override
- Buffer read(Bytes bytes);
-
- /**
- * Reads bytes into the given byte array.
- * <p>
- * Bytes will be read starting at the current buffer position until either the byte array {@code length} or the
- * {@link Buffer#limit()} has been reached. If {@link Buffer#remaining()}
- * is less than the {@code length} of the given byte array, a {@link java.nio.BufferUnderflowException} will be
- * thrown.
- *
- * @param bytes The byte array into which to read bytes.
- * @return The buffer.
- * @throws java.nio.BufferUnderflowException If the given byte array's {@code length} is greater than
- * {@link Buffer#remaining()}
- * @see Buffer#read(byte[], int, int)
- * @see Buffer#read(int, byte[], int, int)
- */
- @Override
- Buffer read(byte[] bytes);
-
- /**
- * Reads bytes into the given byte array starting at the current position.
- * <p>
- * Bytes will be read from the current position up to the given length. If the provided {@code length} is
- * greater than {@link Buffer#remaining()} then a {@link java.nio.BufferUnderflowException} will
- * be thrown. If the {@code offset} is out of bounds of the buffer then an {@link IndexOutOfBoundsException}
- * will be thrown.
- *
- * @param bytes The byte array into which to read bytes.
- * @param dstOffset The offset at which to write bytes into the given buffer
- * @return The buffer.
- * @throws java.nio.BufferUnderflowException If {@code length} is greater than {@link Buffer#remaining()}
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer. Note that
- * bounds are determined by the buffer's {@link Buffer#limit()} rather than capacity.
- * @see Buffer#read(Bytes)
- * @see Buffer#read(int, Bytes, int, int)
- */
- @Override
- Buffer read(Bytes bytes, int dstOffset, int length);
-
- /**
- * Reads bytes into the given byte array starting at the given offset up to the given length.
- * <p>
- * Bytes will be read from the given starting offset up to the given length. If the provided {@code length} is
- * greater than {@link Buffer#limit() - srcOffset} then a {@link java.nio.BufferUnderflowException} will
- * be thrown. If the {@code srcOffset} is out of bounds of the buffer then an {@link IndexOutOfBoundsException}
- * will be thrown.
- *
- * @param srcOffset The offset from which to start reading bytes.
- * @param bytes The byte array into which to read bytes.
- * @param dstOffset The offset at which to write bytes into the given buffer
- * @return The buffer.
- * @throws java.nio.BufferUnderflowException If {@code length} is greater than {@link Buffer#remaining()}
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer. Note that
- * bounds are determined by the buffer's {@link Buffer#limit()} rather than capacity.
- * @see Buffer#read(Bytes)
- * @see Buffer#read(Bytes, int, int)
- */
- @Override
- Buffer read(int srcOffset, Bytes bytes, int dstOffset, int length);
-
- /**
- * Reads bytes into the given byte array starting at current position up to the given length.
- * <p>
- * Bytes will be read from the current position up to the given length. If the provided {@code length} is
- * greater than {@link Buffer#remaining()} then a {@link java.nio.BufferUnderflowException} will
- * be thrown. If the {@code offset} is out of bounds of the buffer then an {@link IndexOutOfBoundsException}
- * will be thrown.
- *
- * @param bytes The byte array into which to read bytes.
- * @param offset The offset at which to write bytes into the given buffer
- * @return The buffer.
- * @throws java.nio.BufferUnderflowException If {@code length} is greater than {@link Buffer#remaining()}
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer. Note that
- * bounds are determined by the buffer's {@link Buffer#limit()} rather than capacity.
- * @see Buffer#read(byte[])
- * @see Buffer#read(int, byte[], int, int)
- */
- @Override
- Buffer read(byte[] bytes, int offset, int length);
-
- /**
- * Reads bytes into the given byte array starting at the given offset up to the given length.
- * <p>
- * Bytes will be read from the given starting offset up to the given length. If the provided {@code length} is
- * greater than {@link Buffer#remaining()} then a {@link java.nio.BufferUnderflowException} will
- * be thrown. If the {@code offset} is out of bounds of the buffer then an {@link IndexOutOfBoundsException}
- * will be thrown.
- *
- * @param srcOffset The offset from which to start reading bytes.
- * @param bytes The byte array into which to read bytes.
- * @param dstOffset The offset at which to write bytes into the given buffer
- * @return The buffer.
- * @throws java.nio.BufferUnderflowException If {@code length} is greater than {@link Buffer#remaining()}
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer. Note that
- * bounds are determined by the buffer's {@link Buffer#limit()} rather than capacity.
- * @see Buffer#read(byte[])
- * @see Buffer#read(byte[], int, int)
- */
- @Override
- Buffer read(int srcOffset, byte[] bytes, int dstOffset, int length);
-
- /**
- * Reads a byte from the buffer at the current position.
- * <p>
- * When the byte is read from the buffer, the buffer's {@code position} will be advanced by {@link Bytes#BYTE}. If
- * there are no bytes remaining in the buffer then a {@link java.nio.BufferUnderflowException} will be thrown.
- *
- * @return The read byte.
- * @throws java.nio.BufferUnderflowException If {@link Buffer#remaining()} is less than {@link Bytes#BYTE}
- * @see Buffer#readByte(int)
- */
- @Override
- int readByte();
-
- /**
- * Reads a byte from the buffer at the given offset.
- * <p>
- * The byte will be read from the given offset. If the given index is out of the bounds of the buffer then a
- * {@link IndexOutOfBoundsException} will be thrown.
- *
- * @param offset The offset at which to read the byte.
- * @return The read byte.
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer. Note that
- * bounds are determined by the buffer's {@link Buffer#limit()} rather than capacity.
- * @see Buffer#readByte()
- */
- @Override
- int readByte(int offset);
-
- /**
- * Reads an unsigned byte from the buffer at the current position.
- * <p>
- * When the byte is read from the buffer, the buffer's {@code position} will be advanced by {@link Bytes#BYTE}. If
- * there are no bytes remaining in the buffer then a {@link java.nio.BufferUnderflowException} will be thrown.
- *
- * @return The read byte.
- * @throws java.nio.BufferUnderflowException If {@link Buffer#remaining()} is less than {@link Bytes#BYTE}
- * @see Buffer#readUnsignedByte(int)
- */
- @Override
- int readUnsignedByte();
-
- /**
- * Reads an unsigned byte from the buffer at the given offset.
- * <p>
- * The byte will be read from the given offset. If the given index is out of the bounds of the buffer then a
- * {@link IndexOutOfBoundsException} will be thrown.
- *
- * @param offset The offset at which to read the byte.
- * @return The read byte.
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer. Note that
- * bounds are determined by the buffer's {@link Buffer#limit()} rather than capacity.
- * @see Buffer#readUnsignedByte()
- */
- @Override
- int readUnsignedByte(int offset);
-
- /**
- * Reads a 16-bit character from the buffer at the current position.
- * <p>
- * When the character is read from the buffer, the buffer's {@code position} will be advanced by {@link Bytes#CHARACTER}.
- * If there are less than {@link Bytes#CHARACTER} bytes remaining in the buffer then a
- * {@link java.nio.BufferUnderflowException} will be thrown.
- *
- * @return The read character.
- * @throws java.nio.BufferUnderflowException If {@link Buffer#remaining()} is less than {@link Bytes#CHARACTER}
- * @see Buffer#readChar(int)
- */
- @Override
- char readChar();
-
- /**
- * Reads a 16-bit character from the buffer at the given offset.
- * <p>
- * The character will be read from the given offset. If the given index is out of the bounds of the buffer then a
- * {@link IndexOutOfBoundsException} will be thrown.
- *
- * @param offset The offset at which to read the character.
- * @return The read character.
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer. Note that
- * bounds are determined by the buffer's {@link Buffer#limit()} rather than capacity.
- * @see Buffer#readChar()
- */
- @Override
- char readChar(int offset);
-
- /**
- * Reads a 16-bit signed integer from the buffer at the current position.
- * <p>
- * When the short is read from the buffer, the buffer's {@code position} will be advanced by {@link Bytes#SHORT}.
- * If there are less than {@link Bytes#SHORT} bytes remaining in the buffer then a
- * {@link java.nio.BufferUnderflowException} will be thrown.
- *
- * @return The read short.
- * @throws java.nio.BufferUnderflowException If {@link Buffer#remaining()} is less than {@link Bytes#SHORT}
- * @see Buffer#readShort(int)
- */
- @Override
- short readShort();
-
- /**
- * Reads a 16-bit signed integer from the buffer at the given offset.
- * <p>
- * The short will be read from the given offset. If the given index is out of the bounds of the buffer then a
- * {@link IndexOutOfBoundsException} will be thrown.
- *
- * @param offset The offset at which to read the short.
- * @return The read short.
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer. Note that
- * bounds are determined by the buffer's {@link Buffer#limit()} rather than capacity.
- * @see Buffer#readShort()
- */
- @Override
- short readShort(int offset);
-
- /**
- * Reads a 16-bit unsigned integer from the buffer at the current position.
- * <p>
- * When the short is read from the buffer, the buffer's {@code position} will be advanced by {@link Bytes#SHORT}.
- * If there are less than {@link Bytes#SHORT} bytes remaining in the buffer then a
- * {@link java.nio.BufferUnderflowException} will be thrown.
- *
- * @return The read short.
- * @throws java.nio.BufferUnderflowException If {@link Buffer#remaining()} is less than {@link Bytes#SHORT}
- * @see Buffer#readUnsignedShort(int)
- */
- @Override
- int readUnsignedShort();
-
- /**
- * Reads a 16-bit unsigned integer from the buffer at the given offset.
- * <p>
- * The short will be read from the given offset. If the given index is out of the bounds of the buffer then a
- * {@link IndexOutOfBoundsException} will be thrown.
- *
- * @param offset The offset at which to read the short.
- * @return The read short.
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer. Note that
- * bounds are determined by the buffer's {@link Buffer#limit()} rather than capacity.
- * @see Buffer#readUnsignedShort()
- */
- @Override
- int readUnsignedShort(int offset);
-
- /**
- * Reads a 32-bit signed integer from the buffer at the current position.
- * <p>
- * When the integer is read from the buffer, the buffer's {@code position} will be advanced by {@link Bytes#INTEGER}.
- * If there are less than {@link Bytes#INTEGER} bytes remaining in the buffer then a
- * {@link java.nio.BufferUnderflowException} will be thrown.
- *
- * @return The read integer.
- * @throws java.nio.BufferUnderflowException If {@link Buffer#remaining()} is less than {@link Bytes#INTEGER}
- * @see Buffer#readInt(int)
- */
- @Override
- int readInt();
-
- /**
- * Reads a 32-bit signed integer from the buffer at the given offset.
- * <p>
- * The integer will be read from the given offset. If the given index is out of the bounds of the buffer then a
- * {@link IndexOutOfBoundsException} will be thrown.
- *
- * @param offset The offset at which to read the integer.
- * @return The read integer.
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer. Note that
- * bounds are determined by the buffer's {@link Buffer#limit()} rather than capacity.
- * @see Buffer#readInt()
- */
- @Override
- int readInt(int offset);
-
- /**
- * Reads a 32-bit unsigned integer from the buffer at the current position.
- * <p>
- * When the integer is read from the buffer, the buffer's {@code position} will be advanced by {@link Bytes#INTEGER}.
- * If there are less than {@link Bytes#INTEGER} bytes remaining in the buffer then a
- * {@link java.nio.BufferUnderflowException} will be thrown.
- *
- * @return The read integer.
- * @throws java.nio.BufferUnderflowException If {@link Buffer#remaining()} is less than {@link Bytes#INTEGER}
- * @see Buffer#readUnsignedInt(int)
- */
- @Override
- long readUnsignedInt();
-
- /**
- * Reads a 32-bit unsigned integer from the buffer at the given offset.
- * <p>
- * The integer will be read from the given offset. If the given index is out of the bounds of the buffer then a
- * {@link IndexOutOfBoundsException} will be thrown.
- *
- * @param offset The offset at which to read the integer.
- * @return The read integer.
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer. Note that
- * bounds are determined by the buffer's {@link Buffer#limit()} rather than capacity.
- * @see Buffer#readUnsignedInt()
- */
- @Override
- long readUnsignedInt(int offset);
-
- /**
- * Reads a 64-bit signed integer from the buffer at the current position.
- * <p>
- * When the long is read from the buffer, the buffer's {@code position} will be advanced by {@link Bytes#LONG}.
- * If there are less than {@link Bytes#LONG} bytes remaining in the buffer then a
- * {@link java.nio.BufferUnderflowException} will be thrown.
- *
- * @return The read long.
- * @throws java.nio.BufferUnderflowException If {@link Buffer#remaining()} is less than {@link Bytes#LONG}
- * @see Buffer#readLong(int)
- */
- @Override
- long readLong();
-
- /**
- * Reads a 64-bit signed integer from the buffer at the given offset.
- * <p>
- * The long will be read from the given offset. If the given index is out of the bounds of the buffer then a
- * {@link IndexOutOfBoundsException} will be thrown.
- *
- * @param offset The offset at which to read the long.
- * @return The read long.
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer. Note that
- * bounds are determined by the buffer's {@link Buffer#limit()} rather than capacity.
- * @see Buffer#readLong()
- */
- @Override
- long readLong(int offset);
-
- /**
- * Reads a single-precision 32-bit floating point number from the buffer at the current position.
- * <p>
- * When the float is read from the buffer, the buffer's {@code position} will be advanced by {@link Bytes#FLOAT}.
- * If there are less than {@link Bytes#FLOAT} bytes remaining in the buffer then a
- * {@link java.nio.BufferUnderflowException} will be thrown.
- *
- * @return The read float.
- * @throws java.nio.BufferUnderflowException If {@link Buffer#remaining()} is less than {@link Bytes#FLOAT}
- * @see Buffer#readFloat(int)
- */
- @Override
- float readFloat();
-
- /**
- * Reads a single-precision 32-bit floating point number from the buffer at the given offset.
- * <p>
- * The float will be read from the given offset. If the given index is out of the bounds of the buffer then a
- * {@link IndexOutOfBoundsException} will be thrown.
- *
- * @param offset The offset at which to read the float.
- * @return The read float.
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer. Note that
- * bounds are determined by the buffer's {@link Buffer#limit()} rather than capacity.
- * @see Buffer#readFloat()
- */
- @Override
- float readFloat(int offset);
-
- /**
- * Reads a double-precision 64-bit floating point number from the buffer at the current position.
- * <p>
- * When the double is read from the buffer, the buffer's {@code position} will be advanced by {@link Bytes#DOUBLE}.
- * If there are less than {@link Bytes#DOUBLE} bytes remaining in the buffer then a
- * {@link java.nio.BufferUnderflowException} will be thrown.
- *
- * @return The read double.
- * @throws java.nio.BufferUnderflowException If {@link Buffer#remaining()} is less than {@link Bytes#DOUBLE}
- * @see Buffer#readDouble(int)
- */
- @Override
- double readDouble();
-
- /**
- * Reads a double-precision 64-bit floating point number from the buffer at the given offset.
- * <p>
- * The double will be read from the given offset. If the given index is out of the bounds of the buffer then a
- * {@link IndexOutOfBoundsException} will be thrown.
- *
- * @param offset The offset at which to read the double.
- * @return The read double.
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer. Note that
- * bounds are determined by the buffer's {@link Buffer#limit()} rather than capacity.
- * @see Buffer#readDouble()
- */
- @Override
- double readDouble(int offset);
-
- /**
- * Reads a 1 byte boolean from the buffer at the current position.
- * <p>
- * When the boolean is read from the buffer, the buffer's {@code position} will be advanced by {@code 1}.
- * If there are no bytes remaining in the buffer then a {@link java.nio.BufferUnderflowException} will be thrown.
- *
- * @return The read boolean.
- * @throws java.nio.BufferUnderflowException If {@link Buffer#remaining()} is less than {@code 1}
- * @see Buffer#readBoolean(int)
- */
- @Override
- boolean readBoolean();
-
- /**
- * Reads a 1 byte boolean from the buffer at the given offset.
- * <p>
- * The boolean will be read from the given offset. If the given index is out of the bounds of the buffer then a
- * {@link IndexOutOfBoundsException} will be thrown.
- *
- * @param offset The offset at which to read the boolean.
- * @return The read boolean.
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer. Note that
- * bounds are determined by the buffer's {@link Buffer#limit()} rather than capacity.
- * @see Buffer#readBoolean()
- */
- @Override
- boolean readBoolean(int offset);
-
- /**
- * Reads a UTF-8 string from the buffer at the current position.
- * <p>
- * When the string is read from the buffer, the buffer's {@code position} will be advanced by 2 bytes plus the byte
- * length of the string. If there are no bytes remaining in the buffer then a {@link java.nio.BufferUnderflowException}
- * will be thrown.
- *
- * @return The read string.
- * @throws java.nio.BufferUnderflowException If {@link Buffer#remaining()} is less than {@code 1}
- * @see Buffer#readUTF8(int)
- */
- @Override
- String readUTF8();
-
- /**
- * Reads a UTF-8 string from the buffer at the given offset.
- * <p>
- * The string will be read from the given offset. If the given index is out of the bounds of the buffer then a
- * {@link IndexOutOfBoundsException} will be thrown.
- *
- * @param offset The offset at which to read the boolean.
- * @return The read string.
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer. Note that
- * bounds are determined by the buffer's {@link Buffer#limit()} rather than capacity.
- * @see Buffer#readUTF8()
- */
- @Override
- String readUTF8(int offset);
-
- /**
- * Writes a buffer to the buffer.
- * <p>
- * When the buffer is written to the buffer, the buffer's {@code position} will be advanced by the number of bytes
- * in the provided buffer. If the provided {@link Buffer#remaining()} exceeds {@link Buffer#remaining()} then an
- * {@link java.nio.BufferOverflowException} will be thrown.
- *
- * @param buffer The buffer to write.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If the given buffer's {@link Buffer#remaining()} bytes exceeds this buffer's
- * remaining bytes.
- */
- @Override
- Buffer write(Buffer buffer);
-
- /**
- * Writes an array of bytes to the buffer.
- * <p>
- * When the bytes are written to the buffer, the buffer's {@code position} will be advanced by the number of bytes
- * in the provided byte array. If the number of bytes exceeds {@link Buffer#limit()} then an
- * {@link java.nio.BufferOverflowException} will be thrown.
- *
- * @param bytes The array of bytes to write.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If the number of bytes exceeds the buffer's remaining bytes.
- * @see Buffer#write(Bytes, int, int)
- * @see Buffer#write(int, Bytes, int, int)
- */
- @Override
- Buffer write(Bytes bytes);
-
- /**
- * Writes an array of bytes to the buffer.
- * <p>
- * When the bytes are written to the buffer, the buffer's {@code position} will be advanced by the number of bytes
- * in the provided byte array. If the number of bytes exceeds {@link Buffer#limit()} then an
- * {@link java.nio.BufferOverflowException} will be thrown.
- *
- * @param bytes The array of bytes to write.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If the number of bytes exceeds the buffer's remaining bytes.
- * @see Buffer#write(byte[], int, int)
- * @see Buffer#write(int, byte[], int, int)
- */
- @Override
- Buffer write(byte[] bytes);
-
- /**
- * Writes an array of bytes to the buffer.
- * <p>
- * The bytes will be written starting at the current position up to the given length. If the length of the byte array
- * is larger than the provided {@code length} then only {@code length} bytes will be read from the array. If the
- * provided {@code length} is greater than the remaining bytes in this buffer then a {@link java.nio.BufferOverflowException}
- * will be thrown.
- *
- * @param bytes The array of bytes to write.
- * @param offset The offset at which to start writing the bytes.
- * @param length The number of bytes from the provided byte array to write to the buffer.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If there are not enough bytes remaining in the buffer.
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer.
- * @see Buffer#write(Bytes)
- * @see Buffer#write(int, Bytes, int, int)
- */
- @Override
- Buffer write(Bytes bytes, int offset, int length);
-
- /**
- * Writes an array of bytes to the buffer.
- * <p>
- * The bytes will be written starting at the given offset up to the given length. If the remaining bytes in the byte array
- * is larger than the provided {@code length} then only {@code length} bytes will be read from the array. If the
- * provided {@code length} is greater than {@link Buffer#limit()} minus {@code offset} then a
- * {@link java.nio.BufferOverflowException} will be thrown.
- *
- * @param offset The offset at which to start writing the bytes.
- * @param src The array of bytes to write.
- * @param srcOffset The offset at which to begin reading bytes from the source.
- * @param length The number of bytes from the provided byte array to write to the buffer.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If there are not enough bytes remaining in the buffer.
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer.
- * @see Buffer#write(Bytes)
- * @see Buffer#write(Bytes, int, int)
- */
- @Override
- Buffer write(int offset, Bytes src, int srcOffset, int length);
-
- /**
- * Writes an array of bytes to the buffer.
- * <p>
- * The bytes will be written starting at the current position up to the given length. If the length of the byte array
- * is larger than the provided {@code length} then only {@code length} bytes will be read from the array. If the
- * provided {@code length} is greater than the remaining bytes in this buffer then a {@link java.nio.BufferOverflowException}
- * will be thrown.
- *
- * @param bytes The array of bytes to write.
- * @param offset The offset at which to start writing the bytes.
- * @param length The number of bytes from the provided byte array to write to the buffer.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If there are not enough bytes remaining in the buffer.
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer.
- * @see Buffer#write(byte[])
- * @see Buffer#write(int, byte[], int, int)
- */
- @Override
- Buffer write(byte[] bytes, int offset, int length);
-
- /**
- * Writes an array of bytes to the buffer.
- * <p>
- * The bytes will be written starting at the given offset up to the given length. If the remaining bytes in the byte array
- * is larger than the provided {@code length} then only {@code length} bytes will be read from the array. If the
- * provided {@code length} is greater than {@link Buffer#limit()} minus {@code offset} then a
- * {@link java.nio.BufferOverflowException} will be thrown.
- *
- * @param offset The offset at which to start writing the bytes.
- * @param src The array of bytes to write.
- * @param srcOffset The offset at which to begin reading bytes from the source.
- * @param length The number of bytes from the provided byte array to write to the buffer.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If there are not enough bytes remaining in the buffer.
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer.
- * @see Buffer#write(byte[])
- * @see Buffer#write(byte[], int, int)
- */
- @Override
- Buffer write(int offset, byte[] src, int srcOffset, int length);
-
- /**
- * Writes a byte to the buffer at the current position.
- * <p>
- * When the byte is written to the buffer, the buffer's {@code position} will be advanced by {@link Bytes#BYTE}. If
- * there are no bytes remaining in the buffer then a {@link java.nio.BufferOverflowException} will be thrown.
- *
- * @param b The byte to write.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If there are no bytes remaining in the buffer.
- * @see Buffer#writeByte(int, int)
- */
- @Override
- Buffer writeByte(int b);
-
- /**
- * Writes a byte to the buffer at the given offset.
- * <p>
- * The byte will be written at the given offset. If there are no bytes remaining in the buffer then a
- * {@link java.nio.BufferOverflowException} will be thrown.
- *
- * @param offset The offset at which to write the byte.
- * @param b The byte to write.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If there are not enough bytes remaining in the buffer.
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer. Note that
- * bounds are determined by the buffer's {@link Buffer#limit()} rather than capacity.
- * @see Buffer#writeByte(int)
- */
- @Override
- Buffer writeByte(int offset, int b);
-
- /**
- * Writes an unsigned byte to the buffer at the current position.
- * <p>
- * When the byte is written to the buffer, the buffer's {@code position} will be advanced by {@link Bytes#BYTE}. If
- * there are no bytes remaining in the buffer then a {@link java.nio.BufferOverflowException} will be thrown.
- *
- * @param b The byte to write.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If there are no bytes remaining in the buffer.
- * @see Buffer#writeUnsignedByte(int, int)
- */
- @Override
- Buffer writeUnsignedByte(int b);
-
- /**
- * Writes an unsigned byte to the buffer at the given offset.
- * <p>
- * The byte will be written at the given offset. If there are no bytes remaining in the buffer then a
- * {@link java.nio.BufferOverflowException} will be thrown.
- *
- * @param offset The offset at which to write the byte.
- * @param b The byte to write.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If there are not enough bytes remaining in the buffer.
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer. Note that
- * bounds are determined by the buffer's {@link Buffer#limit()} rather than capacity.
- * @see Buffer#writeUnsignedByte(int)
- */
- @Override
- Buffer writeUnsignedByte(int offset, int b);
-
- /**
- * Writes a 16-bit character to the buffer at the current position.
- * <p>
- * When the character is written to the buffer, the buffer's {@code position} will be advanced by
- * {@link Bytes#CHARACTER}. If less than {@code 2} bytes are remaining in the buffer then a
- * {@link java.nio.BufferOverflowException} will be thrown.
- *
- * @param c The character to write.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If {@link Buffer#remaining()} is less than {@link Bytes#CHARACTER}.
- * @see Buffer#writeChar(int, char)
- */
- @Override
- Buffer writeChar(char c);
-
- /**
- * Writes a 16-bit character to the buffer at the given offset.
- * <p>
- * The character will be written at the given offset. If there are less than {@link Bytes#CHARACTER} bytes remaining
- * in the buffer then a {@link java.nio.BufferOverflowException} will be thrown.
- *
- * @param offset The offset at which to write the character.
- * @param c The character to write.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If {@link Buffer#remaining()} is less than {@link Bytes#CHARACTER}.
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer. Note that
- * bounds are determined by the buffer's {@link Buffer#limit()} rather than capacity.
- * @see Buffer#writeChar(char)
- */
- @Override
- Buffer writeChar(int offset, char c);
-
- /**
- * Writes a 16-bit signed integer to the buffer at the current position.
- * <p>
- * When the short is written to the buffer, the buffer's {@code position} will be advanced by {@link Bytes#SHORT}. If
- * less than {@link Bytes#SHORT} bytes are remaining in the buffer then a {@link java.nio.BufferOverflowException}
- * will be thrown.
- *
- * @param s The short to write.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If {@link Buffer#remaining()} is less than {@link Bytes#SHORT}.
- * @see Buffer#writeShort(int, short)
- */
- @Override
- Buffer writeShort(short s);
-
- /**
- * Writes a 16-bit signed integer to the buffer at the given offset.
- * <p>
- * The short will be written at the given offset. If there are less than {@link Bytes#SHORT} bytes remaining in the buffer
- * then a {@link java.nio.BufferOverflowException} will be thrown.
- *
- * @param offset The offset at which to write the short.
- * @param s The short to write.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If {@link Buffer#remaining()} is less than {@link Bytes#SHORT}.
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer. Note that
- * bounds are determined by the buffer's {@link Buffer#limit()} rather than capacity.
- * @see Buffer#writeShort(short)
- */
- @Override
- Buffer writeShort(int offset, short s);
-
- /**
- * Writes a 16-bit signed integer to the buffer at the current position.
- * <p>
- * When the short is written to the buffer, the buffer's {@code position} will be advanced by {@link Bytes#SHORT}. If
- * less than {@link Bytes#SHORT} bytes are remaining in the buffer then a {@link java.nio.BufferOverflowException}
- * will be thrown.
- *
- * @param s The short to write.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If {@link Buffer#remaining()} is less than {@link Bytes#SHORT}.
- * @see Buffer#writeUnsignedShort(int, int)
- */
- @Override
- Buffer writeUnsignedShort(int s);
-
- /**
- * Writes a 16-bit signed integer to the buffer at the given offset.
- * <p>
- * The short will be written at the given offset. If there are less than {@link Bytes#SHORT} bytes remaining in the buffer
- * then a {@link java.nio.BufferOverflowException} will be thrown.
- *
- * @param offset The offset at which to write the short.
- * @param s The short to write.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If {@link Buffer#remaining()} is less than {@link Bytes#SHORT}.
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer. Note that
- * bounds are determined by the buffer's {@link Buffer#limit()} rather than capacity.
- * @see Buffer#writeUnsignedShort(int)
- */
- @Override
- Buffer writeUnsignedShort(int offset, int s);
-
- /**
- * Writes a 32-bit signed integer to the buffer at the current position.
- * <p>
- * When the integer is written to the buffer, the buffer's {@code position} will be advanced by {@link Bytes#INTEGER}.
- * If less than {@link Bytes#INTEGER} bytes are remaining in the buffer then a {@link java.nio.BufferOverflowException}
- * will be thrown.
- *
- * @param i The integer to write.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If {@link Buffer#remaining()} is less than {@link Bytes#INTEGER}.
- * @see Buffer#writeInt(int, int)
- */
- @Override
- Buffer writeInt(int i);
-
- /**
- * Writes a 32-bit signed integer to the buffer at the given offset.
- * <p>
- * The integer will be written at the given offset. If there are less than {@link Bytes#INTEGER} bytes remaining
- * in the buffer then a {@link java.nio.BufferOverflowException} will be thrown.
- *
- * @param offset The offset at which to write the integer.
- * @param i The integer to write.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If {@link Buffer#remaining()} is less than {@link Bytes#INTEGER}.
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer. Note that
- * bounds are determined by the buffer's {@link Buffer#limit()} rather than capacity.
- * @see Buffer#writeInt(int)
- */
- @Override
- Buffer writeInt(int offset, int i);
-
- /**
- * Writes a 32-bit signed integer to the buffer at the current position.
- * <p>
- * When the integer is written to the buffer, the buffer's {@code position} will be advanced by {@link Bytes#INTEGER}.
- * If less than {@link Bytes#INTEGER} bytes are remaining in the buffer then a {@link java.nio.BufferOverflowException}
- * will be thrown.
- *
- * @param i The integer to write.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If {@link Buffer#remaining()} is less than {@link Bytes#INTEGER}.
- * @see Buffer#writeUnsignedInt(int, long)
- */
- @Override
- Buffer writeUnsignedInt(long i);
-
- /**
- * Writes a 32-bit signed integer to the buffer at the given offset.
- * <p>
- * The integer will be written at the given offset. If there are less than {@link Bytes#INTEGER} bytes remaining
- * in the buffer then a {@link java.nio.BufferOverflowException} will be thrown.
- *
- * @param offset The offset at which to write the integer.
- * @param i The integer to write.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If {@link Buffer#remaining()} is less than {@link Bytes#INTEGER}.
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer. Note that
- * bounds are determined by the buffer's {@link Buffer#limit()} rather than capacity.
- * @see Buffer#writeUnsignedInt(long)
- */
- @Override
- Buffer writeUnsignedInt(int offset, long i);
-
- /**
- * Writes a 64-bit signed integer to the buffer at the current position.
- * <p>
- * When the long is written to the buffer, the buffer's {@code position} will be advanced by {@link Bytes#LONG}.
- * If less than {@link Bytes#LONG} bytes are remaining in the buffer then a {@link java.nio.BufferOverflowException}
- * will be thrown.
- *
- * @param l The long to write.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If {@link Buffer#remaining()} is less than {@link Bytes#LONG}.
- * @see Buffer#writeLong(int, long)
- */
- @Override
- Buffer writeLong(long l);
-
- /**
- * Writes a 64-bit signed integer to the buffer at the given offset.
- * <p>
- * The long will be written at the given offset. If there are less than {@link Bytes#LONG} bytes remaining
- * in the buffer then a {@link java.nio.BufferOverflowException} will be thrown.
- *
- * @param offset The offset at which to write the long.
- * @param l The long to write.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If {@link Buffer#remaining()} is less than {@link Bytes#LONG}.
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer. Note that
- * bounds are determined by the buffer's {@link Buffer#limit()} rather than capacity.
- * @see Buffer#writeLong(long)
- */
- @Override
- Buffer writeLong(int offset, long l);
-
- /**
- * Writes a single-precision 32-bit floating point number to the buffer at the current position.
- * <p>
- * When the float is written to the buffer, the buffer's {@code position} will be advanced by {@link Bytes#FLOAT}.
- * If less than {@link Bytes#FLOAT} bytes are remaining in the buffer then a {@link java.nio.BufferOverflowException}
- * will be thrown.
- *
- * @param f The float to write.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If {@link Buffer#remaining()} is less than {@link Bytes#FLOAT}.
- * @see Buffer#writeFloat(int, float)
- */
- @Override
- Buffer writeFloat(float f);
-
- /**
- * Writes a single-precision 32-bit floating point number to the buffer at the given offset.
- * <p>
- * The float will be written at the given offset. If there are less than {@link Bytes#FLOAT} bytes remaining
- * in the buffer then a {@link java.nio.BufferOverflowException} will be thrown.
- *
- * @param offset The offset at which to write the float.
- * @param f The float to write.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If {@link Buffer#remaining()} is less than {@link Bytes#FLOAT}.
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer. Note that
- * bounds are determined by the buffer's {@link Buffer#limit()} rather than capacity.
- * @see Buffer#writeFloat(float)
- */
- @Override
- Buffer writeFloat(int offset, float f);
-
- /**
- * Writes a double-precision 64-bit floating point number to the buffer at the current position.
- * <p>
- * When the double is written to the buffer, the buffer's {@code position} will be advanced by {@link Bytes#DOUBLE}.
- * If less than {@link Bytes#DOUBLE} bytes are remaining in the buffer then a {@link java.nio.BufferOverflowException}
- * will be thrown.
- *
- * @param d The double to write.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If {@link Buffer#remaining()} is less than {@link Bytes#DOUBLE}.
- * @see Buffer#writeDouble(int, double)
- */
- @Override
- Buffer writeDouble(double d);
-
- /**
- * Writes a double-precision 64-bit floating point number to the buffer at the given offset.
- * <p>
- * The double will be written at the given offset. If there are less than {@link Bytes#DOUBLE} bytes remaining
- * in the buffer then a {@link java.nio.BufferOverflowException} will be thrown.
- *
- * @param offset The offset at which to write the double.
- * @param d The double to write.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If {@link Buffer#remaining()} is less than {@link Bytes#DOUBLE}.
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer. Note that
- * bounds are determined by the buffer's {@link Buffer#limit()} rather than capacity.
- * @see Buffer#writeDouble(double)
- */
- @Override
- Buffer writeDouble(int offset, double d);
-
- /**
- * Writes a 1 byte boolean to the buffer at the current position.
- * <p>
- * When the boolean is written to the buffer, the buffer's {@code position} will be advanced by {@code 1}.
- * If there are no bytes remaining in the buffer then a {@link java.nio.BufferOverflowException}
- * will be thrown.
- *
- * @param b The boolean to write.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If the number of bytes exceeds the buffer's remaining bytes.
- * @see Buffer#writeBoolean(int, boolean)
- */
- @Override
- Buffer writeBoolean(boolean b);
-
- /**
- * Writes a 1 byte boolean to the buffer at the given offset.
- * <p>
- * The boolean will be written as a single byte at the given offset. If there are no bytes remaining in the buffer
- * then a {@link java.nio.BufferOverflowException} will be thrown.
- *
- * @param offset The offset at which to write the boolean.
- * @param b The boolean to write.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If {@link Buffer#remaining()} is less than {@code 1}.
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer. Note that
- * bounds are determined by the buffer's {@link Buffer#limit()} rather than capacity.
- * @see Buffer#writeBoolean(boolean)
- */
- @Override
- Buffer writeBoolean(int offset, boolean b);
-
- /**
- * Writes a UTF-8 string to the buffer at the current position.
- * <p>
- * The string will be written with a two-byte unsigned byte length followed by the UTF-8 bytes. If there are not enough
- * bytes remaining in the buffer then a {@link java.nio.BufferOverflowException} will be thrown.
- *
- * @param s The string to write.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If the number of bytes exceeds the buffer's remaining bytes.
- * @see Buffer#writeUTF8(int, String)
- */
- @Override
- Buffer writeUTF8(String s);
-
- /**
- * Writes a UTF-8 string to the buffer at the given offset.
- * <p>
- * The string will be written with a two-byte unsigned byte length followed by the UTF-8 bytes. If there are not enough
- * bytes remaining in the buffer then a {@link java.nio.BufferOverflowException} will be thrown.
- *
- * @param offset The offset at which to write the string.
- * @param s The string to write.
- * @return The written buffer.
- * @throws java.nio.BufferOverflowException If {@link Buffer#remaining()} is less than {@code 1}.
- * @throws IndexOutOfBoundsException If the given offset is out of the bounds of the buffer. Note that
- * bounds are determined by the buffer's {@link Buffer#limit()} rather than capacity.
- * @see Buffer#writeUTF8(String)
- */
- @Override
- Buffer writeUTF8(int offset, String s);
-
- /**
- * Closes the buffer.
- * <p>
- * This method effectively acts as an alias to {@link Buffer#release()} and allows buffers to
- * be used as resources in try-with-resources statements. When the buffer is closed the internal reference counter
- * defined by {@link ReferenceCounted} will be decremented. However, if references to the
- * buffer still exist then those references will be allowed to continue to operate on the buffer until all references
- * have been released.
- */
- @Override
- void close();
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-/**
- * Buffer allocator.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public interface BufferAllocator {
-
- /**
- * Allocates a dynamic capacity buffer.
- *
- * @return The allocated buffer.
- */
- Buffer allocate();
-
- /**
- * Allocates a dynamic capacity buffer with the given initial capacity.
- *
- * @param initialCapacity The initial buffer capacity.
- * @return The allocated buffer.
- */
- Buffer allocate(int initialCapacity);
-
- /**
- * Allocates a new buffer.
- *
- * @param initialCapacity The initial buffer capacity.
- * @param maxCapacity The maximum buffer capacity.
- * @return The allocated buffer.
- */
- Buffer allocate(int initialCapacity, int maxCapacity);
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import java.nio.charset.Charset;
-import java.util.function.Function;
-
-/**
- * Readable buffer.
- * <p>
- * This interface exposes methods for reading from a byte buffer. Readable buffers maintain a small amount of state
- * regarding current cursor positions and limits similar to the behavior of {@link java.nio.ByteBuffer}.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public interface BufferInput<T extends BufferInput<?>> extends AutoCloseable {
-
- /**
- * Returns the buffer's current read/write position.
- * <p>
- * The position is an internal cursor that tracks where to write/read bytes in the underlying storage implementation.
- * As bytes are written to or read from the buffer, the position will advance based on the number of bytes read.
- *
- * @return The buffer's current position.
- */
- int position();
-
- /**
- * Returns the number of bytes remaining in the input.
- *
- * @return The number of bytes remaining in the input.
- */
- int remaining();
-
- /**
- * Returns a boolean value indicating whether the input has bytes remaining.
- *
- * @return Indicates whether bytes remain to be read from the input.
- */
- boolean hasRemaining();
-
- /**
- * Skips the given number of bytes in the input.
- *
- * @param bytes The number of bytes to attempt to skip.
- * @return The skipped input.
- */
- T skip(int bytes);
-
- /**
- * Reads bytes into the given byte array.
- *
- * @param bytes The byte array into which to read bytes.
- * @return The buffer.
- */
- T read(Bytes bytes);
-
- /**
- * Reads bytes into the given byte array.
- *
- * @param bytes The byte array into which to read bytes.
- * @return The buffer.
- */
- T read(byte[] bytes);
-
- /**
- * Reads bytes into the given byte array starting at the current position.
- *
- * @param bytes The byte array into which to read bytes.
- * @param offset The offset at which to write bytes into the given buffer
- * @return The buffer.
- */
- T read(Bytes bytes, int offset, int length);
-
- /**
- * Reads bytes into the given byte array starting at current position up to the given length.
- *
- * @param bytes The byte array into which to read bytes.
- * @param offset The offset at which to write bytes into the given buffer
- * @return The buffer.
- */
- T read(byte[] bytes, int offset, int length);
-
- /**
- * Reads bytes into the given buffer.
- *
- * @param buffer The buffer into which to read bytes.
- * @return The buffer.
- */
- T read(Buffer buffer);
-
- /**
- * Reads an object from the buffer.
- *
- * @param decoder the object decoder
- * @param <U> the type of the object to read
- * @return the read object.
- */
- default <U> U readObject(Function<byte[], U> decoder) {
- byte[] bytes = readBytes(readInt());
- return decoder.apply(bytes);
- }
-
- /**
- * Reads a byte array.
- *
- * @param length The byte array length
- * @return The read byte array.
- */
- default byte[] readBytes(int length) {
- byte[] bytes = new byte[length];
- read(bytes);
- return bytes;
- }
-
- /**
- * Reads a byte from the buffer at the current position.
- *
- * @return The read byte.
- */
- int readByte();
-
- /**
- * Reads an unsigned byte from the buffer at the current position.
- *
- * @return The read byte.
- */
- int readUnsignedByte();
-
- /**
- * Reads a 16-bit character from the buffer at the current position.
- *
- * @return The read character.
- */
- char readChar();
-
- /**
- * Reads a 16-bit signed integer from the buffer at the current position.
- *
- * @return The read short.
- */
- short readShort();
-
- /**
- * Reads a 16-bit unsigned integer from the buffer at the current position.
- *
- * @return The read short.
- */
- int readUnsignedShort();
-
- /**
- * Reads a 24-bit signed integer from the buffer at the current position.
- *
- * @return The read integer.
- */
- int readMedium();
-
- /**
- * Reads a 24-bit unsigned integer from the buffer at the current position.
- *
- * @return The read integer.
- */
- int readUnsignedMedium();
-
- /**
- * Reads a 32-bit signed integer from the buffer at the current position.
- *
- * @return The read integer.
- */
- int readInt();
-
- /**
- * Reads a 32-bit unsigned integer from the buffer at the current position.
- *
- * @return The read integer.
- */
- long readUnsignedInt();
-
- /**
- * Reads a 64-bit signed integer from the buffer at the current position.
- *
- * @return The read long.
- */
- long readLong();
-
- /**
- * Reads a single-precision 32-bit floating point number from the buffer at the current position.
- *
- * @return The read float.
- */
- float readFloat();
-
- /**
- * Reads a double-precision 64-bit floating point number from the buffer at the current position.
- *
- * @return The read double.
- */
- double readDouble();
-
- /**
- * Reads a 1 byte boolean from the buffer at the current position.
- *
- * @return The read boolean.
- */
- boolean readBoolean();
-
- /**
- * Reads a string from the buffer at the current position.
- *
- * @return The read string.
- */
- String readString();
-
- /**
- * Reads a string from the buffer at the current position.
- *
- * @param charset The character set with which to decode the string.
- * @return The read string.
- */
- String readString(Charset charset);
-
- /**
- * Reads a UTF-8 string from the buffer at the current position.
- *
- * @return The read string.
- */
- String readUTF8();
-
- @Override
- void close();
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import java.nio.charset.Charset;
-import java.util.function.Function;
-
-/**
- * Writable buffer.
- * <p>
- * This interface exposes methods for writing to a byte buffer. Writable buffers maintain a small amount of state
- * regarding current cursor positions and limits similar to the behavior of {@link java.nio.ByteBuffer}.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public interface BufferOutput<T extends BufferOutput<?>> extends AutoCloseable {
-
- /**
- * Writes an array of bytes to the buffer.
- *
- * @param bytes The array of bytes to write.
- * @return The written buffer.
- */
- T write(Bytes bytes);
-
- /**
- * Writes an array of bytes to the buffer.
- *
- * @param bytes The array of bytes to write.
- * @return The written buffer.
- */
- T write(byte[] bytes);
-
- /**
- * Writes an array of bytes to the buffer.
- *
- * @param bytes The array of bytes to write.
- * @param offset The offset at which to start writing the bytes.
- * @param length The number of bytes from the provided byte array to write to the buffer.
- * @return The written buffer.
- */
- T write(Bytes bytes, int offset, int length);
-
- /**
- * Writes an array of bytes to the buffer.
- *
- * @param bytes The array of bytes to write.
- * @param offset The offset at which to start writing the bytes.
- * @param length The number of bytes from the provided byte array to write to the buffer.
- * @return The written buffer.
- */
- T write(byte[] bytes, int offset, int length);
-
- /**
- * Writes a buffer to the buffer.
- *
- * @param buffer The buffer to write.
- * @return The written buffer.
- */
- T write(Buffer buffer);
-
- /**
- * Writes an object to the snapshot.
- *
- * @param object the object to write
- * @param encoder the object encoder
- * @return The snapshot writer.
- */
- @SuppressWarnings("unchecked")
- default <U> T writeObject(U object, Function<U, byte[]> encoder) {
- byte[] bytes = encoder.apply(object);
- writeInt(bytes.length).write(bytes);
- return (T) this;
- }
-
- /**
- * Writes a byte array.
- *
- * @param bytes The byte array to write.
- * @return The written buffer.
- */
- @SuppressWarnings("unchecked")
- default T writeBytes(byte[] bytes) {
- write(bytes);
- return (T) this;
- }
-
- /**
- * Writes a byte to the buffer.
- *
- * @param b The byte to write.
- * @return The written buffer.
- */
- T writeByte(int b);
-
- /**
- * Writes an unsigned byte to the buffer.
- *
- * @param b The byte to write.
- * @return The written buffer.
- */
- T writeUnsignedByte(int b);
-
- /**
- * Writes a 16-bit character to the buffer.
- *
- * @param c The character to write.
- * @return The written buffer.
- */
- T writeChar(char c);
-
- /**
- * Writes a 16-bit signed integer to the buffer.
- *
- * @param s The short to write.
- * @return The written buffer.
- */
- T writeShort(short s);
-
- /**
- * Writes a 16-bit unsigned integer to the buffer.
- *
- * @param s The short to write.
- * @return The written buffer.
- */
- T writeUnsignedShort(int s);
-
- /**
- * Writes a 24-bit signed integer to the buffer.
- *
- * @param m The integer to write.
- * @return The written buffer.
- */
- T writeMedium(int m);
-
- /**
- * Writes a 24-bit unsigned integer to the buffer.
- *
- * @param m The integer to write.
- * @return The written buffer.
- */
- T writeUnsignedMedium(int m);
-
- /**
- * Writes a 32-bit signed integer to the buffer.
- *
- * @param i The integer to write.
- * @return The written buffer.
- */
- T writeInt(int i);
-
- /**
- * Writes a 32-bit unsigned integer to the buffer.
- *
- * @param i The integer to write.
- * @return The written buffer.
- */
- T writeUnsignedInt(long i);
-
- /**
- * Writes a 64-bit signed integer to the buffer.
- *
- * @param l The long to write.
- * @return The written buffer.
- */
- T writeLong(long l);
-
- /**
- * Writes a single-precision 32-bit floating point number to the buffer.
- *
- * @param f The float to write.
- * @return The written buffer.
- */
- T writeFloat(float f);
-
- /**
- * Writes a double-precision 64-bit floating point number to the buffer.
- *
- * @param d The double to write.
- * @return The written buffer.
- */
- T writeDouble(double d);
-
- /**
- * Writes a 1 byte boolean to the buffer.
- *
- * @param b The boolean to write.
- * @return The written buffer.
- */
- T writeBoolean(boolean b);
-
- /**
- * Writes a string to the buffer.
- *
- * @param s The string to write.
- * @return The written buffer.
- */
- T writeString(String s);
-
- /**
- * Writes a string to the buffer.
- *
- * @param s The string to write.
- * @param charset The character set with which to encode the string.
- * @return The written buffer.
- */
- T writeString(String s, Charset charset);
-
- /**
- * Writes a UTF-8 string to the buffer.
- *
- * @param s The string to write.
- * @return The written buffer.
- */
- T writeUTF8(String s);
-
- /**
- * Flushes the buffer to the underlying persistence layer.
- *
- * @return The flushed buffer.
- */
- T flush();
-
- @Override
- void close();
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import io.atomix.utils.concurrent.ReferenceFactory;
-import io.atomix.utils.concurrent.ReferencePool;
-
-/**
- * Buffer pool.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public class BufferPool extends ReferencePool<Buffer> {
-
- public BufferPool(ReferenceFactory<Buffer> factory) {
- super(factory);
- }
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import io.atomix.utils.concurrent.ReferenceManager;
-
-/**
- * {@link java.nio.ByteBuffer} based buffer.
- */
-public abstract class ByteBufferBuffer extends AbstractBuffer {
- protected final ByteBufferBytes bytes;
-
- public ByteBufferBuffer(ByteBufferBytes bytes, ReferenceManager<Buffer> referenceManager) {
- super(bytes, referenceManager);
- this.bytes = bytes;
- }
-
- public ByteBufferBuffer(ByteBufferBytes bytes, int offset, int initialCapacity, int maxCapacity, ReferenceManager<Buffer> referenceManager) {
- super(bytes, offset, initialCapacity, maxCapacity, referenceManager);
- this.bytes = bytes;
- }
-
- @Override
- public byte[] array() {
- return bytes.array();
- }
-
- @Override
- protected void compact(int from, int to, int length) {
- byte[] bytes = new byte[1024];
- int position = from;
- while (position < from + length) {
- int size = Math.min((from + length) - position, 1024);
- this.bytes.read(position, bytes, 0, size);
- this.bytes.write(0, bytes, 0, size);
- position += size;
- }
- }
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * 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 = checkNotNull(buffer, "buffer cannot be null");
- return this;
- }
-
- /**
- * Allocates a new byte buffer.
- *
- * @param size the buffer size
- * @return a newly allocated byte buffer
- */
- protected abstract ByteBuffer newByteBuffer(int size);
-
- @Override
- public Bytes resize(int newSize) {
- ByteBuffer oldBuffer = buffer;
- ByteBuffer newBuffer = newByteBuffer(newSize);
- oldBuffer.position(0).limit(oldBuffer.capacity());
- newBuffer.position(0).limit(newBuffer.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 int 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(int offset) {
- return (int) offset;
- }
-
- @Override
- public Bytes zero(int offset) {
- for (int i = index(offset); i < buffer.capacity(); i++) {
- buffer.put(i, (byte) 0);
- }
- return this;
- }
-
- @Override
- public Bytes zero(int offset, int length) {
- for (int i = index(offset); i < offset + length; i++) {
- buffer.put(i, (byte) 0);
- }
- return this;
- }
-
- @Override
- public Bytes read(int position, byte[] bytes, int offset, int length) {
- for (int i = 0; i < length; i++) {
- bytes[index(offset) + i] = (byte) readByte(position + i);
- }
- return this;
- }
-
- @Override
- public Bytes read(int position, Bytes bytes, int offset, int length) {
- for (int i = 0; i < length; i++) {
- bytes.writeByte(offset + i, readByte(position + i));
- }
- return this;
- }
-
- @Override
- public Bytes write(int position, byte[] bytes, int offset, int length) {
- for (int i = 0; i < length; i++) {
- buffer.put((int) position + i, (byte) bytes[index(offset) + i]);
- }
- return this;
- }
-
- @Override
- public Bytes write(int position, Bytes bytes, int offset, int length) {
- for (int i = 0; i < length; i++) {
- buffer.put((int) position + i, (byte) bytes.readByte(offset + i));
- }
- return this;
- }
-
- @Override
- public int readByte(int offset) {
- return buffer.get(index(offset));
- }
-
- @Override
- public char readChar(int offset) {
- return buffer.getChar(index(offset));
- }
-
- @Override
- public short readShort(int offset) {
- return buffer.getShort(index(offset));
- }
-
- @Override
- public int readInt(int offset) {
- return buffer.getInt(index(offset));
- }
-
- @Override
- public long readLong(int offset) {
- return buffer.getLong(index(offset));
- }
-
- @Override
- public float readFloat(int offset) {
- return buffer.getFloat(index(offset));
- }
-
- @Override
- public double readDouble(int offset) {
- return buffer.getDouble(index(offset));
- }
-
- @Override
- public Bytes writeByte(int offset, int b) {
- buffer.put(index(offset), (byte) b);
- return this;
- }
-
- @Override
- public Bytes writeChar(int offset, char c) {
- buffer.putChar(index(offset), c);
- return this;
- }
-
- @Override
- public Bytes writeShort(int offset, short s) {
- buffer.putShort(index(offset), s);
- return this;
- }
-
- @Override
- public Bytes writeInt(int offset, int i) {
- buffer.putInt(index(offset), i);
- return this;
- }
-
- @Override
- public Bytes writeLong(int offset, long l) {
- buffer.putLong(index(offset), l);
- return this;
- }
-
- @Override
- public Bytes writeFloat(int offset, float f) {
- buffer.putFloat(index(offset), f);
- return this;
- }
-
- @Override
- public Bytes writeDouble(int offset, double d) {
- buffer.putDouble(index(offset), d);
- return this;
- }
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import java.nio.ByteOrder;
-
-/**
- * Common interface for interacting with a memory or disk based array of bytes.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public interface Bytes extends BytesInput<Bytes>, BytesOutput<Bytes>, AutoCloseable {
- int BYTE = 1;
- int BOOLEAN = 1;
- int CHARACTER = 2;
- int SHORT = 2;
- int MEDIUM = 3;
- int INTEGER = 4;
- int LONG = 8;
- int FLOAT = 4;
- int DOUBLE = 8;
-
- /**
- * Returns whether the bytes has an array.
- *
- * @return Whether the bytes has an underlying array.
- */
- default boolean hasArray() {
- return false;
- }
-
- /**
- * Returns the underlying byte array.
- *
- * @return the underlying byte array
- * @throws UnsupportedOperationException if a heap array is not supported
- */
- default byte[] array() {
- throw new UnsupportedOperationException();
- }
-
- /**
- * Returns the count of the bytes.
- *
- * @return The count of the bytes.
- */
- int size();
-
- /**
- * Resizes the bytes.
- * <p>
- * When the bytes are resized, underlying memory addresses in copies of this instance may no longer be valid. Additionally,
- * if the {@code newSize} is smaller than the current {@code count} then some data may be lost during the resize. Use
- * with caution.
- *
- * @param newSize The count to which to resize this instance.
- * @return The resized bytes.
- */
- Bytes resize(int newSize);
-
- /**
- * Returns the byte order.
- * <p>
- * For consistency with {@link java.nio.ByteBuffer}, all bytes implementations are initially in {@link ByteOrder#BIG_ENDIAN} order.
- *
- * @return The byte order.
- */
- ByteOrder order();
-
- /**
- * Sets the byte order, returning a new swapped {@link Bytes} instance.
- * <p>
- * By default, all bytes are read and written in {@link ByteOrder#BIG_ENDIAN} order. This provides complete
- * consistency with {@link java.nio.ByteBuffer}. To flip bytes to {@link ByteOrder#LITTLE_ENDIAN} order, this
- * {@code Bytes} instance is decorated by a {@link SwappedBytes} instance which will reverse
- * read and written bytes using, e.g. {@link Integer#reverseBytes(int)}.
- *
- * @param order The byte order.
- * @return The updated bytes.
- * @throws NullPointerException If the {@code order} is {@code null}
- */
- Bytes order(ByteOrder order);
-
- /**
- * Returns a boolean value indicating whether the bytes are direct.
- *
- * @return Indicates whether the bytes are direct.
- */
- boolean isDirect();
-
- /**
- * Returns a boolean value indicating whether the bytes are backed by a file.
- *
- * @return Indicates whether the bytes are backed by a file.
- */
- boolean isFile();
-
- @Override
- void close();
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import java.nio.charset.Charset;
-
-/**
- * Readable bytes.
- * <p>
- * This interface exposes methods for reading bytes from specific positions in a byte array.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public interface BytesInput<T extends BytesInput<T>> {
-
- /**
- * Reads bytes into the given byte array starting at the given offset up to the given length.
- *
- * @param offset The offset from which to start reading bytes.
- * @param dst The byte array into which to read bytes.
- * @param dstOffset The offset at which to write bytes into the given buffer.
- * @param length The total number of bytes to read.
- * @return The buffer.
- */
- T read(int offset, Bytes dst, int dstOffset, int length);
-
- /**
- * Reads bytes into the given byte array starting at the given offset up to the given length.
- *
- * @param offset The offset from which to start reading bytes.
- * @param dst The byte array into which to read bytes.
- * @param dstOffset The offset at which to write bytes into the given buffer
- * @param length The total number of bytes to read.
- * @return The buffer.
- */
- T read(int offset, byte[] dst, int dstOffset, int length);
-
- /**
- * Reads a byte from the buffer at the given offset.
- *
- * @param offset The offset at which to read the byte.
- * @return The read byte.
- */
- int readByte(int offset);
-
- /**
- * Reads an unsigned byte from the buffer at the given offset.
- *
- * @param offset The offset at which to read the byte.
- * @return The read unsigned byte.
- */
- int readUnsignedByte(int offset);
-
- /**
- * Reads a 16-bit character from the buffer at the given offset.
- *
- * @param offset The offset at which to read the character.
- * @return The read character.
- */
- char readChar(int offset);
-
- /**
- * Reads a 16-bit signed integer from the buffer at the given offset.
- *
- * @param offset The offset at which to read the short.
- * @return The read short.
- */
- short readShort(int offset);
-
- /**
- * Reads a 16-bit unsigned integer from the buffer at the given offset.
- *
- * @param offset The offset at which to read the short.
- * @return The read short.
- */
- int readUnsignedShort(int offset);
-
- /**
- * Reads a 24-bit signed integer from the buffer at the given offset.
- *
- * @param offset The offset at which to read the integer.
- * @return The read medium.
- */
- int readMedium(int offset);
-
- /**
- * Reads a 24-bin unsigned integer from the buffer at the given offset.
- *
- * @param offset The offset at which to read the integer.
- * @return The read medium.
- */
- int readUnsignedMedium(int offset);
-
- /**
- * Reads a 32-bit signed integer from the buffer at the given offset.
- *
- * @param offset The offset at which to read the integer.
- * @return The read integer.
- */
- int readInt(int offset);
-
- /**
- * Reads a 32-bit unsigned integer from the buffer at the given offset.
- *
- * @param offset The offset at which to read the integer.
- * @return The read integer.
- */
- long readUnsignedInt(int offset);
-
- /**
- * Reads a 64-bit signed integer from the buffer at the given offset.
- *
- * @param offset The offset at which to read the long.
- * @return The read long.
- */
- long readLong(int offset);
-
- /**
- * Reads a single-precision 32-bit floating point number from the buffer at the given offset.
- *
- * @param offset The offset at which to read the float.
- * @return The read float.
- */
- float readFloat(int offset);
-
- /**
- * Reads a double-precision 64-bit floating point number from the buffer at the given offset.
- *
- * @param offset The offset at which to read the double.
- * @return The read double.
- */
- double readDouble(int offset);
-
- /**
- * Reads a 1 byte boolean from the buffer at the given offset.
- *
- * @param offset The offset at which to read the boolean.
- * @return The read boolean.
- */
- boolean readBoolean(int offset);
-
- /**
- * Reads a string from the buffer at the given offset.
- *
- * @param offset The offset at which to read the string.
- * @return The read string.
- */
- String readString(int offset);
-
- /**
- * Reads a string from the buffer at the given offset.
- *
- * @param offset The offset at which to read the string.
- * @param charset The character set with which to decode the string.
- * @return The read string.
- */
- String readString(int offset, Charset charset);
-
- /**
- * Reads a UTF-8 string from the buffer at the given offset.
- *
- * @param offset The offset at which to read the string.
- * @return The read string.
- */
- String readUTF8(int offset);
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import java.nio.charset.Charset;
-
-/**
- * Writable bytes.
- * <p>
- * This interface exposes methods for writing bytes to specific positions in a byte array.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public interface BytesOutput<T extends BytesOutput<T>> {
-
- /**
- * Zeros out all bytes in the array.
- *
- * @return The written bytes.
- */
- T zero();
-
- /**
- * Zeros out all bytes starting at the given offset in the array.
- *
- * @param offset The offset at which to start zeroing out bytes.
- * @return The written bytes.
- */
- T zero(int offset);
-
- /**
- * Zeros out bytes starting at the given offset up to the given length.
- *
- * @param offset The offset at which to start zeroing out bytes.
- * @param length THe total number of bytes to zero out.
- * @return The written bytes.
- */
- T zero(int offset, int length);
-
- /**
- * Writes an array of bytes to the buffer.
- *
- * @param offset The offset at which to start writing the bytes.
- * @param src The array of bytes to write.
- * @param srcOffset The offset at which to start reading bytes from the given source.
- * @param length The number of bytes from the provided byte array to write to the buffer.
- * @return The written buffer.
- */
- T write(int offset, Bytes src, int srcOffset, int length);
-
- /**
- * Writes an array of bytes to the buffer.
- *
- * @param offset The offset at which to start writing the bytes.
- * @param src The array of bytes to write.
- * @param srcOffset The offset at which to start reading bytes from the given source.
- * @param length The number of bytes from the provided byte array to write to the buffer.
- * @return The written buffer.
- */
- T write(int offset, byte[] src, int srcOffset, int length);
-
- /**
- * Writes a byte to the buffer at the given offset.
- *
- * @param offset The offset at which to write the byte.
- * @param b The byte to write.
- * @return The written buffer.
- */
- T writeByte(int offset, int b);
-
- /**
- * Writes an unsigned byte to the buffer at the given position.
- *
- * @param offset The offset at which to write the byte.
- * @param b The byte to write.
- * @return The written buffer.
- */
- T writeUnsignedByte(int offset, int b);
-
- /**
- * Writes a 16-bit character to the buffer at the given offset.
- *
- * @param offset The offset at which to write the character.
- * @param c The character to write.
- * @return The written buffer.
- */
- T writeChar(int offset, char c);
-
- /**
- * Writes a 16-bit signed integer to the buffer at the given offset.
- *
- * @param offset The offset at which to write the short.
- * @param s The short to write.
- * @return The written buffer.
- */
- T writeShort(int offset, short s);
-
- /**
- * Writes a 16-bit unsigned integer to the buffer at the given offset.
- *
- * @param offset The offset at which to write the short.
- * @param s The short to write.
- * @return The written buffer.
- */
- T writeUnsignedShort(int offset, int s);
-
- /**
- * Writes a 24-bit signed integer to the buffer at the given offset.
- *
- * @param offset The offset at which to write the short.
- * @param m The short to write.
- * @return The written buffer.
- */
- T writeMedium(int offset, int m);
-
- /**
- * Writes a 24-bit unsigned integer to the buffer at the given offset.
- *
- * @param offset The offset at which to write the short.
- * @param m The short to write.
- * @return The written buffer.
- */
- T writeUnsignedMedium(int offset, int m);
-
- /**
- * Writes a 32-bit signed integer to the buffer at the given offset.
- *
- * @param offset The offset at which to write the integer.
- * @param i The integer to write.
- * @return The written buffer.
- */
- T writeInt(int offset, int i);
-
- /**
- * Writes a 32-bit unsigned integer to the buffer at the given offset.
- *
- * @param offset The offset at which to write the integer.
- * @param i The integer to write.
- * @return The written buffer.
- */
- T writeUnsignedInt(int offset, long i);
-
- /**
- * Writes a 64-bit signed integer to the buffer at the given offset.
- *
- * @param offset The offset at which to write the long.
- * @param l The long to write.
- * @return The written buffer.
- */
- T writeLong(int offset, long l);
-
- /**
- * Writes a single-precision 32-bit floating point number to the buffer at the given offset.
- *
- * @param offset The offset at which to write the float.
- * @param f The float to write.
- * @return The written buffer.
- */
- T writeFloat(int offset, float f);
-
- /**
- * Writes a double-precision 64-bit floating point number to the buffer at the given offset.
- *
- * @param offset The offset at which to write the double.
- * @param d The double to write.
- * @return The written buffer.
- */
- T writeDouble(int offset, double d);
-
- /**
- * Writes a 1 byte boolean to the buffer at the given offset.
- *
- * @param offset The offset at which to write the boolean.
- * @param b The boolean to write.
- * @return The written buffer.
- */
- T writeBoolean(int offset, boolean b);
-
- /**
- * Writes a string to the buffer at the given offset.
- *
- * @param offset The offset at which to write the string.
- * @param s The string to write.
- * @return The written buffer.
- */
- T writeString(int offset, String s);
-
- /**
- * Writes a string to the buffer at the given offset.
- *
- * @param offset The offset at which to write the string.
- * @param s The string to write.
- * @param charset The character set with which to encode the string.
- * @return The written buffer.
- */
- T writeString(int offset, String s, Charset charset);
-
- /**
- * Writes a UTF-8 string to the buffer at the given offset.
- *
- * @param offset The offset at which to write the string.
- * @param s The string to write.
- * @return The written buffer.
- */
- T writeUTF8(int offset, String s);
-
- /**
- * Flushes the bytes to the underlying persistence layer.
- *
- * @return The flushed buffer.
- */
- T flush();
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import io.atomix.utils.memory.Memory;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-/**
- * Direct {@link java.nio.ByteBuffer} based buffer.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public class DirectBuffer extends ByteBufferBuffer {
-
- /**
- * Allocates a direct buffer with an initial capacity of {@code 4096} and a maximum capacity of {@link Long#MAX_VALUE}.
- *
- * @return The direct buffer.
- * @see DirectBuffer#allocate(int)
- * @see DirectBuffer#allocate(int, int)
- */
- public static DirectBuffer allocate() {
- return allocate(DEFAULT_INITIAL_CAPACITY, MAX_SIZE);
- }
-
- /**
- * Allocates a direct buffer with the given initial capacity.
- *
- * @param initialCapacity The initial capacity of the buffer to allocate (in bytes).
- * @return The direct buffer.
- * @throws IllegalArgumentException If {@code capacity} is greater than the maximum allowed count for
- * a {@link java.nio.ByteBuffer} - {@code Integer.MAX_VALUE - 5}
- * @see DirectBuffer#allocate()
- * @see DirectBuffer#allocate(int, int)
- */
- public static DirectBuffer allocate(int initialCapacity) {
- return allocate(initialCapacity, MAX_SIZE);
- }
-
- /**
- * Allocates a new direct buffer.
- *
- * @param initialCapacity The initial capacity of the buffer to allocate (in bytes).
- * @param maxCapacity The maximum capacity of the buffer.
- * @return The direct buffer.
- * @throws IllegalArgumentException If {@code capacity} or {@code maxCapacity} is greater than the maximum
- * allowed count for a {@link java.nio.ByteBuffer} - {@code Integer.MAX_VALUE - 5}
- * @see DirectBuffer#allocate()
- * @see DirectBuffer#allocate(int)
- */
- public static DirectBuffer allocate(int initialCapacity, int maxCapacity) {
- checkArgument(initialCapacity <= maxCapacity, "initial capacity cannot be greater than maximum capacity");
- return new DirectBuffer(DirectBytes.allocate((int) Math.min(Memory.Util.toPow2(initialCapacity), MAX_SIZE)), 0, initialCapacity, maxCapacity);
- }
-
- protected DirectBuffer(DirectBytes bytes, int offset, int initialCapacity, int maxCapacity) {
- super(bytes, offset, initialCapacity, maxCapacity, null);
- }
-
- @Override
- public DirectBuffer duplicate() {
- return new DirectBuffer((DirectBytes) bytes, offset(), capacity(), maxCapacity());
- }
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import java.nio.ByteBuffer;
-
-/**
- * {@link ByteBuffer} based direct bytes.
- */
-public class DirectBytes extends ByteBufferBytes {
-
- /**
- * Allocates a new direct byte array.
- *
- * @param size The count of the buffer to allocate (in bytes).
- * @return The direct buffer.
- * @throws IllegalArgumentException If {@code count} is greater than the maximum allowed count for
- * an array on the Java heap - {@code Integer.MAX_VALUE - 5}
- */
- public static DirectBytes allocate(int size) {
- if (size > MAX_SIZE) {
- throw new IllegalArgumentException("size cannot for DirectBytes cannot be greater than " + MAX_SIZE);
- }
- return new DirectBytes(ByteBuffer.allocateDirect((int) size));
- }
-
- protected DirectBytes(ByteBuffer buffer) {
- super(buffer);
- }
-
- @Override
- protected ByteBuffer newByteBuffer(int size) {
- return ByteBuffer.allocateDirect((int) size);
- }
-
- @Override
- public boolean isDirect() {
- return buffer.isDirect();
- }
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import io.atomix.utils.memory.Memory;
-
-import java.io.File;
-import java.nio.channels.FileChannel;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-/**
- * File buffer.
- * <p>
- * File buffers wrap a simple {@link java.io.RandomAccessFile} instance to provide random access to a file on local disk. All
- * operations are delegated directly to the {@link java.io.RandomAccessFile} interface, and limitations are dependent on the
- * semantics of the underlying file.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public class FileBuffer extends AbstractBuffer {
-
- /**
- * Allocates a file buffer of unlimited capacity.
- * <p>
- * The buffer will initially be allocated with {@code 4096} bytes. As bytes are written to the resulting buffer and
- * the original capacity is reached, the buffer's capacity will double.
- *
- * @param file The file to allocate.
- * @return The allocated buffer.
- * @see FileBuffer#allocate(File, int)
- * @see FileBuffer#allocate(File, int, int)
- * @see FileBuffer#allocate(File, String, int, int)
- */
- public static FileBuffer allocate(File file) {
- return allocate(file, FileBytes.DEFAULT_MODE, DEFAULT_INITIAL_CAPACITY, Integer.MAX_VALUE);
- }
-
- /**
- * Allocates a file buffer with the given initial capacity.
- * <p>
- * If the underlying file is empty, the file count will expand dynamically as bytes are written to the file.
- * The underlying {@link FileBytes} will be initialized to the nearest power of {@code 2}.
- *
- * @param file The file to allocate.
- * @param initialCapacity The initial capacity of the bytes to allocate.
- * @return The allocated buffer.
- * @see FileBuffer#allocate(File)
- * @see FileBuffer#allocate(File, int, int)
- * @see FileBuffer#allocate(File, String, int, int)
- */
- public static FileBuffer allocate(File file, int initialCapacity) {
- return allocate(file, FileBytes.DEFAULT_MODE, initialCapacity, Integer.MAX_VALUE);
- }
-
- /**
- * Allocates a file buffer.
- * <p>
- * The underlying {@link java.io.RandomAccessFile} will be created in {@code rw} mode by default.
- * The resulting buffer will be initialized with a capacity of {@code initialCapacity}. The underlying {@link FileBytes}
- * will be initialized to the nearest power of {@code 2}. As bytes are written to the file the buffer's capacity will
- * double up to {@code maxCapacity}.
- *
- * @param file The file to allocate.
- * @param initialCapacity The initial capacity of the buffer.
- * @param maxCapacity The maximum allowed capacity of the buffer.
- * @return The allocated buffer.
- * @see FileBuffer#allocate(File)
- * @see FileBuffer#allocate(File, int)
- * @see FileBuffer#allocate(File, String, int, int)
- */
- public static FileBuffer allocate(File file, int initialCapacity, int maxCapacity) {
- return allocate(file, FileBytes.DEFAULT_MODE, initialCapacity, maxCapacity);
- }
-
- /**
- * Allocates a file buffer.
- * <p>
- * The resulting buffer will be initialized with a capacity of {@code initialCapacity}. The underlying {@link FileBytes}
- * will be initialized to the nearest power of {@code 2}. As bytes are written to the file the buffer's capacity will
- * double up to {@code maxCapacity}.
- *
- * @param file The file to allocate.
- * @param mode The mode in which to open the underlying {@link java.io.RandomAccessFile}.
- * @param initialCapacity The initial capacity of the buffer.
- * @param maxCapacity The maximum allowed capacity of the buffer.
- * @return The allocated buffer.
- * @see FileBuffer#allocate(File)
- * @see FileBuffer#allocate(File, int)
- * @see FileBuffer#allocate(File, int, int)
- */
- public static FileBuffer allocate(File file, String mode, int initialCapacity, int maxCapacity) {
- checkArgument(initialCapacity <= maxCapacity, "initial capacity cannot be greater than maximum capacity");
- return new FileBuffer(new FileBytes(file, mode, (int) Math.min(Memory.Util.toPow2(initialCapacity), maxCapacity)), 0, initialCapacity, maxCapacity);
- }
-
- private final FileBytes bytes;
-
- private FileBuffer(FileBytes bytes, int offset, int initialCapacity, int maxCapacity) {
- super(bytes, offset, initialCapacity, maxCapacity, null);
- this.bytes = bytes;
- }
-
- /**
- * Returns the underlying file object.
- *
- * @return The underlying file.
- */
- public File file() {
- return ((FileBytes) bytes).file();
- }
-
- /**
- * Maps a portion of the underlying file into memory in {@link FileChannel.MapMode#READ_WRITE} mode
- * starting at the current position up to the given {@code count}.
- *
- * @param size The count of the bytes to map into memory.
- * @return The mapped buffer.
- * @throws IllegalArgumentException If {@code count} is greater than the maximum allowed
- * {@link java.nio.MappedByteBuffer} count: {@link Integer#MAX_VALUE}
- */
- public MappedBuffer map(int size) {
- return map(position(), size, FileChannel.MapMode.READ_WRITE);
- }
-
- /**
- * Maps a portion of the underlying file into memory starting at the current position up to the given {@code count}.
- *
- * @param size The count of the bytes to map into memory.
- * @param mode The mode in which to map the bytes into memory.
- * @return The mapped buffer.
- * @throws IllegalArgumentException If {@code count} is greater than the maximum allowed
- * {@link java.nio.MappedByteBuffer} count: {@link Integer#MAX_VALUE}
- */
- public MappedBuffer map(int size, FileChannel.MapMode mode) {
- return map(position(), size, mode);
- }
-
- /**
- * Maps a portion of the underlying file into memory in {@link FileChannel.MapMode#READ_WRITE} mode
- * starting at the given {@code offset} up to the given {@code count}.
- *
- * @param offset The offset from which to map bytes into memory.
- * @param size The count of the bytes to map into memory.
- * @return The mapped buffer.
- * @throws IllegalArgumentException If {@code count} is greater than the maximum allowed
- * {@link java.nio.MappedByteBuffer} count: {@link Integer#MAX_VALUE}
- */
- public MappedBuffer map(int offset, int size) {
- return map(offset, size, FileChannel.MapMode.READ_WRITE);
- }
-
- /**
- * Maps a portion of the underlying file into memory starting at the given {@code offset} up to the given {@code count}.
- *
- * @param offset The offset from which to map bytes into memory.
- * @param size The count of the bytes to map into memory.
- * @param mode The mode in which to map the bytes into memory.
- * @return The mapped buffer.
- * @throws IllegalArgumentException If {@code count} is greater than the maximum allowed
- * {@link java.nio.MappedByteBuffer} count: {@link Integer#MAX_VALUE}
- */
- public MappedBuffer map(int offset, int size, FileChannel.MapMode mode) {
- return new MappedBuffer(((FileBytes) bytes).map(offset, size, mode), 0, size, size);
- }
-
- @Override
- protected void compact(int from, int to, int length) {
- byte[] bytes = new byte[1024];
- int position = from;
- while (position < from + length) {
- int size = Math.min((from + length) - position, 1024);
- this.bytes.read(position, bytes, 0, size);
- this.bytes.write(0, bytes, 0, size);
- position += size;
- }
- }
-
- @Override
- public FileBuffer duplicate() {
- return new FileBuffer(new FileBytes(bytes.file(), bytes.mode(), bytes.size()), offset(), capacity(), maxCapacity());
- }
-
- /**
- * Duplicates the buffer using the given mode.
- *
- * @return The mode with which to open the duplicate buffer.
- */
- public FileBuffer duplicate(String mode) {
- return new FileBuffer(new FileBytes(bytes.file(), mode, bytes.size()), offset(), capacity(), maxCapacity());
- }
-
- /**
- * Deletes the underlying file.
- */
- public void delete() {
- bytes.delete();
- }
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import io.atomix.utils.memory.Memory;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.nio.ByteOrder;
-import java.nio.MappedByteBuffer;
-import java.nio.channels.FileChannel;
-import java.nio.file.Files;
-
-/**
- * File bytes.
- * <p>
- * File bytes wrap a simple {@link RandomAccessFile} instance to provide random access to a randomAccessFile on local disk. All
- * operations are delegated directly to the {@link RandomAccessFile} interface, and limitations are dependent on the
- * semantics of the underlying randomAccessFile.
- * <p>
- * Bytes are always stored in the underlying randomAccessFile in {@link ByteOrder#BIG_ENDIAN} order.
- * To flip the byte order to read or write to/from a randomAccessFile in {@link ByteOrder#LITTLE_ENDIAN} order use
- * {@link Bytes#order(ByteOrder)}.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public class FileBytes extends AbstractBytes {
- static final String DEFAULT_MODE = "rw";
-
- /**
- * Allocates a randomAccessFile buffer of unlimited count.
- * <p>
- * The buffer will be allocated with {@link Long#MAX_VALUE} bytes. As bytes are written to the buffer, the underlying
- * {@link RandomAccessFile} will expand.
- *
- * @param file The randomAccessFile to allocate.
- * @return The allocated buffer.
- */
- public static FileBytes allocate(File file) {
- return allocate(file, DEFAULT_MODE, Integer.MAX_VALUE);
- }
-
- /**
- * Allocates a randomAccessFile buffer.
- * <p>
- * If the underlying randomAccessFile is empty, the randomAccessFile count will expand dynamically as bytes are written to the randomAccessFile.
- *
- * @param file The randomAccessFile to allocate.
- * @param size The count of the bytes to allocate.
- * @return The allocated buffer.
- */
- public static FileBytes allocate(File file, int size) {
- return allocate(file, DEFAULT_MODE, size);
- }
-
- /**
- * Allocates a randomAccessFile buffer.
- * <p>
- * If the underlying randomAccessFile is empty, the randomAccessFile count will expand dynamically as bytes are written to the randomAccessFile.
- *
- * @param file The randomAccessFile to allocate.
- * @param mode The mode in which to open the underlying {@link RandomAccessFile}.
- * @param size The count of the bytes to allocate.
- * @return The allocated buffer.
- */
- public static FileBytes allocate(File file, String mode, int size) {
- return new FileBytes(file, mode, (int) Math.min(Memory.Util.toPow2(size), Integer.MAX_VALUE));
- }
-
- private static final int PAGE_SIZE = 1024 * 4;
- private static final byte[] BLANK_PAGE = new byte[PAGE_SIZE];
-
- private final File file;
- private final String mode;
- private final RandomAccessFile randomAccessFile;
- private int size;
-
- FileBytes(File file, String mode, int size) {
- if (file == null) {
- throw new NullPointerException("file cannot be null");
- }
- if (mode == null) {
- mode = DEFAULT_MODE;
- }
- if (size < 0) {
- throw new IllegalArgumentException("size must be positive");
- }
-
- this.file = file;
- this.mode = mode;
- this.size = size;
- try {
- this.randomAccessFile = new RandomAccessFile(file, mode);
- if (size > randomAccessFile.length()) {
- randomAccessFile.setLength(size);
- }
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * Returns the underlying file object.
- *
- * @return The underlying file.
- */
- public File file() {
- return file;
- }
-
- /**
- * Returns the file mode.
- *
- * @return The file mode.
- */
- public String mode() {
- return mode;
- }
-
- @Override
- public int size() {
- return size;
- }
-
- @Override
- public Bytes resize(int newSize) {
- if (newSize < size) {
- throw new IllegalArgumentException("cannot decrease file bytes size; use zero() to decrease file size");
- }
- int oldSize = this.size;
- this.size = newSize;
- try {
- long length = randomAccessFile.length();
- if (newSize > length) {
- randomAccessFile.setLength(newSize);
- zero(oldSize);
- }
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- return this;
- }
-
- @Override
- public boolean isFile() {
- return true;
- }
-
- /**
- * Maps a portion of the randomAccessFile into memory in {@link FileChannel.MapMode#READ_WRITE} mode and returns
- * a {@link MappedBytes} instance.
- *
- * @param offset The offset from which to map the randomAccessFile into memory.
- * @param size The count of the bytes to map into memory.
- * @return The mapped bytes.
- * @throws IllegalArgumentException If {@code count} is greater than the maximum allowed
- * {@link java.nio.MappedByteBuffer} count: {@link Integer#MAX_VALUE}
- */
- public MappedBytes map(int offset, int size) {
- return map(offset, size, parseMode(mode));
- }
-
- /**
- * Maps a portion of the randomAccessFile into memory and returns a {@link MappedBytes} instance.
- *
- * @param offset The offset from which to map the randomAccessFile into memory.
- * @param size The count of the bytes to map into memory.
- * @param mode The mode in which to map the randomAccessFile into memory.
- * @return The mapped bytes.
- * @throws IllegalArgumentException If {@code count} is greater than the maximum allowed
- * {@link java.nio.MappedByteBuffer} count: {@link Integer#MAX_VALUE}
- */
- public MappedBytes map(int offset, int size, FileChannel.MapMode mode) {
- MappedByteBuffer mappedByteBuffer = mapFile(randomAccessFile, offset, size, mode);
- return new MappedBytes(file, randomAccessFile, mappedByteBuffer, mode);
- }
-
- private static MappedByteBuffer mapFile(RandomAccessFile randomAccessFile, int offset, int size, FileChannel.MapMode mode) {
- try {
- return randomAccessFile.getChannel().map(mode, offset, size);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- private static FileChannel.MapMode parseMode(String mode) {
- switch (mode) {
- case "r":
- return FileChannel.MapMode.READ_ONLY;
- case "rw":
- default:
- return FileChannel.MapMode.READ_WRITE;
- }
- }
-
- @Override
- public ByteOrder order() {
- return ByteOrder.BIG_ENDIAN;
- }
-
- /**
- * Seeks to the given offset.
- */
- private void seekToOffset(int offset) throws IOException {
- if (randomAccessFile.getFilePointer() != offset) {
- randomAccessFile.seek(offset);
- }
- }
-
- @Override
- public Bytes zero() {
- try {
- randomAccessFile.setLength(0);
- randomAccessFile.setLength(size);
- for (int i = 0; i < size; i += PAGE_SIZE) {
- randomAccessFile.write(BLANK_PAGE, 0, Math.min(size - i, PAGE_SIZE));
- }
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- return this;
- }
-
- @Override
- public Bytes zero(int offset) {
- try {
- int length = Math.max(offset, size);
- randomAccessFile.setLength(offset);
- randomAccessFile.setLength(length);
- seekToOffset(offset);
- for (int i = offset; i < length; i += PAGE_SIZE) {
- randomAccessFile.write(BLANK_PAGE, 0, Math.min(length - i, PAGE_SIZE));
- }
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- return this;
- }
-
- @Override
- public Bytes zero(int offset, int length) {
- for (int i = offset; i < offset + length; i++) {
- writeByte(i, (byte) 0);
- }
- return this;
- }
-
- @Override
- public Bytes read(int position, Bytes bytes, int offset, int length) {
- checkRead(position, length);
- if (bytes instanceof WrappedBytes) {
- bytes = ((WrappedBytes) bytes).root();
- }
- if (bytes.hasArray()) {
- try {
- seekToOffset(position);
- randomAccessFile.readFully(bytes.array(), (int) offset, (int) length);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- } else {
- try {
- seekToOffset(position);
- byte[] readBytes = new byte[(int) length];
- randomAccessFile.readFully(readBytes);
- bytes.write(offset, readBytes, 0, length);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
- return this;
- }
-
- @Override
- public Bytes read(int position, byte[] bytes, int offset, int length) {
- checkRead(position, length);
- try {
- seekToOffset(position);
- randomAccessFile.readFully(bytes, (int) offset, (int) length);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- return this;
- }
-
- @Override
- public int readByte(int offset) {
- checkRead(offset, BYTE);
- try {
- seekToOffset(offset);
- return randomAccessFile.readByte();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public char readChar(int offset) {
- checkRead(offset, CHARACTER);
- try {
- seekToOffset(offset);
- return randomAccessFile.readChar();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public short readShort(int offset) {
- checkRead(offset, SHORT);
- try {
- seekToOffset(offset);
- return randomAccessFile.readShort();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public int readInt(int offset) {
- checkRead(offset, INTEGER);
- try {
- seekToOffset(offset);
- return randomAccessFile.readInt();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public long readLong(int offset) {
- checkRead(offset, LONG);
- try {
- seekToOffset(offset);
- return randomAccessFile.readLong();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public float readFloat(int offset) {
- checkRead(offset, FLOAT);
- try {
- seekToOffset(offset);
- return randomAccessFile.readFloat();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public double readDouble(int offset) {
- checkRead(offset, DOUBLE);
- try {
- seekToOffset(offset);
- return randomAccessFile.readDouble();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public Bytes write(int position, Bytes bytes, int offset, int length) {
- checkWrite(position, length);
- if (bytes instanceof WrappedBytes) {
- bytes = ((WrappedBytes) bytes).root();
- }
- if (bytes.hasArray()) {
- try {
- seekToOffset(position);
- randomAccessFile.write(bytes.array(), (int) offset, (int) length);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- } else {
- try {
- seekToOffset(position);
- byte[] writeBytes = new byte[(int) length];
- bytes.read(offset, writeBytes, 0, length);
- randomAccessFile.write(writeBytes);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
- return this;
- }
-
- @Override
- public Bytes write(int position, byte[] bytes, int offset, int length) {
- checkWrite(position, length);
- try {
- seekToOffset(position);
- randomAccessFile.write(bytes, (int) offset, (int) length);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- return this;
- }
-
- @Override
- public Bytes writeByte(int offset, int b) {
- checkWrite(offset, BYTE);
- try {
- seekToOffset(offset);
- randomAccessFile.writeByte(b);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- return this;
- }
-
- @Override
- public Bytes writeChar(int offset, char c) {
- checkWrite(offset, CHARACTER);
- try {
- seekToOffset(offset);
- randomAccessFile.writeChar(c);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- return this;
- }
-
- @Override
- public Bytes writeShort(int offset, short s) {
- checkWrite(offset, SHORT);
- try {
- seekToOffset(offset);
- randomAccessFile.writeShort(s);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- return this;
- }
-
- @Override
- public Bytes writeInt(int offset, int i) {
- checkWrite(offset, INTEGER);
- try {
- seekToOffset(offset);
- randomAccessFile.writeInt(i);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- return this;
- }
-
- @Override
- public Bytes writeLong(int offset, long l) {
- checkWrite(offset, LONG);
- try {
- seekToOffset(offset);
- randomAccessFile.writeLong(l);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- return this;
- }
-
- @Override
- public Bytes writeFloat(int offset, float f) {
- checkWrite(offset, FLOAT);
- try {
- seekToOffset(offset);
- randomAccessFile.writeFloat(f);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- return this;
- }
-
- @Override
- public Bytes writeDouble(int offset, double d) {
- checkWrite(offset, DOUBLE);
- try {
- seekToOffset(offset);
- randomAccessFile.writeDouble(d);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- return this;
- }
-
- @Override
- public Bytes flush() {
- try {
- randomAccessFile.getFD().sync();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- return this;
- }
-
- @Override
- public void close() {
- try {
- randomAccessFile.close();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- super.close();
- }
-
- /**
- * Deletes the underlying file.
- */
- public void delete() {
- try {
- close();
- Files.delete(file.toPath());
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import io.atomix.utils.memory.Memory;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-/**
- * Direct {@link java.nio.ByteBuffer} based buffer.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public class HeapBuffer extends ByteBufferBuffer {
-
- /**
- * Allocates a direct buffer with an initial capacity of {@code 4096} and a maximum capacity of {@link Long#MAX_VALUE}.
- *
- * @return The direct buffer.
- * @see HeapBuffer#allocate(int)
- * @see HeapBuffer#allocate(int, int)
- */
- public static HeapBuffer allocate() {
- return allocate(DEFAULT_INITIAL_CAPACITY, MAX_SIZE);
- }
-
- /**
- * Allocates a direct buffer with the given initial capacity.
- *
- * @param initialCapacity The initial capacity of the buffer to allocate (in bytes).
- * @return The direct buffer.
- * @throws IllegalArgumentException If {@code capacity} is greater than the maximum allowed count for
- * a {@link java.nio.ByteBuffer} - {@code Integer.MAX_VALUE - 5}
- * @see HeapBuffer#allocate()
- * @see HeapBuffer#allocate(int, int)
- */
- public static HeapBuffer allocate(int initialCapacity) {
- return allocate(initialCapacity, MAX_SIZE);
- }
-
- /**
- * Allocates a new direct buffer.
- *
- * @param initialCapacity The initial capacity of the buffer to allocate (in bytes).
- * @param maxCapacity The maximum capacity of the buffer.
- * @return The direct buffer.
- * @throws IllegalArgumentException If {@code capacity} or {@code maxCapacity} is greater than the maximum
- * allowed count for a {@link java.nio.ByteBuffer} - {@code Integer.MAX_VALUE - 5}
- * @see HeapBuffer#allocate()
- * @see HeapBuffer#allocate(int)
- */
- public static HeapBuffer allocate(int initialCapacity, int maxCapacity) {
- checkArgument(initialCapacity <= maxCapacity, "initial capacity cannot be greater than maximum capacity");
- return new HeapBuffer(HeapBytes.allocate((int) Math.min(Memory.Util.toPow2(initialCapacity), MAX_SIZE)), 0, initialCapacity, maxCapacity);
- }
-
- /**
- * Wraps the given bytes in a heap buffer.
- * <p>
- * The buffer will be created with an initial capacity and maximum capacity equal to the byte array count.
- *
- * @param bytes The bytes to wrap.
- * @return The wrapped bytes.
- */
- public static HeapBuffer wrap(byte[] bytes) {
- return new HeapBuffer(HeapBytes.wrap(bytes), 0, bytes.length, bytes.length);
- }
-
- private final HeapBytes bytes;
-
- protected HeapBuffer(HeapBytes bytes, int offset, int initialCapacity, int maxCapacity) {
- super(bytes, offset, initialCapacity, maxCapacity, null);
- this.bytes = bytes;
- }
-
- @Override
- public boolean hasArray() {
- return true;
- }
-
- @Override
- public HeapBuffer duplicate() {
- return new HeapBuffer(bytes, offset(), capacity(), maxCapacity());
- }
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import java.nio.ByteBuffer;
-
-/**
- * {@link ByteBuffer} based heap bytes.
- */
-public class HeapBytes extends ByteBufferBytes {
- public static final byte[] EMPTY = new byte[0];
-
- /**
- * Allocates a new heap byte array.
- *
- * @param size The count of the buffer to allocate (in bytes).
- * @return The heap buffer.
- * @throws IllegalArgumentException If {@code count} is greater than the maximum allowed count for
- * an array on the Java heap - {@code Integer.MAX_VALUE - 5}
- */
- public static HeapBytes allocate(int size) {
- if (size > MAX_SIZE) {
- throw new IllegalArgumentException("size cannot for HeapBytes cannot be greater than " + MAX_SIZE);
- }
- return new HeapBytes(ByteBuffer.allocate((int) size));
- }
-
- /**
- * Wraps the given bytes in a {@link HeapBytes} object.
- * <p>
- * The returned {@link Bytes} object will be backed by a {@link ByteBuffer} instance that
- * wraps the given byte array. The {@link Bytes#size()} will be equivalent to the provided
- * by array {@code length}.
- *
- * @param bytes The bytes to wrap.
- */
- public static HeapBytes wrap(byte[] bytes) {
- return new HeapBytes(ByteBuffer.wrap(bytes));
- }
-
- protected HeapBytes(ByteBuffer buffer) {
- super(buffer);
- }
-
- @Override
- protected ByteBuffer newByteBuffer(int size) {
- return ByteBuffer.allocate((int) size);
- }
-
- @Override
- public boolean hasArray() {
- return true;
- }
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import java.io.File;
-import java.nio.channels.FileChannel;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * Direct {@link java.nio.ByteBuffer} based buffer.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public class MappedBuffer extends ByteBufferBuffer {
-
- /**
- * Allocates a dynamic capacity mapped buffer in {@link FileChannel.MapMode#READ_WRITE} mode with an initial capacity
- * of {@code 16MiB} and a maximum capacity of {@link Integer#MAX_VALUE}.
- * <p>
- * The resulting buffer will have a maximum capacity of {@link Integer#MAX_VALUE}. As bytes are written to the buffer
- * its capacity will double in count each time the current capacity is reached. Memory will be mapped by opening and
- * expanding the given {@link File} to the desired {@code capacity} and mapping the file contents into memory via
- * {@link FileChannel#map(FileChannel.MapMode, long, long)}.
- *
- * @param file The file to map into memory.
- * @return The mapped buffer.
- * @throws NullPointerException If {@code file} is {@code null}
- * @see #allocate(File, FileChannel.MapMode)
- * @see #allocate(File, int)
- * @see #allocate(File, FileChannel.MapMode, int)
- * @see #allocate(File, int, int)
- * @see #allocate(File, FileChannel.MapMode, int, int)
- */
- public static MappedBuffer allocate(File file) {
- return allocate(file, FileChannel.MapMode.READ_WRITE, DEFAULT_INITIAL_CAPACITY, Integer.MAX_VALUE);
- }
-
- /**
- * Allocates a dynamic capacity mapped buffer in {@link FileChannel.MapMode#READ_WRITE} mode with an initial capacity
- * of {@code 16MiB} and a maximum capacity of {@link Integer#MAX_VALUE}.
- * <p>
- * The resulting buffer will be initialized to a capacity of {@code 4096} and have a maximum capacity of
- * {@link Integer#MAX_VALUE}. As bytes are written to the buffer its capacity will double in count each time the current
- * capacity is reached. Memory will be mapped by opening and expanding the given {@link File} to the desired
- * {@code capacity} and mapping the file contents into memory via
- * {@link FileChannel#map(FileChannel.MapMode, long, long)}.
- *
- * @param file The file to map into memory.
- * @param mode The mode with which to map the file.
- * @return The mapped buffer.
- * @throws NullPointerException If {@code file} is {@code null}
- * @see #allocate(File)
- * @see #allocate(File, int)
- * @see #allocate(File, FileChannel.MapMode, int)
- * @see #allocate(File, int, int)
- * @see #allocate(File, FileChannel.MapMode, int, int)
- */
- public static MappedBuffer allocate(File file, FileChannel.MapMode mode) {
- return allocate(file, mode, DEFAULT_INITIAL_CAPACITY, Integer.MAX_VALUE);
- }
-
- /**
- * Allocates a fixed capacity mapped buffer in {@link FileChannel.MapMode#READ_WRITE} mode.
- * <p>
- * Memory will be mapped by opening and expanding the given {@link File} to the desired {@code capacity} and mapping the
- * file contents into memory via {@link FileChannel#map(FileChannel.MapMode, long, long)}.
- * <p>
- * The resulting buffer will have a capacity of {@code capacity}. The underlying {@link MappedBytes} will be
- * initialized to the next power of {@code 2}.
- *
- * @param file The file to map into memory.
- * @param capacity The fixed capacity of the buffer to allocate (in bytes).
- * @return The mapped buffer.
- * @throws NullPointerException If {@code file} is {@code null}
- * @throws IllegalArgumentException If the {@code capacity} is greater than {@link Integer#MAX_VALUE}.
- * @see #allocate(File)
- * @see #allocate(File, FileChannel.MapMode)
- * @see #allocate(File, FileChannel.MapMode, int)
- * @see #allocate(File, int, int)
- * @see #allocate(File, FileChannel.MapMode, int, int)
- */
- public static MappedBuffer allocate(File file, int capacity) {
- return allocate(file, FileChannel.MapMode.READ_WRITE, capacity, capacity);
- }
-
- /**
- * Allocates a fixed capacity mapped buffer in the given {@link FileChannel.MapMode}.
- * <p>
- * Memory will be mapped by opening and expanding the given {@link File} to the desired {@code capacity} and mapping the
- * file contents into memory via {@link FileChannel#map(FileChannel.MapMode, long, long)}.
- * <p>
- * The resulting buffer will have a capacity of {@code capacity}. The underlying {@link MappedBytes} will be
- * initialized to the next power of {@code 2}.
- *
- * @param file The file to map into memory.
- * @param mode The mode with which to map the file.
- * @param capacity The fixed capacity of the buffer to allocate (in bytes).
- * @return The mapped buffer.
- * @throws NullPointerException If {@code file} is {@code null}
- * @throws IllegalArgumentException If the {@code capacity} is greater than {@link Integer#MAX_VALUE}.
- * @see #allocate(File)
- * @see #allocate(File, FileChannel.MapMode)
- * @see #allocate(File, int)
- * @see #allocate(File, int, int)
- * @see #allocate(File, FileChannel.MapMode, int, int)
- */
- public static MappedBuffer allocate(File file, FileChannel.MapMode mode, int capacity) {
- return allocate(file, mode, capacity, capacity);
- }
-
- /**
- * Allocates a mapped buffer.
- * <p>
- * Memory will be mapped by opening and expanding the given {@link File} to the desired {@code count} and mapping the
- * file contents into memory via {@link FileChannel#map(FileChannel.MapMode, long, long)}.
- * <p>
- * The resulting buffer will have a capacity of {@code initialCapacity}. The underlying {@link MappedBytes} will be
- * initialized to the next power of {@code 2}. As bytes are written to the buffer, the buffer's capacity will double
- * as int as {@code maxCapacity > capacity}.
- *
- * @param file The file to map into memory. If the file doesn't exist it will be automatically created.
- * @param initialCapacity The initial capacity of the buffer.
- * @param maxCapacity The maximum capacity of the buffer.
- * @return The mapped buffer.
- * @throws NullPointerException If {@code file} is {@code null}
- * @throws IllegalArgumentException If the {@code capacity} or {@code maxCapacity} is greater than
- * {@link Integer#MAX_VALUE}.
- * @see #allocate(File)
- * @see #allocate(File, FileChannel.MapMode)
- * @see #allocate(File, int)
- * @see #allocate(File, FileChannel.MapMode, int)
- * @see #allocate(File, FileChannel.MapMode, int, int)
- */
- public static MappedBuffer allocate(File file, int initialCapacity, int maxCapacity) {
- return allocate(file, FileChannel.MapMode.READ_WRITE, initialCapacity, maxCapacity);
- }
-
- /**
- * Allocates a mapped buffer.
- * <p>
- * Memory will be mapped by opening and expanding the given {@link File} to the desired {@code count} and mapping the
- * file contents into memory via {@link FileChannel#map(FileChannel.MapMode, long, long)}.
- * <p>
- * The resulting buffer will have a capacity of {@code initialCapacity}. The underlying {@link MappedBytes} will be
- * initialized to the next power of {@code 2}. As bytes are written to the buffer, the buffer's capacity will double
- * as int as {@code maxCapacity > capacity}.
- *
- * @param file The file to map into memory. If the file doesn't exist it will be automatically created.
- * @param mode The mode with which to map the file.
- * @param initialCapacity The initial capacity of the buffer.
- * @param maxCapacity The maximum capacity of the buffer.
- * @return The mapped buffer.
- * @throws NullPointerException If {@code file} is {@code null}
- * @throws IllegalArgumentException If the {@code capacity} or {@code maxCapacity} is greater than
- * {@link Integer#MAX_VALUE}.
- * @see #allocate(File)
- * @see #allocate(File, FileChannel.MapMode)
- * @see #allocate(File, int)
- * @see #allocate(File, FileChannel.MapMode, int)
- * @see #allocate(File, int, int)
- */
- public static MappedBuffer allocate(File file, FileChannel.MapMode mode, int initialCapacity, int maxCapacity) {
- checkNotNull(file, "file cannot be null");
- checkNotNull(mode, "mode cannot be null");
- checkArgument(initialCapacity <= maxCapacity, "initial capacity cannot be greater than maximum capacity");
- return new MappedBuffer(MappedBytes.allocate(file, mode, initialCapacity), 0, initialCapacity, maxCapacity);
- }
-
- protected MappedBuffer(MappedBytes bytes, int offset, int initialCapacity, int maxCapacity) {
- super(bytes, offset, initialCapacity, maxCapacity, null);
- }
-
- @Override
- public MappedBuffer duplicate() {
- return new MappedBuffer((MappedBytes) bytes, offset(), capacity(), maxCapacity());
- }
-
- /**
- * Deletes the underlying file.
- */
- public void delete() {
- ((MappedBytes) bytes).delete();
- }
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import io.atomix.utils.memory.BufferCleaner;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.nio.ByteBuffer;
-import java.nio.MappedByteBuffer;
-import java.nio.channels.FileChannel;
-import java.nio.file.Files;
-
-/**
- * {@link ByteBuffer} based mapped bytes.
- */
-public class MappedBytes extends ByteBufferBytes {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(MappedBytes.class);
-
- /**
- * Allocates a mapped buffer in {@link FileChannel.MapMode#READ_WRITE} mode.
- * <p>
- * Memory will be mapped by opening and expanding the given {@link File} to the desired {@code count} and mapping the
- * file contents into memory via {@link FileChannel#map(FileChannel.MapMode, long, long)}.
- *
- * @param file The file to map into memory. If the file doesn't exist it will be automatically created.
- * @param size The count of the buffer to allocate (in bytes).
- * @return The mapped buffer.
- * @throws NullPointerException If {@code file} is {@code null}
- * @throws IllegalArgumentException If {@code count} is greater than {@link MappedBytes#MAX_SIZE}
- * @see #allocate(File, FileChannel.MapMode, int)
- */
- public static MappedBytes allocate(File file, int size) {
- return allocate(file, FileChannel.MapMode.READ_WRITE, size);
- }
-
- /**
- * Allocates a mapped buffer.
- * <p>
- * Memory will be mapped by opening and expanding the given {@link File} to the desired {@code count} and mapping the
- * file contents into memory via {@link FileChannel#map(FileChannel.MapMode, long, long)}.
- *
- * @param file The file to map into memory. If the file doesn't exist it will be automatically created.
- * @param mode The mode with which to map the file.
- * @param size The count of the buffer to allocate (in bytes).
- * @return The mapped buffer.
- * @throws NullPointerException If {@code file} is {@code null}
- * @throws IllegalArgumentException If {@code count} is greater than {@link Integer#MAX_VALUE}
- * @see #allocate(File, int)
- */
- public static MappedBytes allocate(File file, FileChannel.MapMode mode, int size) {
- return FileBytes.allocate(file, size).map(0, size, mode);
- }
-
- private final File file;
- private final RandomAccessFile randomAccessFile;
- private final FileChannel.MapMode mode;
-
- protected MappedBytes(File file, RandomAccessFile randomAccessFile, MappedByteBuffer buffer, FileChannel.MapMode mode) {
- super(buffer);
- this.file = file;
- this.randomAccessFile = randomAccessFile;
- this.mode = mode;
- }
-
- @Override
- protected ByteBuffer newByteBuffer(int size) {
- try {
- return randomAccessFile.getChannel().map(mode, 0, size);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public boolean isDirect() {
- return true;
- }
-
- @Override
- public Bytes flush() {
- ((MappedByteBuffer) buffer).force();
- return this;
- }
-
- @Override
- public void close() {
- try {
- BufferCleaner.freeBuffer(buffer);
- } catch (Exception e) {
- if (LOGGER.isDebugEnabled()) {
- LOGGER.debug("Failed to unmap direct buffer", e);
- }
- }
- try {
- randomAccessFile.close();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- super.close();
- }
-
- /**
- * Deletes the underlying file.
- */
- public void delete() {
- try {
- close();
- Files.delete(file.toPath());
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- private static String parseMode(FileChannel.MapMode mode) {
- if (mode == FileChannel.MapMode.READ_ONLY) {
- return "r";
- } else if (mode == FileChannel.MapMode.READ_WRITE) {
- return "rw";
- }
- throw new IllegalArgumentException("unsupported map mode");
- }
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import io.atomix.utils.concurrent.ReferencePool;
-
-/**
- * Pooled buffer allocator.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public abstract class PooledAllocator implements BufferAllocator {
- private final ReferencePool<AbstractBuffer> pool;
-
- protected PooledAllocator(ReferencePool<AbstractBuffer> pool) {
- this.pool = pool;
- }
-
- /**
- * Returns the maximum buffer capacity.
- *
- * @return The maximum buffer capacity.
- */
- protected abstract int maxCapacity();
-
- @Override
- public Buffer allocate() {
- return allocate(4096, maxCapacity());
- }
-
- @Override
- public Buffer allocate(int capacity) {
- return allocate(capacity, maxCapacity());
- }
-
- @Override
- public Buffer allocate(int initialCapacity, int maxCapacity) {
- return pool.acquire().reset(0, initialCapacity, maxCapacity).clear();
- }
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import io.atomix.utils.concurrent.ReferenceManager;
-
-import java.nio.ReadOnlyBufferException;
-
-/**
- * Read-only buffer.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public class ReadOnlyBuffer extends AbstractBuffer {
- private final Buffer root;
-
- public ReadOnlyBuffer(Buffer buffer, ReferenceManager<Buffer> referenceManager) {
- super(buffer.bytes(), referenceManager);
- this.root = buffer;
- }
-
- @Override
- public boolean isDirect() {
- return root.isDirect();
- }
-
- @Override
- public boolean isFile() {
- return root.isFile();
- }
-
- @Override
- public boolean isReadOnly() {
- return true;
- }
-
- @Override
- public Buffer compact() {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- protected void compact(int from, int to, int length) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer duplicate() {
- return new ReadOnlyBuffer(root, referenceManager);
- }
-
- @Override
- public Buffer acquire() {
- root.acquire();
- return this;
- }
-
- @Override
- public boolean release() {
- return root.release();
- }
-
- @Override
- public Buffer zero(int offset, int length) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer zero(int offset) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer zero() {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer writeBoolean(int offset, boolean b) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer write(Buffer buffer) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer write(Bytes bytes) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer write(Bytes bytes, int offset, int length) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer write(int offset, Bytes bytes, int srcOffset, int length) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer write(byte[] bytes) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer write(byte[] bytes, int offset, int length) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer write(int offset, byte[] bytes, int srcOffset, int length) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer writeByte(int b) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer writeByte(int offset, int b) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer writeUnsignedByte(int b) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer writeUnsignedByte(int offset, int b) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer writeChar(char c) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer writeChar(int offset, char c) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer writeShort(short s) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer writeShort(int offset, short s) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer writeUnsignedShort(int s) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer writeUnsignedShort(int offset, int s) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer writeMedium(int m) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer writeMedium(int offset, int m) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer writeUnsignedMedium(int m) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer writeUnsignedMedium(int offset, int m) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer writeInt(int i) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer writeInt(int offset, int i) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer writeUnsignedInt(long i) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer writeUnsignedInt(int offset, long i) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer writeLong(long l) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer writeLong(int offset, long l) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer writeFloat(float f) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer writeFloat(int offset, float f) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer writeDouble(double d) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer writeDouble(int offset, double d) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer writeBoolean(boolean b) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer writeUTF8(String s) {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public Buffer flush() {
- throw new ReadOnlyBufferException();
- }
-
- @Override
- public void close() {
- root.release();
- }
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-/**
- * Sliced buffer.
- * <p>
- * The sliced buffer provides a view of a subset of an underlying buffer. This buffer operates directly on the {@link Bytes}
- * underlying the child {@link Buffer} instance.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public class SlicedBuffer extends AbstractBuffer {
- private final Buffer root;
-
- public SlicedBuffer(Buffer root, Bytes bytes, int offset, int initialCapacity, int maxCapacity) {
- super(bytes, offset, initialCapacity, maxCapacity, null);
- this.root = root;
- root.acquire();
- }
-
- /**
- * Returns the root buffer.
- *
- * @return The root buffer.
- */
- public Buffer root() {
- return root;
- }
-
- @Override
- public boolean isDirect() {
- return root.isDirect();
- }
-
- @Override
- protected void compact(int from, int to, int length) {
- if (root instanceof AbstractBuffer) {
- ((AbstractBuffer) root).compact(from, to, length);
- }
- }
-
- @Override
- public boolean isFile() {
- return root.isFile();
- }
-
- @Override
- public boolean isReadOnly() {
- return root.isReadOnly();
- }
-
- @Override
- public Buffer compact() {
- return null;
- }
-
- @Override
- public Buffer duplicate() {
- return new SlicedBuffer(root, bytes, offset(), capacity(), maxCapacity());
- }
-
- @Override
- public Buffer acquire() {
- root.acquire();
- return this;
- }
-
- @Override
- public boolean release() {
- return root.release();
- }
-
- @Override
- public void close() {
- root.release();
- }
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import io.atomix.utils.concurrent.ReferenceManager;
-
-import java.nio.ByteOrder;
-
-/**
- * Byte order swapped buffer.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public class SwappedBuffer extends AbstractBuffer {
- private final Buffer root;
-
- SwappedBuffer(Buffer root, Bytes bytes, ReferenceManager<Buffer> referenceManager) {
- super(bytes, referenceManager);
- this.root = root;
- }
-
- public SwappedBuffer(Buffer buffer, int offset, int initialCapacity, int maxCapacity, ReferenceManager<Buffer> referenceManager) {
- super(buffer.bytes().order(buffer.order() == ByteOrder.BIG_ENDIAN ? ByteOrder.LITTLE_ENDIAN : ByteOrder.BIG_ENDIAN), offset, initialCapacity, maxCapacity, referenceManager);
- this.root = buffer instanceof SwappedBuffer ? ((SwappedBuffer) buffer).root : buffer;
- root.acquire();
- }
-
- /**
- * Returns the root buffer.
- *
- * @return The root buffer.
- */
- public Buffer root() {
- return root;
- }
-
- @Override
- public boolean isDirect() {
- return root.isDirect();
- }
-
- @Override
- public boolean isFile() {
- return root.isFile();
- }
-
- @Override
- public boolean isReadOnly() {
- return root.isReadOnly();
- }
-
- @Override
- protected void compact(int from, int to, int length) {
- if (root instanceof AbstractBuffer) {
- ((AbstractBuffer) root).compact(from, to, length);
- }
- }
-
- @Override
- public Buffer duplicate() {
- return new SwappedBuffer(root, offset(), capacity(), maxCapacity(), referenceManager);
- }
-
- @Override
- public Buffer acquire() {
- root.acquire();
- return this;
- }
-
- @Override
- public boolean release() {
- return root.release();
- }
-
- @Override
- public void close() {
- root.release();
- }
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import java.nio.ByteOrder;
-
-/**
- * Bytes in swapped order.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public class SwappedBytes extends WrappedBytes {
-
- public SwappedBytes(Bytes bytes) {
- super(bytes);
- }
-
- @Override
- public ByteOrder order() {
- return bytes.order() == ByteOrder.BIG_ENDIAN ? ByteOrder.LITTLE_ENDIAN : ByteOrder.BIG_ENDIAN;
- }
-
- @Override
- public char readChar(int offset) {
- return Character.reverseBytes(bytes.readChar(offset));
- }
-
- @Override
- public short readShort(int offset) {
- return Short.reverseBytes(bytes.readShort(offset));
- }
-
- @Override
- public int readUnsignedShort(int offset) {
- return Short.reverseBytes(bytes.readShort(offset)) & 0xFFFF;
- }
-
- @Override
- public int readMedium(int offset) {
- return Integer.reverseBytes(bytes.readMedium(offset));
- }
-
- @Override
- public int readUnsignedMedium(int offset) {
- return Integer.reverseBytes(bytes.readUnsignedMedium(offset));
- }
-
- @Override
- public int readInt(int offset) {
- return Integer.reverseBytes(bytes.readInt(offset));
- }
-
- @Override
- public long readUnsignedInt(int offset) {
- return Integer.reverseBytes(bytes.readInt(offset)) & 0xFFFFFFFFL;
- }
-
- @Override
- public long readLong(int offset) {
- return Long.reverseBytes(bytes.readLong(offset));
- }
-
- @Override
- public float readFloat(int offset) {
- return Float.intBitsToFloat(readInt(offset));
- }
-
- @Override
- public double readDouble(int offset) {
- return Double.longBitsToDouble(readLong(offset));
- }
-
- @Override
- public Bytes writeChar(int offset, char c) {
- bytes.writeChar(offset, Character.reverseBytes(c));
- return this;
- }
-
- @Override
- public Bytes writeShort(int offset, short s) {
- bytes.writeShort(offset, Short.reverseBytes(s));
- return this;
- }
-
- @Override
- public Bytes writeUnsignedShort(int offset, int s) {
- bytes.writeUnsignedShort(offset, Short.reverseBytes((short) s));
- return this;
- }
-
- @Override
- public Bytes writeMedium(int offset, int m) {
- bytes.writeMedium(offset, Integer.reverseBytes(m));
- return this;
- }
-
- @Override
- public Bytes writeUnsignedMedium(int offset, int m) {
- bytes.writeUnsignedMedium(offset, Integer.reverseBytes(m));
- return this;
- }
-
- @Override
- public Bytes writeInt(int offset, int i) {
- bytes.writeInt(offset, Integer.reverseBytes(i));
- return this;
- }
-
- @Override
- public Bytes writeUnsignedInt(int offset, long i) {
- bytes.writeUnsignedInt(offset, Integer.reverseBytes((int) i));
- return this;
- }
-
- @Override
- public Bytes writeLong(int offset, long l) {
- bytes.writeLong(offset, Long.reverseBytes(l));
- return this;
- }
-
- @Override
- public Bytes writeFloat(int offset, float f) {
- return writeInt(offset, Float.floatToRawIntBits(f));
- }
-
- @Override
- public Bytes writeDouble(int offset, double d) {
- return writeLong(offset, Double.doubleToRawLongBits(d));
- }
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-/**
- * Unpooled buffer allocator.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public abstract class UnpooledAllocator implements BufferAllocator {
-
- /**
- * Returns the maximum buffer capacity.
- *
- * @return The maximum buffer capacity.
- */
- protected abstract int maxCapacity();
-
- @Override
- public Buffer allocate() {
- return allocate(4096, maxCapacity());
- }
-
- @Override
- public Buffer allocate(int capacity) {
- return allocate(capacity, capacity);
- }
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-/**
- * Unpooled direct allocator.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public class UnpooledDirectAllocator extends UnpooledAllocator {
-
- @Override
- public Buffer allocate(int initialCapacity, int maxCapacity) {
- return DirectBuffer.allocate(initialCapacity, maxCapacity);
- }
-
- @Override
- protected int maxCapacity() {
- return Integer.MAX_VALUE;
- }
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-/**
- * Unpooled heap allocator.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public class UnpooledHeapAllocator extends UnpooledAllocator {
-
- @Override
- protected int maxCapacity() {
- return HeapBuffer.MAX_SIZE;
- }
-
- @Override
- public Buffer allocate(int initialCapacity, int maxCapacity) {
- return HeapBuffer.allocate(initialCapacity, maxCapacity);
- }
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import java.nio.ByteOrder;
-
-/**
- * Wrapped bytes.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public class WrappedBytes extends AbstractBytes {
- protected final Bytes bytes;
- private final Bytes root;
-
- public WrappedBytes(Bytes bytes) {
- if (bytes == null) {
- throw new NullPointerException("bytes cannot be null");
- }
- this.bytes = bytes;
- this.root = bytes instanceof WrappedBytes ? ((WrappedBytes) bytes).root : bytes;
- }
-
- /**
- * Returns the root bytes.
- */
- public Bytes root() {
- return root;
- }
-
- @Override
- public int size() {
- return bytes.size();
- }
-
- @Override
- public Bytes resize(int newSize) {
- return bytes.resize(newSize);
- }
-
- @Override
- public ByteOrder order() {
- return bytes.order();
- }
-
- @Override
- public Bytes zero() {
- bytes.zero();
- return this;
- }
-
- @Override
- public Bytes zero(int offset) {
- bytes.zero(offset);
- return this;
- }
-
- @Override
- public Bytes zero(int offset, int length) {
- bytes.zero(offset, length);
- return this;
- }
-
- @Override
- public Bytes read(int offset, Bytes dst, int dstOffset, int length) {
- bytes.read(offset, dst, dstOffset, length);
- return this;
- }
-
- @Override
- public Bytes read(int offset, byte[] dst, int dstOffset, int length) {
- bytes.read(offset, dst, dstOffset, length);
- return this;
- }
-
- @Override
- public int readByte(int offset) {
- return bytes.readByte(offset);
- }
-
- @Override
- public int readUnsignedByte(int offset) {
- return bytes.readUnsignedByte(offset);
- }
-
- @Override
- public char readChar(int offset) {
- return bytes.readChar(offset);
- }
-
- @Override
- public short readShort(int offset) {
- return bytes.readShort(offset);
- }
-
- @Override
- public int readUnsignedShort(int offset) {
- return bytes.readUnsignedShort(offset);
- }
-
- @Override
- public int readMedium(int offset) {
- return bytes.readMedium(offset);
- }
-
- @Override
- public int readUnsignedMedium(int offset) {
- return bytes.readUnsignedMedium(offset);
- }
-
- @Override
- public int readInt(int offset) {
- return bytes.readInt(offset);
- }
-
- @Override
- public long readUnsignedInt(int offset) {
- return bytes.readUnsignedInt(offset);
- }
-
- @Override
- public long readLong(int offset) {
- return bytes.readLong(offset);
- }
-
- @Override
- public float readFloat(int offset) {
- return bytes.readFloat(offset);
- }
-
- @Override
- public double readDouble(int offset) {
- return bytes.readDouble(offset);
- }
-
- @Override
- public boolean readBoolean(int offset) {
- return bytes.readBoolean(offset);
- }
-
- @Override
- public String readString(int offset) {
- return bytes.readString(offset);
- }
-
- @Override
- public String readUTF8(int offset) {
- return bytes.readUTF8(offset);
- }
-
- @Override
- public Bytes write(int offset, Bytes src, int srcOffset, int length) {
- bytes.write(offset, src, srcOffset, length);
- return this;
- }
-
- @Override
- public Bytes write(int offset, byte[] src, int srcOffset, int length) {
- bytes.write(offset, src, srcOffset, length);
- return this;
- }
-
- @Override
- public Bytes writeByte(int offset, int b) {
- bytes.writeByte(offset, b);
- return this;
- }
-
- @Override
- public Bytes writeUnsignedByte(int offset, int b) {
- bytes.writeUnsignedByte(offset, b);
- return this;
- }
-
- @Override
- public Bytes writeChar(int offset, char c) {
- bytes.writeChar(offset, c);
- return this;
- }
-
- @Override
- public Bytes writeShort(int offset, short s) {
- bytes.writeShort(offset, s);
- return this;
- }
-
- @Override
- public Bytes writeUnsignedShort(int offset, int s) {
- bytes.writeUnsignedShort(offset, s);
- return this;
- }
-
- @Override
- public Bytes writeMedium(int offset, int m) {
- bytes.writeMedium(offset, m);
- return this;
- }
-
- @Override
- public Bytes writeUnsignedMedium(int offset, int m) {
- bytes.writeUnsignedMedium(offset, m);
- return this;
- }
-
- @Override
- public Bytes writeInt(int offset, int i) {
- bytes.writeInt(offset, i);
- return this;
- }
-
- @Override
- public Bytes writeUnsignedInt(int offset, long i) {
- bytes.writeUnsignedInt(offset, i);
- return this;
- }
-
- @Override
- public Bytes writeLong(int offset, long l) {
- bytes.writeLong(offset, l);
- return this;
- }
-
- @Override
- public Bytes writeFloat(int offset, float f) {
- bytes.writeFloat(offset, f);
- return this;
- }
-
- @Override
- public Bytes writeDouble(int offset, double d) {
- bytes.writeDouble(offset, d);
- return this;
- }
-
- @Override
- public Bytes writeBoolean(int offset, boolean b) {
- bytes.writeBoolean(offset, b);
- return this;
- }
-
- @Override
- public Bytes writeString(int offset, String s) {
- bytes.writeString(offset, s);
- return this;
- }
-
- @Override
- public Bytes writeUTF8(int offset, String s) {
- bytes.writeUTF8(offset, s);
- return this;
- }
-
- @Override
- public Bytes flush() {
- bytes.flush();
- return this;
- }
-
- @Override
- public void close() {
- bytes.close();
- }
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * Provides a low-level {@link io.atomix.storage.buffer.Buffer} abstraction backed by on- or off-heap memory, memory mapped
- * files, or {@link java.io.RandomAccessFile}.
- */
-package io.atomix.storage.buffer;
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import org.junit.Test;
-
-import java.nio.BufferOverflowException;
-import java.nio.BufferUnderflowException;
-import java.nio.ByteOrder;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-/**
- * Base buffer test.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public abstract class BufferTest {
-
- /**
- * Creates a new test buffer.
- */
- protected abstract Buffer createBuffer(int capacity);
-
- /**
- * Creates a new test buffer.
- */
- protected abstract Buffer createBuffer(int capacity, int maxCapacity);
-
- @Test
- public void testPosition() {
- Buffer buffer = createBuffer(8);
- assertEquals(0, buffer.position());
- buffer.writeInt(10);
- assertEquals(4, buffer.position());
- buffer.position(0);
- assertEquals(0, buffer.position());
- assertEquals(10, buffer.readInt());
- }
-
- @Test
- public void testFlip() {
- Buffer buffer = createBuffer(8);
- buffer.writeInt(10);
- assertEquals(4, buffer.position());
- assertEquals(8, buffer.capacity());
- assertEquals(-1, buffer.limit());
- assertEquals(8, buffer.capacity());
- buffer.flip();
- assertEquals(4, buffer.limit());
- assertEquals(0, buffer.position());
- }
-
- @Test
- public void testLimit() {
- Buffer buffer = createBuffer(8);
- assertEquals(0, buffer.position());
- assertEquals(-1, buffer.limit());
- assertEquals(8, buffer.capacity());
- buffer.limit(4);
- assertEquals(4, buffer.limit());
- assertTrue(buffer.hasRemaining());
- buffer.writeInt(10);
- assertEquals(0, buffer.remaining());
- assertFalse(buffer.hasRemaining());
- }
-
- @Test
- public void testClear() {
- Buffer buffer = createBuffer(8);
- buffer.limit(6);
- assertEquals(6, buffer.limit());
- buffer.writeInt(10);
- assertEquals(4, buffer.position());
- buffer.clear();
- assertEquals(-1, buffer.limit());
- assertEquals(8, buffer.capacity());
- assertEquals(0, buffer.position());
- }
-
- @Test
- public void testMarkReset() {
- assertTrue(createBuffer(12).writeInt(10).mark().writeBoolean(true).reset().readBoolean());
- }
-
- @Test(expected = BufferUnderflowException.class)
- public void testReadIntThrowsBufferUnderflowWithNoRemainingBytesRelative() {
- createBuffer(4, 4)
- .writeInt(10)
- .readInt();
- }
-
- @Test(expected = BufferUnderflowException.class)
- public void testReadIntThrowsBufferUnderflowWithNoRemainingBytesAbsolute() {
- createBuffer(4, 4).readInt(2);
- }
-
- @Test(expected = BufferOverflowException.class)
- public void testWriteIntThrowsBufferOverflowWithNoRemainingBytesRelative() {
- createBuffer(4, 4).writeInt(10).writeInt(20);
- }
-
- @Test(expected = BufferOverflowException.class)
- public void testReadIntThrowsBufferOverflowWithNoRemainingBytesAbsolute() {
- createBuffer(4, 4).writeInt(4, 10);
- }
-
- @Test(expected = IndexOutOfBoundsException.class)
- public void testReadIntThrowsIndexOutOfBounds() {
- createBuffer(4, 4).readInt(10);
- }
-
- @Test(expected = IndexOutOfBoundsException.class)
- public void testWriteIntThrowsIndexOutOfBounds() {
- createBuffer(4, 4).writeInt(10, 10);
- }
-
- @Test
- public void testWriteReadByteRelative() {
- assertEquals(10, createBuffer(16).writeByte(10).flip().readByte());
- }
-
- @Test
- public void testWriteReadByteAbsolute() {
- assertEquals(10, createBuffer(16).writeByte(4, 10).readByte(4));
- }
-
- @Test
- public void testWriteReadUnsignedByteRelative() {
- assertEquals(10, createBuffer(16).writeUnsignedByte(10).flip().readUnsignedByte());
- }
-
- @Test
- public void testWriteReadUnsignedByteAbsolute() {
- assertEquals(10, createBuffer(16).writeUnsignedByte(4, 10).readUnsignedByte(4));
- }
-
- @Test
- public void testWriteReadShortRelative() {
- assertEquals(10, createBuffer(16).writeShort((short) 10).flip().readShort());
- }
-
- @Test
- public void testWriteReadShortAbsolute() {
- assertEquals(10, createBuffer(16).writeShort(4, (short) 10).readShort(4));
- }
-
- @Test
- public void testWriteReadUnsignedShortRelative() {
- assertEquals(10, createBuffer(16).writeUnsignedShort((short) 10).flip().readUnsignedShort());
- }
-
- @Test
- public void testWriteReadUnsignedShortAbsolute() {
- assertEquals(10, createBuffer(16).writeUnsignedShort(4, (short) 10).readUnsignedShort(4));
- }
-
- @Test
- public void testWriteReadIntRelative() {
- assertEquals(10, createBuffer(16).writeInt(10).flip().readInt());
- }
-
- @Test
- public void testWriteReadUnsignedIntAbsolute() {
- assertEquals(10, createBuffer(16).writeUnsignedInt(4, 10).readUnsignedInt(4));
- }
-
- @Test
- public void testWriteReadUnsignedIntRelative() {
- assertEquals(10, createBuffer(16).writeUnsignedInt(10).flip().readUnsignedInt());
- }
-
- @Test
- public void testWriteReadIntAbsolute() {
- assertEquals(10, createBuffer(16).writeInt(4, 10).readInt(4));
- }
-
- @Test
- public void testWriteReadLongRelative() {
- assertEquals(12345, createBuffer(16).writeLong(12345).flip().readLong());
- }
-
- @Test
- public void testWriteReadLongAbsolute() {
- assertEquals(12345, createBuffer(16).writeLong(4, 12345).readLong(4));
- }
-
- @Test
- public void testWriteReadFloatRelative() {
- assertEquals(10.6f, createBuffer(16).writeFloat(10.6f).flip().readFloat(), .001);
- }
-
- @Test
- public void testWriteReadFloatAbsolute() {
- assertEquals(10.6f, createBuffer(16).writeFloat(4, 10.6f).readFloat(4), .001);
- }
-
- @Test
- public void testWriteReadDoubleRelative() {
- assertEquals(10.6, createBuffer(16).writeDouble(10.6).flip().readDouble(), .001);
- }
-
- @Test
- public void testWriteReadDoubleAbsolute() {
- assertEquals(10.6, createBuffer(16).writeDouble(4, 10.6).readDouble(4), .001);
- }
-
- @Test
- public void testWriteReadBooleanRelative() {
- assertTrue(createBuffer(16).writeBoolean(true).flip().readBoolean());
- }
-
- @Test
- public void testWriteReadBooleanAbsolute() {
- assertTrue(createBuffer(16).writeBoolean(4, true).readBoolean(4));
- }
-
- @Test
- public void testWriteReadStringRelative() {
- Buffer buffer = createBuffer(38)
- .writeString("Hello world!")
- .writeString("Hello world again!")
- .flip();
- assertEquals("Hello world!", buffer.readString());
- assertEquals("Hello world again!", buffer.readString());
- }
-
- @Test
- public void testWriteReadStringAbsolute() {
- Buffer buffer = createBuffer(46)
- .writeString(4, "Hello world!")
- .writeString(20, "Hello world again!");
- assertEquals("Hello world!", buffer.readString(4));
- assertEquals("Hello world again!", buffer.readString(20));
- }
-
- @Test
- public void testWriteReadUTF8Relative() {
- Buffer buffer = createBuffer(38)
- .writeUTF8("Hello world!")
- .writeUTF8("Hello world again!")
- .flip();
- assertEquals("Hello world!", buffer.readUTF8());
- assertEquals("Hello world again!", buffer.readUTF8());
- }
-
- @Test
- public void testWriteReadUTF8Absolute() {
- Buffer buffer = createBuffer(46)
- .writeUTF8(4, "Hello world!")
- .writeUTF8(20, "Hello world again!");
- assertEquals("Hello world!", buffer.readUTF8(4));
- assertEquals("Hello world again!", buffer.readUTF8(20));
- }
-
- @Test
- public void testReadWriter() {
- Buffer writeBuffer = createBuffer(8).writeLong(10).flip();
- Buffer readBuffer = createBuffer(8);
- writeBuffer.read(readBuffer);
- assertEquals(10, readBuffer.flip().readLong());
- }
-
- @Test
- public void testWriteReadSwappedIntRelative() {
- assertEquals(10, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeInt(10).flip().readInt());
- }
-
- @Test
- public void testWriteReadSwappedIntAbsolute() {
- assertEquals(10, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeInt(4, 10).readInt(4));
- }
-
- @Test
- public void testAbsoluteSlice() {
- Buffer buffer = createBuffer(1024);
- buffer.writeLong(10).writeLong(11).rewind();
- Buffer slice = buffer.slice(8, 1016);
- assertEquals(0, slice.position());
- assertEquals(11, slice.readLong());
- }
-
- @Test
- public void testRelativeSliceWithoutLength() {
- Buffer buffer = createBuffer(1024, 1024);
- buffer.writeLong(10).writeLong(11).writeLong(12).rewind();
- assertEquals(10, buffer.readLong());
- Buffer slice = buffer.slice();
- assertEquals(0, slice.position());
- assertEquals(-1, slice.limit());
- assertEquals(1016, slice.capacity());
- assertEquals(1016, slice.maxCapacity());
- assertEquals(11, slice.readLong());
- assertEquals(11, slice.readLong(0));
- slice.close();
- Buffer slice2 = buffer.skip(8).slice();
- assertEquals(0, slice2.position());
- assertEquals(-1, slice2.limit());
- assertEquals(1008, slice2.capacity());
- assertEquals(1008, slice2.maxCapacity());
- assertEquals(12, slice2.readLong());
- assertEquals(12, slice2.readLong(0));
- }
-
- @Test
- public void testRelativeSliceWithLength() {
- Buffer buffer = createBuffer(1024);
- buffer.writeLong(10).writeLong(11).writeLong(12).rewind();
- assertEquals(10, buffer.readLong());
- Buffer slice = buffer.slice(8);
- assertEquals(0, slice.position());
- assertEquals(11, slice.readLong());
- assertEquals(11, slice.readLong(0));
- slice.close();
- Buffer slice2 = buffer.skip(8).slice(8);
- assertEquals(0, slice2.position());
- assertEquals(12, slice2.readLong());
- assertEquals(12, slice2.readLong(0));
- slice2.close();
- }
-
- @Test
- public void testSliceOfSlice() {
- Buffer buffer = createBuffer(1024);
- buffer.writeLong(10).writeLong(11).writeLong(12).rewind();
- assertEquals(10, buffer.readLong());
- Buffer slice = buffer.slice();
- assertEquals(11, slice.readLong());
- Buffer sliceOfSlice = slice.slice();
- assertEquals(12, sliceOfSlice.readLong());
- assertEquals(8, sliceOfSlice.position());
- }
-
- @Test
- public void testSliceWithLimit() {
- Buffer buffer = createBuffer(1024).limit(16);
- buffer.writeLong(10);
- Buffer slice = buffer.slice();
- assertEquals(0, slice.position());
- assertEquals(8, slice.capacity());
- assertEquals(8, slice.maxCapacity());
- assertEquals(8, slice.remaining());
- }
-
- @Test
- public void testSliceWithLittleRemaining() {
- Buffer buffer = createBuffer(1024, 2048);
- buffer.position(1020);
- Buffer slice = buffer.slice(8);
- assertEquals(0, slice.position());
- assertEquals(-1, slice.limit());
- }
-
- @Test
- public void testCompact() {
- Buffer buffer = createBuffer(1024);
- buffer.position(100).writeLong(1234).position(100).compact();
- assertEquals(0, buffer.position());
- assertEquals(1234, buffer.readLong());
- }
-
- @Test
- public void testSwappedPosition() {
- Buffer buffer = createBuffer(8).order(ByteOrder.LITTLE_ENDIAN);
- assertEquals(0, buffer.position());
- buffer.writeInt(10);
- assertEquals(4, buffer.position());
- buffer.position(0);
- assertEquals(0, buffer.position());
- assertEquals(10, buffer.readInt());
- }
-
- @Test
- public void testSwappedFlip() {
- Buffer buffer = createBuffer(8).order(ByteOrder.LITTLE_ENDIAN);
- buffer.writeInt(10);
- assertEquals(4, buffer.position());
- assertEquals(8, buffer.capacity());
- assertEquals(-1, buffer.limit());
- assertEquals(8, buffer.capacity());
- buffer.flip();
- assertEquals(4, buffer.limit());
- assertEquals(0, buffer.position());
- }
-
- @Test
- public void testSwappedLimit() {
- Buffer buffer = createBuffer(8).order(ByteOrder.LITTLE_ENDIAN);
- assertEquals(0, buffer.position());
- assertEquals(-1, buffer.limit());
- assertEquals(8, buffer.capacity());
- buffer.limit(4);
- assertEquals(4, buffer.limit());
- assertTrue(buffer.hasRemaining());
- buffer.writeInt(10);
- assertEquals(0, buffer.remaining());
- assertFalse(buffer.hasRemaining());
- }
-
- @Test
- public void testSwappedClear() {
- Buffer buffer = createBuffer(8).order(ByteOrder.LITTLE_ENDIAN);
- buffer.limit(6);
- assertEquals(6, buffer.limit());
- buffer.writeInt(10);
- assertEquals(4, buffer.position());
- buffer.clear();
- assertEquals(-1, buffer.limit());
- assertEquals(8, buffer.capacity());
- assertEquals(0, buffer.position());
- }
-
- @Test
- public void testSwappedMarkReset() {
- assertTrue(createBuffer(12).order(ByteOrder.LITTLE_ENDIAN).writeInt(10).mark().writeBoolean(true).reset().readBoolean());
- }
-
- @Test(expected = BufferUnderflowException.class)
- public void testSwappedReadIntThrowsBufferUnderflowWithNoRemainingBytesRelative() {
- createBuffer(4, 4).order(ByteOrder.LITTLE_ENDIAN)
- .writeInt(10)
- .readInt();
- }
-
- @Test(expected = BufferUnderflowException.class)
- public void testSwappedReadIntThrowsBufferUnderflowWithNoRemainingBytesAbsolute() {
- createBuffer(4, 4).order(ByteOrder.LITTLE_ENDIAN).readInt(2);
- }
-
- @Test(expected = BufferOverflowException.class)
- public void testSwappedWriteIntThrowsBufferOverflowWithNoRemainingBytesRelative() {
- createBuffer(4, 4).order(ByteOrder.LITTLE_ENDIAN).writeInt(10).writeInt(20);
- }
-
- @Test(expected = BufferOverflowException.class)
- public void testSwappedReadIntThrowsBufferOverflowWithNoRemainingBytesAbsolute() {
- createBuffer(4, 4).order(ByteOrder.LITTLE_ENDIAN).writeInt(4, 10);
- }
-
- @Test(expected = IndexOutOfBoundsException.class)
- public void testSwappedReadIntThrowsIndexOutOfBounds() {
- createBuffer(4, 4).order(ByteOrder.LITTLE_ENDIAN).readInt(10);
- }
-
- @Test(expected = IndexOutOfBoundsException.class)
- public void testSwappedWriteIntThrowsIndexOutOfBounds() {
- createBuffer(4, 4).order(ByteOrder.LITTLE_ENDIAN).writeInt(10, 10);
- }
-
- @Test
- public void testSwappedWriteReadByteRelative() {
- assertEquals(10, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeByte(10).flip().readByte());
- }
-
- @Test
- public void testSwappedWriteReadByteAbsolute() {
- assertEquals(10, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeByte(4, 10).readByte(4));
- }
-
- @Test
- public void testSwappedWriteReadUnsignedByteRelative() {
- assertEquals(10, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeUnsignedByte(10).flip().readUnsignedByte());
- }
-
- @Test
- public void testSwappedWriteReadUnsignedByteAbsolute() {
- assertEquals(10, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeUnsignedByte(4, 10).readUnsignedByte(4));
- }
-
- @Test
- public void testSwappedWriteReadShortRelative() {
- assertEquals(10, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeShort((short) 10).flip().readShort());
- }
-
- @Test
- public void testSwappedWriteReadShortAbsolute() {
- assertEquals(10, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeShort(4, (short) 10).readShort(4));
- }
-
- @Test
- public void testSwappedWriteReadUnsignedShortRelative() {
- assertEquals(10, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeUnsignedShort((short) 10).flip().readUnsignedShort());
- }
-
- @Test
- public void testSwappedWriteReadUnsignedShortAbsolute() {
- assertEquals(10, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeUnsignedShort(4, (short) 10).readUnsignedShort(4));
- }
-
- @Test
- public void testSwappedWriteReadIntRelative() {
- assertEquals(10, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeInt(10).flip().readInt());
- }
-
- @Test
- public void testSwappedWriteReadUnsignedIntAbsolute() {
- assertEquals(10, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeUnsignedInt(4, 10).readUnsignedInt(4));
- }
-
- @Test
- public void testSwappedWriteReadUnsignedIntRelative() {
- assertEquals(10, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeUnsignedInt(10).flip().readUnsignedInt());
- }
-
- @Test
- public void testSwappedWriteReadIntAbsolute() {
- assertEquals(10, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeInt(4, 10).readInt(4));
- }
-
- @Test
- public void testSwappedWriteReadLongRelative() {
- assertEquals(12345, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeLong(12345).flip().readLong());
- }
-
- @Test
- public void testSwappedWriteReadLongAbsolute() {
- assertEquals(12345, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeLong(4, 12345).readLong(4));
- }
-
- @Test
- public void testSwappedWriteReadFloatRelative() {
- assertEquals(10.6f, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeFloat(10.6f).flip().readFloat(), .001);
- }
-
- @Test
- public void testSwappedWriteReadFloatAbsolute() {
- assertEquals(10.6f, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeFloat(4, 10.6f).readFloat(4), .001);
- }
-
- @Test
- public void testSwappedWriteReadDoubleRelative() {
- assertEquals(10.6, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeDouble(10.6).flip().readDouble(), .001);
- }
-
- @Test
- public void testSwappedWriteReadDoubleAbsolute() {
- assertEquals(10.6, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeDouble(4, 10.6).readDouble(4), .001);
- }
-
- @Test
- public void testSwappedWriteReadBooleanRelative() {
- assertTrue(createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeBoolean(true).flip().readBoolean());
- }
-
- @Test
- public void testSwappedWriteReadBooleanAbsolute() {
- assertTrue(createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeBoolean(4, true).readBoolean(4));
- }
-
- @Test
- public void testSwappedReadWriter() {
- Buffer writeBuffer = createBuffer(8).order(ByteOrder.LITTLE_ENDIAN).writeLong(10).flip();
- Buffer readBuffer = createBuffer(8).order(ByteOrder.LITTLE_ENDIAN);
- writeBuffer.read(readBuffer);
- assertEquals(10, readBuffer.flip().readLong());
- }
-
- @Test
- public void testSwappedAbsoluteSlice() {
- Buffer buffer = createBuffer(1024).order(ByteOrder.LITTLE_ENDIAN);
- buffer.writeLong(10).writeLong(11).rewind();
- Buffer slice = buffer.slice(8, 1016);
- assertEquals(0, slice.position());
- assertEquals(11, slice.readLong());
- }
-
- @Test
- public void testSwappedRelativeSliceWithoutLength() {
- Buffer buffer = createBuffer(1024, 1024).order(ByteOrder.LITTLE_ENDIAN);
- buffer.writeLong(10).writeLong(11).writeLong(12).rewind();
- assertEquals(10, buffer.readLong());
- Buffer slice = buffer.slice();
- assertEquals(0, slice.position());
- assertEquals(-1, slice.limit());
- assertEquals(1016, slice.capacity());
- assertEquals(1016, slice.maxCapacity());
- assertEquals(11, slice.readLong());
- assertEquals(11, slice.readLong(0));
- slice.close();
- Buffer slice2 = buffer.skip(8).slice();
- assertEquals(0, slice2.position());
- assertEquals(-1, slice2.limit());
- assertEquals(1008, slice2.capacity());
- assertEquals(1008, slice2.maxCapacity());
- assertEquals(12, slice2.readLong());
- assertEquals(12, slice2.readLong(0));
- }
-
- @Test
- public void testSwappedRelativeSliceWithLength() {
- Buffer buffer = createBuffer(1024).order(ByteOrder.LITTLE_ENDIAN);
- buffer.writeLong(10).writeLong(11).writeLong(12).rewind();
- assertEquals(10, buffer.readLong());
- Buffer slice = buffer.slice(8);
- assertEquals(0, slice.position());
- assertEquals(11, slice.readLong());
- assertEquals(11, slice.readLong(0));
- slice.close();
- Buffer slice2 = buffer.skip(8).slice(8);
- assertEquals(0, slice2.position());
- assertEquals(12, slice2.readLong());
- assertEquals(12, slice2.readLong(0));
- slice2.close();
- }
-
- @Test
- public void testSwappedSliceOfSlice() {
- Buffer buffer = createBuffer(1024).order(ByteOrder.LITTLE_ENDIAN);
- buffer.writeLong(10).writeLong(11).writeLong(12).rewind();
- assertEquals(10, buffer.readLong());
- Buffer slice = buffer.slice();
- assertEquals(11, slice.readLong());
- Buffer sliceOfSlice = slice.slice();
- assertEquals(12, sliceOfSlice.readLong());
- assertEquals(8, sliceOfSlice.position());
- }
-
- @Test
- public void testSwappedSliceWithLimit() {
- Buffer buffer = createBuffer(1024).order(ByteOrder.LITTLE_ENDIAN).limit(16);
- buffer.writeLong(10);
- Buffer slice = buffer.slice();
- assertEquals(0, slice.position());
- assertEquals(8, slice.capacity());
- assertEquals(8, slice.maxCapacity());
- assertEquals(8, slice.remaining());
- }
-
- @Test
- public void testSwappedSliceWithLittleRemaining() {
- Buffer buffer = createBuffer(1024, 2048).order(ByteOrder.LITTLE_ENDIAN);
- buffer.position(1020);
- Buffer slice = buffer.slice(8);
- assertEquals(0, slice.position());
- assertEquals(-1, slice.limit());
- }
-
- @Test
- public void testSwappedCompact() {
- Buffer buffer = createBuffer(1024).order(ByteOrder.LITTLE_ENDIAN);
- buffer.position(100).writeLong(1234).position(100).compact();
- assertEquals(0, buffer.position());
- assertEquals(1234, buffer.readLong());
- }
-
- @Test
- public void testCapacity0Read() {
- Buffer buffer = createBuffer(0, 1024);
- assertEquals(0, buffer.readLong());
- }
-
- @Test
- public void testCapacity0Write() {
- Buffer buffer = createBuffer(0, 1024);
- buffer.writeLong(10);
- assertEquals(10, buffer.readLong(0));
- }
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import org.junit.Test;
-
-import java.nio.ByteBuffer;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-/**
- * Direct buffer test.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public class DirectBufferTest extends BufferTest {
-
- @Override
- protected Buffer createBuffer(int capacity) {
- return DirectBuffer.allocate(capacity);
- }
-
- @Override
- protected Buffer createBuffer(int capacity, int maxCapacity) {
- return DirectBuffer.allocate(capacity, maxCapacity);
- }
-
- @Test
- public void testByteBufferToDirectBuffer() {
- ByteBuffer byteBuffer = ByteBuffer.allocate(8);
- byteBuffer.putLong(10);
- byteBuffer.flip();
-
- DirectBuffer directBuffer = DirectBuffer.allocate(8);
- directBuffer.write(byteBuffer.array());
- directBuffer.flip();
- assertEquals(directBuffer.readLong(), byteBuffer.getLong());
- assertTrue(directBuffer.isDirect());
- directBuffer.release();
- }
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import org.junit.AfterClass;
-import org.junit.Test;
-
-import java.io.File;
-import java.nio.file.Files;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-/**
- * File buffer test.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public class FileBufferTest extends BufferTest {
- @AfterClass
- public static void afterTest() {
- FileTesting.cleanFiles();
- }
-
- @Override
- protected Buffer createBuffer(int capacity) {
- return FileBuffer.allocate(FileTesting.createFile(), capacity);
- }
-
- @Override
- protected Buffer createBuffer(int capacity, int maxCapacity) {
- return FileBuffer.allocate(FileTesting.createFile(), capacity, maxCapacity);
- }
-
- @Test
- public void testFileToHeapBuffer() {
- File file = FileTesting.createFile();
- try (FileBuffer buffer = FileBuffer.allocate(file, 16)) {
- buffer.writeLong(10).writeLong(11).flip();
- byte[] bytes = new byte[16];
- buffer.read(bytes).rewind();
- HeapBuffer heapBuffer = HeapBuffer.wrap(bytes);
- assertEquals(buffer.readLong(), heapBuffer.readLong());
- assertEquals(buffer.readLong(), heapBuffer.readLong());
- }
- }
-
- /**
- * Rests reopening a file that has been closed.
- */
- @Test
- public void testPersist() {
- File file = FileTesting.createFile();
- try (FileBuffer buffer = FileBuffer.allocate(file, 16)) {
- buffer.writeLong(10).writeLong(11).flip();
- assertEquals(10, buffer.readLong());
- assertEquals(11, buffer.readLong());
- }
- try (FileBuffer buffer = FileBuffer.allocate(file, 16)) {
- assertEquals(10, buffer.readLong());
- assertEquals(11, buffer.readLong());
- }
- }
-
- /**
- * Tests deleting a file.
- */
- @Test
- public void testDelete() {
- File file = FileTesting.createFile();
- FileBuffer buffer = FileBuffer.allocate(file, 16);
- buffer.writeLong(10).writeLong(11).flip();
- assertEquals(10, buffer.readLong());
- assertEquals(11, buffer.readLong());
- assertTrue(Files.exists(file.toPath()));
- buffer.delete();
- assertFalse(Files.exists(file.toPath()));
- }
-
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.FileVisitResult;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.SimpleFileVisitor;
-import java.nio.file.attribute.BasicFileAttributes;
-import java.util.UUID;
-
-public abstract class FileTesting {
- public static File createFile() {
- File file = new File("target/test-files/" + UUID.randomUUID().toString());
- file.getParentFile().mkdirs();
- return file;
- }
-
- public static void cleanFiles() {
- Path directory = Paths.get("target/test-files/");
- try {
- Files.walkFileTree(directory, new SimpleFileVisitor<Path>() {
- @Override
- public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
- Files.delete(file);
- return FileVisitResult.CONTINUE;
- }
-
- @Override
- public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
- Files.delete(dir);
- return FileVisitResult.CONTINUE;
- }
- });
- } catch (Exception ignore) {
- }
- }
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import org.junit.Test;
-
-import java.nio.ByteBuffer;
-
-import static org.junit.Assert.assertEquals;
-
-/**
- * Heap buffer test.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public class HeapBufferTest extends BufferTest {
-
- @Override
- protected Buffer createBuffer(int capacity) {
- return HeapBuffer.allocate(capacity);
- }
-
- @Override
- protected Buffer createBuffer(int capacity, int maxCapacity) {
- return HeapBuffer.allocate(capacity, maxCapacity);
- }
-
- @Test
- public void testByteBufferToHeapBuffer() {
- ByteBuffer byteBuffer = ByteBuffer.allocate(8);
- byteBuffer.putLong(10);
- byteBuffer.rewind();
-
- HeapBuffer directBuffer = HeapBuffer.wrap(byteBuffer.array());
- assertEquals(directBuffer.readLong(), byteBuffer.getLong());
- }
-
- @Test
- public void testDirectToHeapBuffer() {
- DirectBuffer directBuffer = DirectBuffer.allocate(8);
- directBuffer.writeLong(10);
- directBuffer.flip();
-
- byte[] bytes = new byte[8];
- directBuffer.read(bytes);
- directBuffer.rewind();
-
- HeapBuffer heapBuffer = HeapBuffer.wrap(bytes);
- assertEquals(directBuffer.readLong(), heapBuffer.readLong());
-
- directBuffer.release();
- }
-
- @Test
- public void testHeapToDirectBuffer() {
- HeapBuffer heapBuffer = HeapBuffer.allocate(8);
- heapBuffer.writeLong(10);
- heapBuffer.flip();
-
- DirectBuffer directBuffer = DirectBuffer.allocate(8);
- directBuffer.write(heapBuffer.array());
- directBuffer.flip();
-
- assertEquals(directBuffer.readLong(), heapBuffer.readLong());
-
- directBuffer.release();
- }
-}
+++ /dev/null
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.storage.buffer;
-
-import org.junit.AfterClass;
-import org.junit.Test;
-
-import java.io.File;
-import java.nio.file.Files;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-/**
- * Mapped buffer test.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public class MappedBufferTest extends BufferTest {
- @AfterClass
- public static void afterTest() {
- FileTesting.cleanFiles();
- }
-
- @Override
- protected Buffer createBuffer(int capacity) {
- return MappedBuffer.allocate(FileTesting.createFile(), capacity);
- }
-
- @Override
- protected Buffer createBuffer(int capacity, int maxCapacity) {
- return MappedBuffer.allocate(FileTesting.createFile(), capacity, maxCapacity);
- }
-
- /**
- * Rests reopening a file that has been closed.
- */
- @Test
- public void testPersist() {
- File file = FileTesting.createFile();
- try (MappedBuffer buffer = MappedBuffer.allocate(file, 16)) {
- buffer.writeLong(10).writeLong(11).flip();
- assertEquals(10, buffer.readLong());
- assertEquals(11, buffer.readLong());
- }
- try (MappedBuffer buffer = MappedBuffer.allocate(file, 16)) {
- assertEquals(10, buffer.readLong());
- assertEquals(11, buffer.readLong());
- }
- }
-
- /**
- * Tests deleting a file.
- */
- @Test
- public void testDelete() {
- File file = FileTesting.createFile();
- MappedBuffer buffer = MappedBuffer.allocate(file, 16);
- buffer.writeLong(10).writeLong(11).flip();
- assertEquals(10, buffer.readLong());
- assertEquals(11, buffer.readLong());
- assertTrue(Files.exists(file.toPath()));
- buffer.delete();
- assertFalse(Files.exists(file.toPath()));
- }
-
-}
+++ /dev/null
-/*
- * Copyright 2017-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.utils.concurrent;
-
-/**
- * Reference counting interface.
- * <p>
- * Types that implement {@code ReferenceCounted} can be counted for references and thus used to clean up resources once
- * a given instance of an object is no longer in use.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public interface ReferenceCounted<T> extends AutoCloseable {
-
- /**
- * Acquires a reference.
- *
- * @return The acquired reference.
- */
- T acquire();
-
- /**
- * Releases a reference.
- *
- * @return Indicates whether all references to the object have been released.
- */
- boolean release();
-
- /**
- * Returns the number of open references.
- *
- * @return The number of open references.
- */
- int references();
-
- /**
- * Defines an exception free close implementation.
- */
- @Override
- void close();
-
-}
+++ /dev/null
-/*
- * Copyright 2017-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.utils.concurrent;
-
-/**
- * Reference factory.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public interface ReferenceFactory<T extends ReferenceCounted<?>> {
-
- /**
- * Creates a new reference.
- *
- * @param manager The reference manager.
- * @return The created reference.
- */
- T createReference(ReferenceManager<T> manager);
-
-}
+++ /dev/null
-/*
- * Copyright 2017-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.utils.concurrent;
-
-/**
- * Reference manager. Manages {@link ReferenceCounted} objects.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public interface ReferenceManager<T> {
-
- /**
- * Releases the given reference.
- * <p>
- * This method should be called with a {@link ReferenceCounted} object that contains no
- * additional references. This allows, for instance, pools to recycle dereferenced objects.
- *
- * @param reference The reference to release.
- */
- void release(T reference);
-
-}
+++ /dev/null
-/*
- * Copyright 2017-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.atomix.utils.concurrent;
-
-import java.util.Queue;
-import java.util.concurrent.ConcurrentLinkedQueue;
-
-/**
- * Pool of reference counted objects.
- *
- * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
- */
-public class ReferencePool<T extends ReferenceCounted<?>> implements ReferenceManager<T>, AutoCloseable {
- private final ReferenceFactory<T> factory;
- private final Queue<T> pool = new ConcurrentLinkedQueue<>();
- private volatile boolean closed;
-
- public ReferencePool(ReferenceFactory<T> factory) {
- if (factory == null) {
- throw new NullPointerException("factory cannot be null");
- }
- this.factory = factory;
- }
-
- /**
- * Acquires a reference.
- *
- * @return The acquired reference.
- */
- public T acquire() {
- if (closed) {
- throw new IllegalStateException("pool closed");
- }
-
- T reference = pool.poll();
- if (reference == null) {
- reference = factory.createReference(this);
- }
- reference.acquire();
- return reference;
- }
-
- @Override
- public void release(T reference) {
- if (!closed) {
- pool.add(reference);
- }
- }
-
- @Override
- public synchronized void close() {
- if (closed) {
- throw new IllegalStateException("pool closed");
- }
-
- closed = true;
- for (T reference : pool) {
- reference.close();
- }
- }
-
-}
+++ /dev/null
-/*
- * Copyright 2017-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * Provides classes and interfaces for managing concurrency.
- */
-package io.atomix.utils.concurrent;