diff options
author | Robert Schmidtke <robert-schmidtke@users.noreply.github.com> | 2018-03-12 19:30:46 +0100 |
---|---|---|
committer | Wouter van Oortmerssen <aardappel@gmail.com> | 2018-03-12 11:30:46 -0700 |
commit | 08cf50c54a704bd76a30602a5efc65ccb7985695 (patch) | |
tree | 26431684eab70b726f4e5ee6ca2bf2b67f53766f /java/com | |
parent | 6b3f057bdc23218dcdcd03f8cb7fc31f02ecf8e4 (diff) | |
download | flatbuffers-08cf50c54a704bd76a30602a5efc65ccb7985695.tar.gz flatbuffers-08cf50c54a704bd76a30602a5efc65ccb7985695.tar.bz2 flatbuffers-08cf50c54a704bd76a30602a5efc65ccb7985695.zip |
Java/C#/Python prefixed size support (#4445)
* initial changes to support size prefixed buffers in Java
* add slice equivalent to CSharp ByteBuffer
* resolve TODO for slicing in CSharp code generation
* add newly generated Java and CSharp test sources
* fix typo in comment
* add FinishSizePrefixed methods to CSharp FlatBufferBuilder as well
* add option to allow writing the prefix as well
* generate size-prefixed monster binary as well
* extend JavaTest to test the size prefixed binary as well
* use constants for size prefix length
* fuse common code for getRootAs and getSizePrefixedRootAs
* pulled file identifier out of if
* add FinishSizePrefixed, GetSizePrefixedRootAs support for Python
* Revert "extend JavaTest to test the size prefixed binary as well"
This reverts commit 68be4420dda47e8d0600bb19691f03be71503a68.
* Revert "generate size-prefixed monster binary as well"
This reverts commit 2939516fdf78df4f061c627221e232b312301417.
* fix ByteBuffer.cs Slice() method; add proper CSharp and Java tests
* fix unused parameter
* increment version number
* pulled out generated methods into separate utility class
* pulled out generated methods into separate utility class for Python
* fix indentation
* remove unnecessary comment
* fix newline and copyright
* add ByteBufferUtil to csproj compilation
* hide ByteBuffer's internal data; track offset into parent's array
* test unsafe versions as well; compile and run in debug mode
* clarify help text for size prefix
* move ByteBuffer slicing behavior to subclass
* fix protection levels
* add size prefix support for text generation
* add ByteBufferSlice to csproj compilation
* revert size prefix handling for nested buffers
* use duplicate instead of slice for removing size prefix
* remove slice subclass and use duplicate for removing size prefix
* remove slice specific tests
* remove superfluous command line option
Diffstat (limited to 'java/com')
-rw-r--r-- | java/com/google/flatbuffers/ByteBufferUtil.java | 58 | ||||
-rw-r--r-- | java/com/google/flatbuffers/Constants.java | 2 | ||||
-rw-r--r-- | java/com/google/flatbuffers/FlatBufferBuilder.java | 55 |
3 files changed, 110 insertions, 5 deletions
diff --git a/java/com/google/flatbuffers/ByteBufferUtil.java b/java/com/google/flatbuffers/ByteBufferUtil.java new file mode 100644 index 00000000..624dc4e2 --- /dev/null +++ b/java/com/google/flatbuffers/ByteBufferUtil.java @@ -0,0 +1,58 @@ +/* + * Copyright 2017 Google Inc. All rights reserved. + * + * 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 com.google.flatbuffers; + +import static com.google.flatbuffers.Constants.*; + +import java.nio.ByteBuffer; + +/// @file +/// @addtogroup flatbuffers_java_api +/// @{ + +/** + * Class that collects utility functions around `ByteBuffer`. + */ +public class ByteBufferUtil { + + /** + * Extract the size prefix from a `ByteBuffer`. + * + * @param bb a size-prefixed buffer + * @return the size prefix + */ + public static int getSizePrefix(ByteBuffer bb) { + return bb.getInt(bb.position()); + } + + /** + * Create a duplicate of a size-prefixed `ByteBuffer` that has its position + * advanced just past the size prefix. + * + * @param bb a size-prefixed buffer + * @return a new buffer on the same underlying data that has skipped the + * size prefix + */ + public static ByteBuffer removeSizePrefix(ByteBuffer bb) { + ByteBuffer s = bb.duplicate(); + s.position(s.position() + SIZE_PREFIX_LENGTH); + return s; + } + +} + +/// @} diff --git a/java/com/google/flatbuffers/Constants.java b/java/com/google/flatbuffers/Constants.java index f5906314..751f4a65 100644 --- a/java/com/google/flatbuffers/Constants.java +++ b/java/com/google/flatbuffers/Constants.java @@ -37,6 +37,8 @@ public class Constants { static final int SIZEOF_DOUBLE = 8; /** The number of bytes in a file identifier. */ static final int FILE_IDENTIFIER_LENGTH = 4; + /** The number of bytes in a size prefix. */ + public static final int SIZE_PREFIX_LENGTH = 4; } /// @endcond diff --git a/java/com/google/flatbuffers/FlatBufferBuilder.java b/java/com/google/flatbuffers/FlatBufferBuilder.java index f98fbedc..44f107ae 100644 --- a/java/com/google/flatbuffers/FlatBufferBuilder.java +++ b/java/com/google/flatbuffers/FlatBufferBuilder.java @@ -816,10 +816,14 @@ public class FlatBufferBuilder { * Finalize a buffer, pointing to the given `root_table`. * * @param root_table An offset to be added to the buffer. + * @param size_prefix Whether to prefix the size to the buffer. */ - public void finish(int root_table) { - prep(minalign, SIZEOF_INT); + protected void finish(int root_table, boolean size_prefix) { + prep(minalign, SIZEOF_INT + (size_prefix ? SIZEOF_INT : 0)); addOffset(root_table); + if (size_prefix) { + addInt(bb.capacity() - space); + } bb.position(space); finished = true; } @@ -828,18 +832,59 @@ public class FlatBufferBuilder { * Finalize a buffer, pointing to the given `root_table`. * * @param root_table An offset to be added to the buffer. + */ + public void finish(int root_table) { + finish(root_table, false); + } + + /** + * Finalize a buffer, pointing to the given `root_table`, with the size prefixed. + * + * @param root_table An offset to be added to the buffer. + */ + public void finishSizePrefixed(int root_table) { + finish(root_table, true); + } + + /** + * Finalize a buffer, pointing to the given `root_table`. + * + * @param root_table An offset to be added to the buffer. * @param file_identifier A FlatBuffer file identifier to be added to the buffer before * `root_table`. + * @param size_prefix Whether to prefix the size to the buffer. */ - public void finish(int root_table, String file_identifier) { - prep(minalign, SIZEOF_INT + FILE_IDENTIFIER_LENGTH); + protected void finish(int root_table, String file_identifier, boolean size_prefix) { + prep(minalign, SIZEOF_INT + FILE_IDENTIFIER_LENGTH + (size_prefix ? SIZEOF_INT : 0)); if (file_identifier.length() != FILE_IDENTIFIER_LENGTH) throw new AssertionError("FlatBuffers: file identifier must be length " + FILE_IDENTIFIER_LENGTH); for (int i = FILE_IDENTIFIER_LENGTH - 1; i >= 0; i--) { addByte((byte)file_identifier.charAt(i)); } - finish(root_table); + finish(root_table, size_prefix); + } + + /** + * Finalize a buffer, pointing to the given `root_table`. + * + * @param root_table An offset to be added to the buffer. + * @param file_identifier A FlatBuffer file identifier to be added to the buffer before + * `root_table`. + */ + public void finish(int root_table, String file_identifier) { + finish(root_table, file_identifier, false); + } + + /** + * Finalize a buffer, pointing to the given `root_table`, with the size prefixed. + * + * @param root_table An offset to be added to the buffer. + * @param file_identifier A FlatBuffer file identifier to be added to the buffer before + * `root_table`. + */ + public void finishSizePrefixed(int root_table, String file_identifier) { + finish(root_table, file_identifier, true); } /** |