mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-28 06:28:06 +00:00
Make ByteBufferFactory an abstract class in order to make FlatBuffers compatible with Java7. (#5155)
Introduce a HeapByteBufferFactory singleton instance in order to reduce allocations. Clarify the usage of LITTLE_ENDIAN ByteBuffers in ByteBufferFactory.
This commit is contained in:
committed by
Wouter van Oortmerssen
parent
60e94cf083
commit
78fdce28c7
@@ -65,6 +65,7 @@ public class FlatBufferBuilder {
|
|||||||
* @param initial_size The initial size of the internal buffer to use.
|
* @param initial_size The initial size of the internal buffer to use.
|
||||||
* @param bb_factory The factory to be used for allocating the internal buffer
|
* @param bb_factory The factory to be used for allocating the internal buffer
|
||||||
* @param existing_bb The byte buffer to reuse.
|
* @param existing_bb The byte buffer to reuse.
|
||||||
|
* @param utf8 The Utf8 codec
|
||||||
*/
|
*/
|
||||||
public FlatBufferBuilder(int initial_size, ByteBufferFactory bb_factory,
|
public FlatBufferBuilder(int initial_size, ByteBufferFactory bb_factory,
|
||||||
ByteBuffer existing_bb, Utf8 utf8) {
|
ByteBuffer existing_bb, Utf8 utf8) {
|
||||||
@@ -76,10 +77,10 @@ public class FlatBufferBuilder {
|
|||||||
if (existing_bb != null) {
|
if (existing_bb != null) {
|
||||||
bb = existing_bb;
|
bb = existing_bb;
|
||||||
bb.clear();
|
bb.clear();
|
||||||
|
bb.order(ByteOrder.LITTLE_ENDIAN);
|
||||||
} else {
|
} else {
|
||||||
bb = bb_factory.newByteBuffer(initial_size);
|
bb = bb_factory.newByteBuffer(initial_size);
|
||||||
}
|
}
|
||||||
bb.order(ByteOrder.LITTLE_ENDIAN);
|
|
||||||
this.utf8 = utf8;
|
this.utf8 = utf8;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,7 +90,7 @@ public class FlatBufferBuilder {
|
|||||||
* @param initial_size The initial size of the internal buffer to use.
|
* @param initial_size The initial size of the internal buffer to use.
|
||||||
*/
|
*/
|
||||||
public FlatBufferBuilder(int initial_size) {
|
public FlatBufferBuilder(int initial_size) {
|
||||||
this(initial_size, new HeapByteBufferFactory(), null, Utf8.getDefault());
|
this(initial_size, HeapByteBufferFactory.INSTANCE, null, Utf8.getDefault());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -159,14 +160,15 @@ public class FlatBufferBuilder {
|
|||||||
* preserve the default behavior in the event that the user does not provide
|
* preserve the default behavior in the event that the user does not provide
|
||||||
* their own implementation of this interface.
|
* their own implementation of this interface.
|
||||||
*/
|
*/
|
||||||
public interface ByteBufferFactory {
|
public static abstract class ByteBufferFactory {
|
||||||
/**
|
/**
|
||||||
* Create a `ByteBuffer` with a given capacity.
|
* Create a `ByteBuffer` with a given capacity.
|
||||||
|
* The returned ByteBuf must have a ByteOrder.LITTLE_ENDIAN ByteOrder.
|
||||||
*
|
*
|
||||||
* @param capacity The size of the `ByteBuffer` to allocate.
|
* @param capacity The size of the `ByteBuffer` to allocate.
|
||||||
* @return Returns the new `ByteBuffer` that was allocated.
|
* @return Returns the new `ByteBuffer` that was allocated.
|
||||||
*/
|
*/
|
||||||
ByteBuffer newByteBuffer(int capacity);
|
public abstract ByteBuffer newByteBuffer(int capacity);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Release a ByteBuffer. Current {@link FlatBufferBuilder}
|
* Release a ByteBuffer. Current {@link FlatBufferBuilder}
|
||||||
@@ -177,7 +179,7 @@ public class FlatBufferBuilder {
|
|||||||
*
|
*
|
||||||
* @param bb the buffer to release
|
* @param bb the buffer to release
|
||||||
*/
|
*/
|
||||||
default void releaseByteBuffer(ByteBuffer bb) {
|
public void releaseByteBuffer(ByteBuffer bb) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -187,7 +189,10 @@ public class FlatBufferBuilder {
|
|||||||
*
|
*
|
||||||
* Allocate memory for a new byte-array backed `ByteBuffer` array inside the JVM.
|
* Allocate memory for a new byte-array backed `ByteBuffer` array inside the JVM.
|
||||||
*/
|
*/
|
||||||
public static final class HeapByteBufferFactory implements ByteBufferFactory {
|
public static final class HeapByteBufferFactory extends ByteBufferFactory {
|
||||||
|
|
||||||
|
public static final HeapByteBufferFactory INSTANCE = new HeapByteBufferFactory();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ByteBuffer newByteBuffer(int capacity) {
|
public ByteBuffer newByteBuffer(int capacity) {
|
||||||
return ByteBuffer.allocate(capacity).order(ByteOrder.LITTLE_ENDIAN);
|
return ByteBuffer.allocate(capacity).order(ByteOrder.LITTLE_ENDIAN);
|
||||||
|
|||||||
@@ -232,7 +232,7 @@ class JavaTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void TestByteBufferFactory() {
|
static void TestByteBufferFactory() {
|
||||||
final class MappedByteBufferFactory implements FlatBufferBuilder.ByteBufferFactory {
|
final class MappedByteBufferFactory extends FlatBufferBuilder.ByteBufferFactory {
|
||||||
@Override
|
@Override
|
||||||
public ByteBuffer newByteBuffer(int capacity) {
|
public ByteBuffer newByteBuffer(int capacity) {
|
||||||
ByteBuffer bb;
|
ByteBuffer bb;
|
||||||
|
|||||||
Reference in New Issue
Block a user