blob: c5078898d2cc2fb5ab5219fbb4f128eba48cb2f8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.tinkerpop.gremlin.structure.io;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.ByteBuffer;
/**
* Represents an abstract view for one or more primitive byte arrays and NIO buffers.
*/
public interface Buffer {
/**
* Returns the number of readable bytes.
*/
int readableBytes();
/**
* Returns the reader index of this buffer.
*/
int readerIndex();
/**
* Sets the reader index of this buffer.
*
* @throws IndexOutOfBoundsException
* if its out of bounds.
*/
Buffer readerIndex(final int readerIndex);
/**
* Returns the writer index of this buffer.
*/
int writerIndex();
/**
* Sets the writer index of this buffer.
*/
Buffer writerIndex(final int writerIndex);
/**
* Marks the current writer index in this buffer.
*/
Buffer markWriterIndex();
/**
* Repositions the current writer index to the marked index in this buffer.
*/
Buffer resetWriterIndex();
/**
* Returns the number of bytes (octets) this buffer can contain.
*/
int capacity();
/**
* Returns {@code true} if and only if this buffer is backed by an
* NIO direct buffer.
*/
boolean isDirect();
/**
* Gets a boolean and advances the reader index.
*/
boolean readBoolean();
/**
* Gets a byte and advances the reader index.
*/
byte readByte();
/**
* Gets a 16-bit short integer and advances the reader index.
*/
short readShort();
/**
* Gets a 32-bit integer at the current index and advances the reader index.
*/
int readInt();
/**
* Gets a 64-bit integer and advances the reader index.
*/
long readLong();
/**
* Gets a 32-bit floating point number and advances the reader index.
*/
float readFloat();
/**
* Gets a 64-bit floating point number and advances the reader index.
*/
double readDouble();
/**
* Transfers this buffer's data to the specified destination starting at
* the current reader index and advances the reader index.
*/
Buffer readBytes(byte[] destination);
/**
* Transfers this buffer's data to the specified destination starting at
* the current reader index and advances the reader index.
*
* @param destination The destination buffer
* @param dstIndex the first index of the destination
* @param length the number of bytes to transfer
*/
Buffer readBytes(final byte[] destination, final int dstIndex, final int length);
/**
* Transfers this buffer's data to the specified destination starting at
* the current reader index until the destination's position
* reaches its limit, and advances the reader index.
*/
Buffer readBytes(final ByteBuffer dst);
/**
* Transfers this buffer's data to the specified stream starting at the
* current reader index and advances the index.
*
* @param length the number of bytes to transfer
*
* @throws IOException
* if the specified stream threw an exception during I/O
*/
Buffer readBytes(final OutputStream out, final int length) throws IOException;
/**
* Sets the specified boolean at the current writer index and advances the index.
*/
Buffer writeBoolean(final boolean value);
/**
* Sets the specified byte at the current writer index and advances the index.
*/
Buffer writeByte(final int value);
/**
* Sets the specified 16-bit short integer at the current writer index and advances the index.
*/
Buffer writeShort(final int value);
/**
* Sets the specified 32-bit integer at the current writer index and advances the index.
*/
Buffer writeInt(final int value);
/**
* Sets the specified 64-bit long integer at the current writer index and advances the index.
*/
Buffer writeLong(final long value);
/**
* Sets the specified 32-bit floating point number at the current writer index and advances the index.
*/
Buffer writeFloat(final float value);
/**
* Sets the specified 64-bit floating point number at the current writer index and advances the index.
*/
Buffer writeDouble(final double value);
/**
* Transfers the specified source array's data to this buffer starting at the current writer index
* and advances the index.
*/
Buffer writeBytes(final byte[] src);
/**
* Transfers the specified source byte data to this buffer starting at the current writer index
* and advances the index.
*/
Buffer writeBytes(final ByteBuffer src);
/**
* Transfers the specified source array's data to this buffer starting at the current writer index
* and advances the index.
*/
Buffer writeBytes(final byte[] src, final int srcIndex, final int length);
/**
* Decreases the reference count by {@code 1} and deallocates this object if the reference count reaches at
* {@code 0}.
*/
boolean release();
/**
* Increases the reference count by {@code 1}.
*/
Buffer retain();
/**
* Returns the reference count of this object.
*/
int referenceCount();
/**
* Returns the maximum number of NIO {@link ByteBuffer}s that consist this buffer.
*/
int nioBufferCount();
/**
* Exposes this buffer's readable bytes as NIO ByteBuffer's instances.
*/
ByteBuffer[] nioBuffers();
/**
* Exposes this buffer's readable bytes as NIO ByteBuffer's instances.
*/
ByteBuffer[] nioBuffers(final int index, final int length);
/**
* Exposes this buffer's readable bytes as a NIO {@link ByteBuffer}. The returned buffer
* either share or contains the copied content of this buffer, while changing the position
* and limit of the returned NIO buffer does not affect the indexes and marks of this buffer.
*/
ByteBuffer nioBuffer();
/**
* Exposes this buffer's sub-region as an NIO {@link ByteBuffer}.
*/
ByteBuffer nioBuffer(final int index, final int length);
/**
* Transfers this buffer's data to the specified destination starting at
* the specified absolute {@code index}.
* This method does not modify reader or writer indexes.
*/
Buffer getBytes(final int index, final byte[] dst);
}