From 132e6a822045434cd5a6fb636c32791480b27f37 Mon Sep 17 00:00:00 2001
From: desqaz <hitite@gmail.com>
Date: Thu, 22 Feb 2018 18:19:08 +0100
Subject: [PATCH] Add new c++ helpers to ease usage of size prefixed
 FlatBuffers (#4626)

It was missing some helpers when we choose to use
size prefixed FlatBuffers.

* Add general helper : GetPrefixedSize
* Add generated helpers :
 * GetSizePrefixedXXX
 * VerfifySizePrefixedXXXBuffer
 * FinishSizePrefixedXXXBuffer
---
 include/flatbuffers/flatbuffers.h             |   3 +++
 samples/monster_generated.h                   |  15 +++++++++++
 src/idl_gen_cpp.cpp                           |  24 ++++++++++++++++++
 tests/monster_test.bfbs                       | Bin 5440 -> 5400 bytes
 tests/monster_test_generated.h                |  15 +++++++++++
 .../namespace_test2_generated.ts              |  20 +++++++--------
 tests/test.cpp                                |   8 +++---
 tests/union_vector/union_vector_generated.h   |  15 +++++++++++
 8 files changed, 86 insertions(+), 14 deletions(-)

diff --git a/include/flatbuffers/flatbuffers.h b/include/flatbuffers/flatbuffers.h
index 94e58165..214ce267 100644
--- a/include/flatbuffers/flatbuffers.h
+++ b/include/flatbuffers/flatbuffers.h
@@ -2069,6 +2069,9 @@ inline const uint8_t *GetBufferStartFromRootPointer(const void *root) {
   return nullptr;
 }
 
+/// @brief This return the prefixed size of a FlatBuffer.
+inline uoffset_t GetPrefixedSize(const uint8_t* buf){ return ReadScalar<uoffset_t>(buf); }
+
 // Base class for native objects (FlatBuffer data de-serialized into native
 // C++ data structures).
 // Contains no functionality, purely documentative.
diff --git a/samples/monster_generated.h b/samples/monster_generated.h
index 32d44d00..00c0595e 100644
--- a/samples/monster_generated.h
+++ b/samples/monster_generated.h
@@ -727,6 +727,10 @@ inline const MyGame::Sample::Monster *GetMonster(const void *buf) {
   return flatbuffers::GetRoot<MyGame::Sample::Monster>(buf);
 }
 
+inline const MyGame::Sample::Monster *GetSizePrefixedMonster(const void *buf) {
+  return flatbuffers::GetSizePrefixedRoot<MyGame::Sample::Monster>(buf);
+}
+
 inline Monster *GetMutableMonster(void *buf) {
   return flatbuffers::GetMutableRoot<Monster>(buf);
 }
@@ -736,12 +740,23 @@ inline bool VerifyMonsterBuffer(
   return verifier.VerifyBuffer<MyGame::Sample::Monster>(nullptr);
 }
 
+inline bool VerifySizePrefixedMonsterBuffer(
+    flatbuffers::Verifier &verifier) {
+  return verifier.VerifySizePrefixedBuffer<MyGame::Sample::Monster>(nullptr);
+}
+
 inline void FinishMonsterBuffer(
     flatbuffers::FlatBufferBuilder &fbb,
     flatbuffers::Offset<MyGame::Sample::Monster> root) {
   fbb.Finish(root);
 }
 
+inline void FinishSizePrefixedMonsterBuffer(
+    flatbuffers::FlatBufferBuilder &fbb,
+    flatbuffers::Offset<MyGame::Sample::Monster> root) {
+  fbb.FinishSizePrefixed(root);
+}
+
 inline flatbuffers::unique_ptr<MonsterT> UnPackMonster(
     const void *buf,
     const flatbuffers::resolver_function_t *res = nullptr) {
diff --git a/src/idl_gen_cpp.cpp b/src/idl_gen_cpp.cpp
index ea01bf1c..52d76345 100644
--- a/src/idl_gen_cpp.cpp
+++ b/src/idl_gen_cpp.cpp
@@ -333,6 +333,14 @@ class CppGenerator : public BaseGenerator {
       code_ += "}";
       code_ += "";
 
+      code_ += "inline \\";
+      code_ +=
+          "const {{CPP_NAME}} *{{NULLABLE_EXT}}GetSizePrefixed{{STRUCT_NAME}}(const void "
+          "*buf) {";
+      code_ += "  return flatbuffers::GetSizePrefixedRoot<{{CPP_NAME}}>(buf);";
+      code_ += "}";
+      code_ += "";
+
       if (parser_.opts.mutable_buffer) {
         code_ += "inline \\";
         code_ += "{{STRUCT_NAME}} *GetMutable{{STRUCT_NAME}}(void *buf) {";
@@ -370,6 +378,12 @@ class CppGenerator : public BaseGenerator {
       code_ += "}";
       code_ += "";
 
+      code_ += "inline bool VerifySizePrefixed{{STRUCT_NAME}}Buffer(";
+      code_ += "    flatbuffers::Verifier &verifier) {";
+      code_ += "  return verifier.VerifySizePrefixedBuffer<{{CPP_NAME}}>({{ID}});";
+      code_ += "}";
+      code_ += "";
+
       if (parser_.file_extension_.length()) {
         // Return the extension
         code_ += "inline const char *{{STRUCT_NAME}}Extension() {";
@@ -389,6 +403,16 @@ class CppGenerator : public BaseGenerator {
       code_ += "}";
       code_ += "";
 
+      code_ += "inline void FinishSizePrefixed{{STRUCT_NAME}}Buffer(";
+      code_ += "    flatbuffers::FlatBufferBuilder &fbb,";
+      code_ += "    flatbuffers::Offset<{{CPP_NAME}}> root) {";
+      if (parser_.file_identifier_.length())
+        code_ += "  fbb.FinishSizePrefixed(root, {{STRUCT_NAME}}Identifier());";
+      else
+        code_ += "  fbb.FinishSizePrefixed(root);";
+      code_ += "}";
+      code_ += "";
+
       if (parser_.opts.generate_object_based_api) {
         // A convenient root unpack function.
         auto native_name =
diff --git a/tests/monster_test.bfbs b/tests/monster_test.bfbs
index 4cb46a7ca5a2f046e7e4daa2b4c5d2a7e1bc5bf5..843e308c5204d9c36bad66ae49ac2d37041b4cce 100644
GIT binary patch
literal 5400
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

literal 5440
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

diff --git a/tests/monster_test_generated.h b/tests/monster_test_generated.h
index 07813839..14a95ad7 100644
--- a/tests/monster_test_generated.h
+++ b/tests/monster_test_generated.h
@@ -2224,6 +2224,10 @@ inline const MyGame::Example::Monster *GetMonster(const void *buf) {
   return flatbuffers::GetRoot<MyGame::Example::Monster>(buf);
 }
 
+inline const MyGame::Example::Monster *GetSizePrefixedMonster(const void *buf) {
+  return flatbuffers::GetSizePrefixedRoot<MyGame::Example::Monster>(buf);
+}
+
 inline Monster *GetMutableMonster(void *buf) {
   return flatbuffers::GetMutableRoot<Monster>(buf);
 }
@@ -2242,6 +2246,11 @@ inline bool VerifyMonsterBuffer(
   return verifier.VerifyBuffer<MyGame::Example::Monster>(MonsterIdentifier());
 }
 
+inline bool VerifySizePrefixedMonsterBuffer(
+    flatbuffers::Verifier &verifier) {
+  return verifier.VerifySizePrefixedBuffer<MyGame::Example::Monster>(MonsterIdentifier());
+}
+
 inline const char *MonsterExtension() {
   return "mon";
 }
@@ -2252,6 +2261,12 @@ inline void FinishMonsterBuffer(
   fbb.Finish(root, MonsterIdentifier());
 }
 
+inline void FinishSizePrefixedMonsterBuffer(
+    flatbuffers::FlatBufferBuilder &fbb,
+    flatbuffers::Offset<MyGame::Example::Monster> root) {
+  fbb.FinishSizePrefixed(root, MonsterIdentifier());
+}
+
 inline flatbuffers::unique_ptr<MonsterT> UnPackMonster(
     const void *buf,
     const flatbuffers::resolver_function_t *res = nullptr) {
diff --git a/tests/namespace_test/namespace_test2_generated.ts b/tests/namespace_test/namespace_test2_generated.ts
index aa623a87..18f1d6e8 100644
--- a/tests/namespace_test/namespace_test2_generated.ts
+++ b/tests/namespace_test/namespace_test2_generated.ts
@@ -1,6 +1,6 @@
 // automatically generated by the FlatBuffers compiler, do not modify
 
-import * as NS4989953370203581498 from "./namespace_test1_generated";
+import * as NS9459827973991502386 from "./namespace_test1_generated";
 /**
  * @constructor
  */
@@ -39,24 +39,24 @@ static getRootAsTableInFirstNS(bb:flatbuffers.ByteBuffer, obj?:TableInFirstNS):T
  * @param {NamespaceA.NamespaceB.TableInNestedNS=} obj
  * @returns {NamespaceA.NamespaceB.TableInNestedNS|null}
  */
-fooTable(obj?:NS4989953370203581498.NamespaceA.NamespaceB.TableInNestedNS):NS4989953370203581498.NamespaceA.NamespaceB.TableInNestedNS|null {
+fooTable(obj?:NS9459827973991502386.NamespaceA.NamespaceB.TableInNestedNS):NS9459827973991502386.NamespaceA.NamespaceB.TableInNestedNS|null {
   var offset = this.bb!.__offset(this.bb_pos, 4);
-  return offset ? (obj || new NS4989953370203581498.NamespaceA.NamespaceB.TableInNestedNS).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null;
+  return offset ? (obj || new NS9459827973991502386.NamespaceA.NamespaceB.TableInNestedNS).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null;
 };
 
 /**
  * @returns {NamespaceA.NamespaceB.EnumInNestedNS}
  */
-fooEnum():NS4989953370203581498.NamespaceA.NamespaceB.EnumInNestedNS {
+fooEnum():NS9459827973991502386.NamespaceA.NamespaceB.EnumInNestedNS {
   var offset = this.bb!.__offset(this.bb_pos, 6);
-  return offset ? /** @type {NamespaceA.NamespaceB.EnumInNestedNS} */ (this.bb!.readInt8(this.bb_pos + offset)) : NS4989953370203581498.NamespaceA.NamespaceB.EnumInNestedNS.A;
+  return offset ? /** @type {NamespaceA.NamespaceB.EnumInNestedNS} */ (this.bb!.readInt8(this.bb_pos + offset)) : NS9459827973991502386.NamespaceA.NamespaceB.EnumInNestedNS.A;
 };
 
 /**
  * @param {NamespaceA.NamespaceB.EnumInNestedNS} value
  * @returns {boolean}
  */
-mutate_foo_enum(value:NS4989953370203581498.NamespaceA.NamespaceB.EnumInNestedNS):boolean {
+mutate_foo_enum(value:NS9459827973991502386.NamespaceA.NamespaceB.EnumInNestedNS):boolean {
   var offset = this.bb!.__offset(this.bb_pos, 6);
 
   if (offset === 0) {
@@ -71,9 +71,9 @@ mutate_foo_enum(value:NS4989953370203581498.NamespaceA.NamespaceB.EnumInNestedNS
  * @param {NamespaceA.NamespaceB.StructInNestedNS=} obj
  * @returns {NamespaceA.NamespaceB.StructInNestedNS|null}
  */
-fooStruct(obj?:NS4989953370203581498.NamespaceA.NamespaceB.StructInNestedNS):NS4989953370203581498.NamespaceA.NamespaceB.StructInNestedNS|null {
+fooStruct(obj?:NS9459827973991502386.NamespaceA.NamespaceB.StructInNestedNS):NS9459827973991502386.NamespaceA.NamespaceB.StructInNestedNS|null {
   var offset = this.bb!.__offset(this.bb_pos, 8);
-  return offset ? (obj || new NS4989953370203581498.NamespaceA.NamespaceB.StructInNestedNS).__init(this.bb_pos + offset, this.bb!) : null;
+  return offset ? (obj || new NS9459827973991502386.NamespaceA.NamespaceB.StructInNestedNS).__init(this.bb_pos + offset, this.bb!) : null;
 };
 
 /**
@@ -95,8 +95,8 @@ static addFooTable(builder:flatbuffers.Builder, fooTableOffset:flatbuffers.Offse
  * @param {flatbuffers.Builder} builder
  * @param {NamespaceA.NamespaceB.EnumInNestedNS} fooEnum
  */
-static addFooEnum(builder:flatbuffers.Builder, fooEnum:NS4989953370203581498.NamespaceA.NamespaceB.EnumInNestedNS) {
-  builder.addFieldInt8(1, fooEnum, NS4989953370203581498.NamespaceA.NamespaceB.EnumInNestedNS.A);
+static addFooEnum(builder:flatbuffers.Builder, fooEnum:NS9459827973991502386.NamespaceA.NamespaceB.EnumInNestedNS) {
+  builder.addFieldInt8(1, fooEnum, NS9459827973991502386.NamespaceA.NamespaceB.EnumInNestedNS.A);
 };
 
 /**
diff --git a/tests/test.cpp b/tests/test.cpp
index a89e56dd..2da79f19 100644
--- a/tests/test.cpp
+++ b/tests/test.cpp
@@ -514,16 +514,16 @@ void ObjectFlatBuffersTest(uint8_t *flatbuf) {
 void SizePrefixedTest() {
   // Create size prefixed buffer.
   flatbuffers::FlatBufferBuilder fbb;
-  fbb.FinishSizePrefixed(
+  FinishSizePrefixedMonsterBuffer(
+      fbb,
       CreateMonster(fbb, 0, 200, 300, fbb.CreateString("bob")));
 
   // Verify it.
   flatbuffers::Verifier verifier(fbb.GetBufferPointer(), fbb.GetSize());
-  TEST_EQ(verifier.VerifySizePrefixedBuffer<Monster>(nullptr), true);
+  TEST_EQ(VerifySizePrefixedMonsterBuffer(verifier), true);
 
   // Access it.
-  auto m = flatbuffers::GetSizePrefixedRoot<MyGame::Example::Monster>(
-      fbb.GetBufferPointer());
+  auto m = GetSizePrefixedMonster(fbb.GetBufferPointer());
   TEST_EQ(m->mana(), 200);
   TEST_EQ(m->hp(), 300);
   TEST_EQ_STR(m->name()->c_str(), "bob");
diff --git a/tests/union_vector/union_vector_generated.h b/tests/union_vector/union_vector_generated.h
index 77de579e..ba9234da 100644
--- a/tests/union_vector/union_vector_generated.h
+++ b/tests/union_vector/union_vector_generated.h
@@ -706,6 +706,10 @@ inline const Movie *GetMovie(const void *buf) {
   return flatbuffers::GetRoot<Movie>(buf);
 }
 
+inline const Movie *GetSizePrefixedMovie(const void *buf) {
+  return flatbuffers::GetSizePrefixedRoot<Movie>(buf);
+}
+
 inline Movie *GetMutableMovie(void *buf) {
   return flatbuffers::GetMutableRoot<Movie>(buf);
 }
@@ -724,12 +728,23 @@ inline bool VerifyMovieBuffer(
   return verifier.VerifyBuffer<Movie>(MovieIdentifier());
 }
 
+inline bool VerifySizePrefixedMovieBuffer(
+    flatbuffers::Verifier &verifier) {
+  return verifier.VerifySizePrefixedBuffer<Movie>(MovieIdentifier());
+}
+
 inline void FinishMovieBuffer(
     flatbuffers::FlatBufferBuilder &fbb,
     flatbuffers::Offset<Movie> root) {
   fbb.Finish(root, MovieIdentifier());
 }
 
+inline void FinishSizePrefixedMovieBuffer(
+    flatbuffers::FlatBufferBuilder &fbb,
+    flatbuffers::Offset<Movie> root) {
+  fbb.FinishSizePrefixed(root, MovieIdentifier());
+}
+
 inline flatbuffers::unique_ptr<MovieT> UnPackMovie(
     const void *buf,
     const flatbuffers::resolver_function_t *res = nullptr) {
-- 
GitLab