diff options
author | Mitchel <mitchellabonte@hotmail.com> | 2018-02-23 17:01:05 -0500 |
---|---|---|
committer | Wouter van Oortmerssen <aardappel@gmail.com> | 2018-02-23 14:01:05 -0800 |
commit | 55ddb84eb26e974aee31ddaad47ad0c7aaf382dd (patch) | |
tree | 2ae508a9eb5f1ba90d844d535a8e625a78bc96c7 | |
parent | 6e2e909b5c9737ec169ddbdb9ed9b8aa2e908aa1 (diff) | |
download | flatbuffers-55ddb84eb26e974aee31ddaad47ad0c7aaf382dd.tar.gz flatbuffers-55ddb84eb26e974aee31ddaad47ad0c7aaf382dd.tar.bz2 flatbuffers-55ddb84eb26e974aee31ddaad47ad0c7aaf382dd.zip |
In Java, allow reusing ByteBuffer in getters (#4633)
* In Java, allow reusing ByteBuffer in getters
* In Java, allow reusing ByteBuffer in getters
* In Java, allow reusing ByteBuffer in getters
-rw-r--r-- | java/com/google/flatbuffers/Table.java | 21 | ||||
-rw-r--r-- | src/idl_gen_general.cpp | 10 | ||||
-rw-r--r-- | tests/MyGame/Example/Monster.java | 8 |
3 files changed, 39 insertions, 0 deletions
diff --git a/java/com/google/flatbuffers/Table.java b/java/com/google/flatbuffers/Table.java index 6199ed40..cbbeda11 100644 --- a/java/com/google/flatbuffers/Table.java +++ b/java/com/google/flatbuffers/Table.java @@ -173,6 +173,27 @@ public class Table { } /** + * Initialize vector as a ByteBuffer. + * + * This is more efficient than using duplicate, since it doesn't copy the data + * nor allocattes a new {@link ByteBuffer}, creating no garbage to be collected. + * + * @param bb The {@link ByteBuffer} for the array + * @param vector_offset The position of the vector in the byte buffer + * @param elem_size The size of each element in the array + * @return The {@link ByteBuffer} for the array + */ + protected ByteBuffer __vector_in_bytebuffer(ByteBuffer bb, int vector_offset, int elem_size) { + int o = this.__offset(vector_offset); + if (o == 0) return null; + int vectorstart = __vector(o); + bb.rewind(); + bb.limit(vectorstart + __vector_len(o) * elem_size); + bb.position(vectorstart); + return bb; + } + + /** * Initialize any Table-derived type to point to the union at the given `offset`. * * @param t A `Table`-derived type that should point to the union at `offset`. diff --git a/src/idl_gen_general.cpp b/src/idl_gen_general.cpp index e9b8febb..f977643c 100644 --- a/src/idl_gen_general.cpp +++ b/src/idl_gen_general.cpp @@ -1066,6 +1066,16 @@ class GeneralGenerator : public BaseGenerator { ? 1 : InlineSize(field.value.type.VectorType())); code += "); }\n"; + code += " public ByteBuffer "; + code += MakeCamel(field.name, lang_.first_camel_upper); + code += "InByteBuffer(ByteBuffer _bb) { return "; + code += lang_.accessor_prefix + "__vector_in_bytebuffer(_bb, "; + code += NumToString(field.value.offset) + ", "; + code += + NumToString(field.value.type.base_type == BASE_TYPE_STRING + ? 1 + : InlineSize(field.value.type.VectorType())); + code += "); }\n"; break; case IDLOptions::kCSharp: code += " public ArraySegment<byte>? Get"; diff --git a/tests/MyGame/Example/Monster.java b/tests/MyGame/Example/Monster.java index af262b8e..17069739 100644 --- a/tests/MyGame/Example/Monster.java +++ b/tests/MyGame/Example/Monster.java @@ -26,9 +26,11 @@ public final class Monster extends Table { public boolean mutateHp(short hp) { int o = __offset(8); if (o != 0) { bb.putShort(o + bb_pos, hp); return true; } else { return false; } } public String name() { int o = __offset(10); return o != 0 ? __string(o + bb_pos) : null; } public ByteBuffer nameAsByteBuffer() { return __vector_as_bytebuffer(10, 1); } + public ByteBuffer nameInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 10, 1); } public int inventory(int j) { int o = __offset(14); return o != 0 ? bb.get(__vector(o) + j * 1) & 0xFF : 0; } public int inventoryLength() { int o = __offset(14); return o != 0 ? __vector_len(o) : 0; } public ByteBuffer inventoryAsByteBuffer() { return __vector_as_bytebuffer(14, 1); } + public ByteBuffer inventoryInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 14, 1); } public boolean mutateInventory(int j, int inventory) { int o = __offset(14); if (o != 0) { bb.put(__vector(o) + j * 1, (byte)inventory); return true; } else { return false; } } public byte color() { int o = __offset(16); return o != 0 ? bb.get(o + bb_pos) : 8; } public boolean mutateColor(byte color) { int o = __offset(16); if (o != 0) { bb.put(o + bb_pos, color); return true; } else { return false; } } @@ -53,6 +55,7 @@ public final class Monster extends Table { public int testnestedflatbuffer(int j) { int o = __offset(30); return o != 0 ? bb.get(__vector(o) + j * 1) & 0xFF : 0; } public int testnestedflatbufferLength() { int o = __offset(30); return o != 0 ? __vector_len(o) : 0; } public ByteBuffer testnestedflatbufferAsByteBuffer() { return __vector_as_bytebuffer(30, 1); } + public ByteBuffer testnestedflatbufferInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 30, 1); } public Monster testnestedflatbufferAsMonster() { return testnestedflatbufferAsMonster(new Monster()); } public Monster testnestedflatbufferAsMonster(Monster obj) { int o = __offset(30); return o != 0 ? obj.__assign(__indirect(__vector(o)), bb) : null; } public boolean mutateTestnestedflatbuffer(int j, int testnestedflatbuffer) { int o = __offset(30); if (o != 0) { bb.put(__vector(o) + j * 1, (byte)testnestedflatbuffer); return true; } else { return false; } } @@ -79,6 +82,7 @@ public final class Monster extends Table { public boolean testarrayofbools(int j) { int o = __offset(52); return o != 0 ? 0!=bb.get(__vector(o) + j * 1) : false; } public int testarrayofboolsLength() { int o = __offset(52); return o != 0 ? __vector_len(o) : 0; } public ByteBuffer testarrayofboolsAsByteBuffer() { return __vector_as_bytebuffer(52, 1); } + public ByteBuffer testarrayofboolsInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 52, 1); } public boolean mutateTestarrayofbools(int j, boolean testarrayofbools) { int o = __offset(52); if (o != 0) { bb.put(__vector(o) + j * 1, (byte)(testarrayofbools ? 1 : 0)); return true; } else { return false; } } public float testf() { int o = __offset(54); return o != 0 ? bb.getFloat(o + bb_pos) : 3.14159f; } public boolean mutateTestf(float testf) { int o = __offset(54); if (o != 0) { bb.putFloat(o + bb_pos, testf); return true; } else { return false; } } @@ -94,6 +98,7 @@ public final class Monster extends Table { public int flex(int j) { int o = __offset(64); return o != 0 ? bb.get(__vector(o) + j * 1) & 0xFF : 0; } public int flexLength() { int o = __offset(64); return o != 0 ? __vector_len(o) : 0; } public ByteBuffer flexAsByteBuffer() { return __vector_as_bytebuffer(64, 1); } + public ByteBuffer flexInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 64, 1); } public boolean mutateFlex(int j, int flex) { int o = __offset(64); if (o != 0) { bb.put(__vector(o) + j * 1, (byte)flex); return true; } else { return false; } } public Test test5(int j) { return test5(new Test(), j); } public Test test5(Test obj, int j) { int o = __offset(66); return o != 0 ? obj.__assign(__vector(o) + j * 4, bb) : null; } @@ -101,10 +106,12 @@ public final class Monster extends Table { public long vectorOfLongs(int j) { int o = __offset(68); return o != 0 ? bb.getLong(__vector(o) + j * 8) : 0; } public int vectorOfLongsLength() { int o = __offset(68); return o != 0 ? __vector_len(o) : 0; } public ByteBuffer vectorOfLongsAsByteBuffer() { return __vector_as_bytebuffer(68, 8); } + public ByteBuffer vectorOfLongsInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 68, 8); } public boolean mutateVectorOfLongs(int j, long vector_of_longs) { int o = __offset(68); if (o != 0) { bb.putLong(__vector(o) + j * 8, vector_of_longs); return true; } else { return false; } } public double vectorOfDoubles(int j) { int o = __offset(70); return o != 0 ? bb.getDouble(__vector(o) + j * 8) : 0; } public int vectorOfDoublesLength() { int o = __offset(70); return o != 0 ? __vector_len(o) : 0; } public ByteBuffer vectorOfDoublesAsByteBuffer() { return __vector_as_bytebuffer(70, 8); } + public ByteBuffer vectorOfDoublesInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 70, 8); } public boolean mutateVectorOfDoubles(int j, double vector_of_doubles) { int o = __offset(70); if (o != 0) { bb.putDouble(__vector(o) + j * 8, vector_of_doubles); return true; } else { return false; } } public MyGame.InParentNamespace parentNamespaceTest() { return parentNamespaceTest(new MyGame.InParentNamespace()); } public MyGame.InParentNamespace parentNamespaceTest(MyGame.InParentNamespace obj) { int o = __offset(72); return o != 0 ? obj.__assign(__indirect(o + bb_pos), bb) : null; } @@ -117,6 +124,7 @@ public final class Monster extends Table { public long vectorOfWeakReferences(int j) { int o = __offset(78); return o != 0 ? bb.getLong(__vector(o) + j * 8) : 0; } public int vectorOfWeakReferencesLength() { int o = __offset(78); return o != 0 ? __vector_len(o) : 0; } public ByteBuffer vectorOfWeakReferencesAsByteBuffer() { return __vector_as_bytebuffer(78, 8); } + public ByteBuffer vectorOfWeakReferencesInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 78, 8); } public boolean mutateVectorOfWeakReferences(int j, long vector_of_weak_references) { int o = __offset(78); if (o != 0) { bb.putLong(__vector(o) + j * 8, vector_of_weak_references); return true; } else { return false; } } public static void startMonster(FlatBufferBuilder builder) { builder.startObject(38); } |