From 901b89e7333d52d09ac0074db40dcfbce1340976 Mon Sep 17 00:00:00 2001 From: Austin Schuh Date: Thu, 26 Dec 2019 14:56:46 -0800 Subject: [PATCH] [C++] Add Builder and Table typedefs (#5685) * Add Builder and Table typedefs This gives us a way to use templates to go from a builder to a table and back again without having to pass both types in. * Fix tests/cpp17/generated_cpp17/monster_test_generated.h --- include/flatbuffers/reflection_generated.h | 27 +++++++++++++++++++ samples/monster_generated.h | 6 +++++ src/idl_gen_cpp.cpp | 5 ++++ tests/arrays_test_generated.h | 3 +++ .../generated_cpp17/monster_test_generated.h | 21 +++++++++++++++ tests/monster_extra_generated.h | 3 +++ tests/monster_test_generated.h | 21 +++++++++++++++ .../namespace_test1_generated.h | 3 +++ .../namespace_test2_generated.h | 9 +++++++ tests/native_type_test_generated.h | 3 +++ tests/union_vector/union_vector_generated.h | 6 +++++ 11 files changed, 107 insertions(+) diff --git a/include/flatbuffers/reflection_generated.h b/include/flatbuffers/reflection_generated.h index b59637d8a..e7237ff24 100644 --- a/include/flatbuffers/reflection_generated.h +++ b/include/flatbuffers/reflection_generated.h @@ -9,22 +9,31 @@ namespace reflection { struct Type; +struct TypeBuilder; struct KeyValue; +struct KeyValueBuilder; struct EnumVal; +struct EnumValBuilder; struct Enum; +struct EnumBuilder; struct Field; +struct FieldBuilder; struct Object; +struct ObjectBuilder; struct RPCCall; +struct RPCCallBuilder; struct Service; +struct ServiceBuilder; struct Schema; +struct SchemaBuilder; enum BaseType { None = 0, @@ -103,6 +112,7 @@ inline const char *EnumNameBaseType(BaseType e) { } struct Type FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef TypeBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_BASE_TYPE = 4, VT_ELEMENT = 6, @@ -132,6 +142,7 @@ struct Type FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { }; struct TypeBuilder { + typedef Type Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_base_type(reflection::BaseType base_type) { @@ -173,6 +184,7 @@ inline flatbuffers::Offset CreateType( } struct KeyValue FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef KeyValueBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_KEY = 4, VT_VALUE = 6 @@ -200,6 +212,7 @@ struct KeyValue FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { }; struct KeyValueBuilder { + typedef KeyValue Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_key(flatbuffers::Offset key) { @@ -244,6 +257,7 @@ inline flatbuffers::Offset CreateKeyValueDirect( } struct EnumVal FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef EnumValBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_NAME = 4, VT_VALUE = 6, @@ -289,6 +303,7 @@ struct EnumVal FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { }; struct EnumValBuilder { + typedef EnumVal Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_name(flatbuffers::Offset name) { @@ -354,6 +369,7 @@ inline flatbuffers::Offset CreateEnumValDirect( } struct Enum FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef EnumBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_NAME = 4, VT_VALUES = 6, @@ -407,6 +423,7 @@ struct Enum FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { }; struct EnumBuilder { + typedef Enum Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_name(flatbuffers::Offset name) { @@ -483,6 +500,7 @@ inline flatbuffers::Offset CreateEnumDirect( } struct Field FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef FieldBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_NAME = 4, VT_TYPE = 6, @@ -559,6 +577,7 @@ struct Field FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { }; struct FieldBuilder { + typedef Field Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_name(flatbuffers::Offset name) { @@ -668,6 +687,7 @@ inline flatbuffers::Offset CreateFieldDirect( } struct Object FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef ObjectBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_NAME = 4, VT_FIELDS = 6, @@ -725,6 +745,7 @@ struct Object FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { }; struct ObjectBuilder { + typedef Object Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_name(flatbuffers::Offset name) { @@ -807,6 +828,7 @@ inline flatbuffers::Offset CreateObjectDirect( } struct RPCCall FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef RPCCallBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_NAME = 4, VT_REQUEST = 6, @@ -854,6 +876,7 @@ struct RPCCall FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { }; struct RPCCallBuilder { + typedef RPCCall Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_name(flatbuffers::Offset name) { @@ -922,6 +945,7 @@ inline flatbuffers::Offset CreateRPCCallDirect( } struct Service FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef ServiceBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_NAME = 4, VT_CALLS = 6, @@ -964,6 +988,7 @@ struct Service FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { }; struct ServiceBuilder { + typedef Service Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_name(flatbuffers::Offset name) { @@ -1024,6 +1049,7 @@ inline flatbuffers::Offset CreateServiceDirect( } struct Schema FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef SchemaBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_OBJECTS = 4, VT_ENUMS = 6, @@ -1072,6 +1098,7 @@ struct Schema FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { }; struct SchemaBuilder { + typedef Schema Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_objects(flatbuffers::Offset>> objects) { diff --git a/samples/monster_generated.h b/samples/monster_generated.h index 8caef9e98..4a71b606f 100644 --- a/samples/monster_generated.h +++ b/samples/monster_generated.h @@ -12,9 +12,11 @@ namespace Sample { struct Vec3; struct Monster; +struct MonsterBuilder; struct MonsterT; struct Weapon; +struct WeaponBuilder; struct WeaponT; bool operator==(const Vec3 &lhs, const Vec3 &rhs); @@ -256,6 +258,7 @@ inline bool operator!=(const MonsterT &lhs, const MonsterT &rhs) { struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef MonsterT NativeTableType; + typedef MonsterBuilder Builder; static const flatbuffers::TypeTable *MiniReflectTypeTable() { return MonsterTypeTable(); } @@ -362,6 +365,7 @@ template<> inline const MyGame::Sample::Weapon *Monster::equipped_as name) { diff --git a/src/idl_gen_cpp.cpp b/src/idl_gen_cpp.cpp index b59d567ee..12e433754 100644 --- a/src/idl_gen_cpp.cpp +++ b/src/idl_gen_cpp.cpp @@ -273,6 +273,9 @@ class CppGenerator : public BaseGenerator { if (!struct_def.generated) { SetNameSpace(struct_def.defined_namespace); code_ += "struct " + Name(struct_def) + ";"; + if (!struct_def.fixed) { + code_ += "struct " + Name(struct_def) + "Builder;"; + } if (opts_.generate_object_based_api) { auto nativeName = NativeName(Name(struct_def), &struct_def, opts_); if (!struct_def.fixed) { code_ += "struct " + nativeName + ";"; } @@ -1833,6 +1836,7 @@ class CppGenerator : public BaseGenerator { if (opts_.generate_object_based_api) { code_ += " typedef {{NATIVE_NAME}} NativeTableType;"; } + code_ += " typedef {{STRUCT_NAME}}Builder Builder;"; if (opts_.mini_reflect != IDLOptions::kNone) { code_ += " static const flatbuffers::TypeTable *MiniReflectTypeTable() {"; @@ -2085,6 +2089,7 @@ class CppGenerator : public BaseGenerator { // Generate a builder struct: code_ += "struct {{STRUCT_NAME}}Builder {"; + code_ += " typedef {{STRUCT_NAME}} Table;"; code_ += " flatbuffers::FlatBufferBuilder &fbb_;"; code_ += " flatbuffers::uoffset_t start_;"; diff --git a/tests/arrays_test_generated.h b/tests/arrays_test_generated.h index 746ff9c72..d533c74c1 100644 --- a/tests/arrays_test_generated.h +++ b/tests/arrays_test_generated.h @@ -14,6 +14,7 @@ struct NestedStruct; struct ArrayStruct; struct ArrayTable; +struct ArrayTableBuilder; struct ArrayTableT; bool operator==(const NestedStruct &lhs, const NestedStruct &rhs); @@ -229,6 +230,7 @@ inline bool operator!=(const ArrayTableT &lhs, const ArrayTableT &rhs) { struct ArrayTable FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef ArrayTableT NativeTableType; + typedef ArrayTableBuilder Builder; static const flatbuffers::TypeTable *MiniReflectTypeTable() { return ArrayTableTypeTable(); } @@ -252,6 +254,7 @@ struct ArrayTable FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { }; struct ArrayTableBuilder { + typedef ArrayTable Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_a(const MyGame::Example::ArrayStruct *a) { diff --git a/tests/cpp17/generated_cpp17/monster_test_generated.h b/tests/cpp17/generated_cpp17/monster_test_generated.h index d539394f7..ea29cfc5d 100644 --- a/tests/cpp17/generated_cpp17/monster_test_generated.h +++ b/tests/cpp17/generated_cpp17/monster_test_generated.h @@ -10,11 +10,13 @@ namespace MyGame { struct InParentNamespace; +struct InParentNamespaceBuilder; struct InParentNamespaceT; namespace Example2 { struct Monster; +struct MonsterBuilder; struct MonsterT; } // namespace Example2 @@ -24,6 +26,7 @@ namespace Example { struct Test; struct TestSimpleTableWithEnum; +struct TestSimpleTableWithEnumBuilder; struct TestSimpleTableWithEnumT; struct Vec3; @@ -31,15 +34,19 @@ struct Vec3; struct Ability; struct Stat; +struct StatBuilder; struct StatT; struct Referrable; +struct ReferrableBuilder; struct ReferrableT; struct Monster; +struct MonsterBuilder; struct MonsterT; struct TypeAliases; +struct TypeAliasesBuilder; struct TypeAliasesT; } // namespace Example @@ -613,6 +620,7 @@ struct InParentNamespaceT : public flatbuffers::NativeTable { struct InParentNamespace FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef InParentNamespaceT NativeTableType; + typedef InParentNamespaceBuilder Builder; static const flatbuffers::TypeTable *MiniReflectTypeTable() { return InParentNamespaceTypeTable(); } @@ -626,6 +634,7 @@ struct InParentNamespace FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { }; struct InParentNamespaceBuilder { + typedef InParentNamespace Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; explicit InParentNamespaceBuilder(flatbuffers::FlatBufferBuilder &_fbb) @@ -658,6 +667,7 @@ struct MonsterT : public flatbuffers::NativeTable { struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef MonsterT NativeTableType; + typedef MonsterBuilder Builder; static const flatbuffers::TypeTable *MiniReflectTypeTable() { return MonsterTypeTable(); } @@ -671,6 +681,7 @@ struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { }; struct MonsterBuilder { + typedef Monster Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; explicit MonsterBuilder(flatbuffers::FlatBufferBuilder &_fbb) @@ -707,6 +718,7 @@ struct TestSimpleTableWithEnumT : public flatbuffers::NativeTable { struct TestSimpleTableWithEnum FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef TestSimpleTableWithEnumT NativeTableType; + typedef TestSimpleTableWithEnumBuilder Builder; static const flatbuffers::TypeTable *MiniReflectTypeTable() { return TestSimpleTableWithEnumTypeTable(); } @@ -730,6 +742,7 @@ struct TestSimpleTableWithEnum FLATBUFFERS_FINAL_CLASS : private flatbuffers::Ta }; struct TestSimpleTableWithEnumBuilder { + typedef TestSimpleTableWithEnum Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_color(MyGame::Example::Color color) { @@ -770,6 +783,7 @@ struct StatT : public flatbuffers::NativeTable { struct Stat FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef StatT NativeTableType; + typedef StatBuilder Builder; static const flatbuffers::TypeTable *MiniReflectTypeTable() { return StatTypeTable(); } @@ -810,6 +824,7 @@ struct Stat FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { }; struct StatBuilder { + typedef Stat Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_id(flatbuffers::Offset id) { @@ -870,6 +885,7 @@ struct ReferrableT : public flatbuffers::NativeTable { struct Referrable FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef ReferrableT NativeTableType; + typedef ReferrableBuilder Builder; static const flatbuffers::TypeTable *MiniReflectTypeTable() { return ReferrableTypeTable(); } @@ -899,6 +915,7 @@ struct Referrable FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { }; struct ReferrableBuilder { + typedef Referrable Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_id(uint64_t id) { @@ -999,6 +1016,7 @@ struct MonsterT : public flatbuffers::NativeTable { /// an example documentation comment: monster object struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef MonsterT NativeTableType; + typedef MonsterBuilder Builder; static const flatbuffers::TypeTable *MiniReflectTypeTable() { return MonsterTypeTable(); } @@ -1486,6 +1504,7 @@ template<> inline const MyGame::Example2::Monster *Monster::any_unique_as id) { @@ -1072,6 +1087,7 @@ inline bool operator!=(const ReferrableT &lhs, const ReferrableT &rhs) { struct Referrable FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef ReferrableT NativeTableType; + typedef ReferrableBuilder Builder; static const flatbuffers::TypeTable *MiniReflectTypeTable() { return ReferrableTypeTable(); } @@ -1101,6 +1117,7 @@ struct Referrable FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { }; struct ReferrableBuilder { + typedef Referrable Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_id(uint64_t id) { @@ -1255,6 +1272,7 @@ inline bool operator!=(const MonsterT &lhs, const MonsterT &rhs) { /// an example documentation comment: monster object struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef MonsterT NativeTableType; + typedef MonsterBuilder Builder; static const flatbuffers::TypeTable *MiniReflectTypeTable() { return MonsterTypeTable(); } @@ -1742,6 +1760,7 @@ template<> inline const MyGame::Example2::Monster *Monster::any_unique_as foo_table) { @@ -180,6 +185,7 @@ inline bool operator!=(const TableInCT &lhs, const TableInCT &rhs) { struct TableInC FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef TableInCT NativeTableType; + typedef TableInCBuilder Builder; static const flatbuffers::TypeTable *MiniReflectTypeTable() { return TableInCTypeTable(); } @@ -213,6 +219,7 @@ struct TableInC FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { }; struct TableInCBuilder { + typedef TableInC Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_refer_to_a1(flatbuffers::Offset refer_to_a1) { @@ -268,6 +275,7 @@ inline bool operator!=(const SecondTableInAT &lhs, const SecondTableInAT &rhs) { struct SecondTableInA FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef SecondTableInAT NativeTableType; + typedef SecondTableInABuilder Builder; static const flatbuffers::TypeTable *MiniReflectTypeTable() { return SecondTableInATypeTable(); } @@ -292,6 +300,7 @@ struct SecondTableInA FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { }; struct SecondTableInABuilder { + typedef SecondTableInA Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_refer_to_c(flatbuffers::Offset refer_to_c) { diff --git a/tests/native_type_test_generated.h b/tests/native_type_test_generated.h index f21752f9f..4e3fc4cec 100644 --- a/tests/native_type_test_generated.h +++ b/tests/native_type_test_generated.h @@ -13,6 +13,7 @@ namespace Geometry { struct Vector3D; struct ApplicationData; +struct ApplicationDataBuilder; struct ApplicationDataT; inline const flatbuffers::TypeTable *Vector3DTypeTable(); @@ -67,6 +68,7 @@ struct ApplicationDataT : public flatbuffers::NativeTable { struct ApplicationData FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef ApplicationDataT NativeTableType; + typedef ApplicationDataBuilder Builder; static const flatbuffers::TypeTable *MiniReflectTypeTable() { return ApplicationDataTypeTable(); } @@ -91,6 +93,7 @@ struct ApplicationData FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { }; struct ApplicationDataBuilder { + typedef ApplicationData Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_vectors(flatbuffers::Offset> vectors) { diff --git a/tests/union_vector/union_vector_generated.h b/tests/union_vector/union_vector_generated.h index 9e21f704f..b38d757f6 100644 --- a/tests/union_vector/union_vector_generated.h +++ b/tests/union_vector/union_vector_generated.h @@ -7,6 +7,7 @@ #include "flatbuffers/flatbuffers.h" struct Attacker; +struct AttackerBuilder; struct AttackerT; struct Rapunzel; @@ -14,6 +15,7 @@ struct Rapunzel; struct BookReader; struct Movie; +struct MovieBuilder; struct MovieT; bool operator==(const AttackerT &lhs, const AttackerT &rhs); @@ -278,6 +280,7 @@ inline bool operator!=(const AttackerT &lhs, const AttackerT &rhs) { struct Attacker FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef AttackerT NativeTableType; + typedef AttackerBuilder Builder; static const flatbuffers::TypeTable *MiniReflectTypeTable() { return AttackerTypeTable(); } @@ -301,6 +304,7 @@ struct Attacker FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { }; struct AttackerBuilder { + typedef Attacker Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_sword_attack_damage(int32_t sword_attack_damage) { @@ -349,6 +353,7 @@ inline bool operator!=(const MovieT &lhs, const MovieT &rhs) { struct Movie FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef MovieT NativeTableType; + typedef MovieBuilder Builder; static const flatbuffers::TypeTable *MiniReflectTypeTable() { return MovieTypeTable(); } @@ -415,6 +420,7 @@ struct Movie FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { }; struct MovieBuilder { + typedef Movie Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_main_character_type(Character main_character_type) {