diff --git a/java/com/google/flatbuffers/ArrayReadWriteBuf.java b/java/com/google/flatbuffers/ArrayReadWriteBuf.java index 00517747c..38412e557 100644 --- a/java/com/google/flatbuffers/ArrayReadWriteBuf.java +++ b/java/com/google/flatbuffers/ArrayReadWriteBuf.java @@ -34,6 +34,11 @@ public class ArrayReadWriteBuf implements ReadWriteBuf { this.writePos = startPos; } + @Override + public void clear() { + this.writePos = 0; + } + @Override public boolean getBoolean(int index) { return buffer[index] != 0; diff --git a/java/com/google/flatbuffers/ByteBufferReadWriteBuf.java b/java/com/google/flatbuffers/ByteBufferReadWriteBuf.java index 79ad7bbb4..aaf72fe81 100644 --- a/java/com/google/flatbuffers/ByteBufferReadWriteBuf.java +++ b/java/com/google/flatbuffers/ByteBufferReadWriteBuf.java @@ -12,6 +12,11 @@ public class ByteBufferReadWriteBuf implements ReadWriteBuf { this.buffer.order(ByteOrder.LITTLE_ENDIAN); } + @Override + public void clear() { + buffer.clear(); + } + @Override public boolean getBoolean(int index) { return get(index) != 0; diff --git a/java/com/google/flatbuffers/FlexBuffersBuilder.java b/java/com/google/flatbuffers/FlexBuffersBuilder.java index cb44492a1..dc0df9669 100644 --- a/java/com/google/flatbuffers/FlexBuffersBuilder.java +++ b/java/com/google/flatbuffers/FlexBuffersBuilder.java @@ -151,6 +151,17 @@ public class FlexBuffersBuilder { this(bb, BUILDER_FLAG_SHARE_KEYS); } + /** + * Reset the FlexBuffersBuilder by purging all data that it holds. + */ + public void clear(){ + bb.clear(); + stack.clear(); + keyPool.clear(); + stringPool.clear(); + finished = false; + } + /** * Return `ByteBuffer` containing FlexBuffer message. {@code #finish()} must be called before calling this * function otherwise an assert will trigger. diff --git a/java/com/google/flatbuffers/ReadWriteBuf.java b/java/com/google/flatbuffers/ReadWriteBuf.java index df672fbcc..cae186e2e 100644 --- a/java/com/google/flatbuffers/ReadWriteBuf.java +++ b/java/com/google/flatbuffers/ReadWriteBuf.java @@ -5,6 +5,13 @@ package com.google.flatbuffers; * FlexBuffers message. */ interface ReadWriteBuf extends ReadBuf { + + /** + * Clears (resets) the buffer so that it can be reused. Write position will be set to the + * start. + */ + void clear(); + /** * Put a boolean into the buffer at {@code writePosition()} . Booleans as stored as single * byte. Write position will be incremented. diff --git a/tests/JavaTest.java b/tests/JavaTest.java index afa1970af..a0dead964 100644 --- a/tests/JavaTest.java +++ b/tests/JavaTest.java @@ -591,7 +591,17 @@ class JavaTest { public static void testFlexBuffersTest() { FlexBuffersBuilder builder = new FlexBuffersBuilder(ByteBuffer.allocate(512), FlexBuffersBuilder.BUILDER_FLAG_SHARE_KEYS_AND_STRINGS); + testFlexBuffersTest(builder); + int bufferLimit1 = ((ArrayReadWriteBuf) builder.getBuffer()).limit(); + // Repeat after clearing the builder to ensure the builder is reusable + builder.clear(); + testFlexBuffersTest(builder); + int bufferLimit2 = ((ArrayReadWriteBuf) builder.getBuffer()).limit(); + TestEq(bufferLimit1, bufferLimit2); + } + + public static void testFlexBuffersTest(FlexBuffersBuilder builder) { // Write the equivalent of: // { vec: [ -100, "Fred", 4.0, false ], bar: [ 1, 2, 3 ], bar3: [ 1, 2, 3 ], // foo: 100, bool: true, mymap: { foo: "Fred" } }