From 2790fee2577e6b064ef514d9cea09b2b6ff5c04b Mon Sep 17 00:00:00 2001 From: cryptocode Date: Tue, 17 Dec 2019 18:11:26 +0100 Subject: [PATCH] Add namespace qualification to union types (#5666) --- samples/monster_generated.h | 4 ++-- src/idl_gen_cpp.cpp | 6 ++++-- tests/monster_test_generated.h | 12 ++++++------ 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/samples/monster_generated.h b/samples/monster_generated.h index fefd7c13c..ca231a4d7 100644 --- a/samples/monster_generated.h +++ b/samples/monster_generated.h @@ -227,7 +227,7 @@ struct MonsterT : public flatbuffers::NativeTable { std::vector inventory; MyGame::Sample::Color color; std::vector> weapons; - EquipmentUnion equipped; + MyGame::Sample::EquipmentUnion equipped; std::vector path; MonsterT() : mana(150), @@ -578,7 +578,7 @@ inline void Monster::UnPackTo(MonsterT *_o, const flatbuffers::resolver_function { auto _e = color(); _o->color = _e; } { auto _e = weapons(); if (_e) { _o->weapons.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->weapons[_i] = flatbuffers::unique_ptr(_e->Get(_i)->UnPack(_resolver)); } } } { auto _e = equipped_type(); _o->equipped.type = _e; } - { auto _e = equipped(); if (_e) _o->equipped.value = EquipmentUnion::UnPack(_e, equipped_type(), _resolver); } + { auto _e = equipped(); if (_e) _o->equipped.value = MyGame::Sample::EquipmentUnion::UnPack(_e, equipped_type(), _resolver); } { auto _e = path(); if (_e) { _o->path.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->path[_i] = *_e->Get(_i); } } } } diff --git a/src/idl_gen_cpp.cpp b/src/idl_gen_cpp.cpp index fd53eceaa..81d6b9141 100644 --- a/src/idl_gen_cpp.cpp +++ b/src/idl_gen_cpp.cpp @@ -693,7 +693,8 @@ class CppGenerator : public BaseGenerator { } } case BASE_TYPE_UNION: { - return type.enum_def->name + "Union"; + auto type_name = WrapInNameSpace(*type.enum_def); + return type_name + "Union"; } default: { return GenTypeBasic(type, true); @@ -2259,7 +2260,8 @@ class CppGenerator : public BaseGenerator { std::string GenUnionUnpackVal(const FieldDef &afield, const char *vec_elem_access, const char *vec_type_access) { - return afield.value.type.enum_def->name + "Union::UnPack(" + "_e" + + auto type_name = WrapInNameSpace(*afield.value.type.enum_def); + return type_name + "Union::UnPack(" + "_e" + vec_elem_access + ", " + EscapeKeyword(afield.name + UnionTypeFieldSuffix()) + "()" + vec_type_access + ", _resolver)"; diff --git a/tests/monster_test_generated.h b/tests/monster_test_generated.h index 40dd12030..0b38eb3a9 100644 --- a/tests/monster_test_generated.h +++ b/tests/monster_test_generated.h @@ -1136,7 +1136,7 @@ struct MonsterT : public flatbuffers::NativeTable { std::string name; std::vector inventory; MyGame::Example::Color color; - AnyUnion test; + MyGame::Example::AnyUnion test; std::vector test4; std::vector testarrayofstring; std::vector> testarrayoftables; @@ -1171,8 +1171,8 @@ struct MonsterT : public flatbuffers::NativeTable { std::vector> vector_of_co_owning_references; ReferrableT *non_owning_reference; std::vector vector_of_non_owning_references; - AnyUniqueAliasesUnion any_unique; - AnyAmbiguousAliasesUnion any_ambiguous; + MyGame::Example::AnyUniqueAliasesUnion any_unique; + MyGame::Example::AnyAmbiguousAliasesUnion any_ambiguous; std::vector vector_of_enums; MyGame::Example::Race signed_enum; MonsterT() @@ -2558,7 +2558,7 @@ inline void Monster::UnPackTo(MonsterT *_o, const flatbuffers::resolver_function { auto _e = inventory(); if (_e) { _o->inventory.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->inventory[_i] = _e->Get(_i); } } } { auto _e = color(); _o->color = _e; } { auto _e = test_type(); _o->test.type = _e; } - { auto _e = test(); if (_e) _o->test.value = AnyUnion::UnPack(_e, test_type(), _resolver); } + { auto _e = test(); if (_e) _o->test.value = MyGame::Example::AnyUnion::UnPack(_e, test_type(), _resolver); } { auto _e = test4(); if (_e) { _o->test4.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->test4[_i] = *_e->Get(_i); } } } { auto _e = testarrayofstring(); if (_e) { _o->testarrayofstring.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayofstring[_i] = _e->Get(_i)->str(); } } } { auto _e = testarrayoftables(); if (_e) { _o->testarrayoftables.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayoftables[_i] = flatbuffers::unique_ptr(_e->Get(_i)->UnPack(_resolver)); } } } @@ -2601,9 +2601,9 @@ if (_resolver) (*_resolver)(reinterpret_cast(&_o->non_owning_reference) { auto _e = vector_of_non_owning_references(); if (_e) { _o->vector_of_non_owning_references.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { //vector resolver, naked if (_resolver) (*_resolver)(reinterpret_cast(&_o->vector_of_non_owning_references[_i]), static_cast(_e->Get(_i))); else _o->vector_of_non_owning_references[_i] = nullptr; } } } { auto _e = any_unique_type(); _o->any_unique.type = _e; } - { auto _e = any_unique(); if (_e) _o->any_unique.value = AnyUniqueAliasesUnion::UnPack(_e, any_unique_type(), _resolver); } + { auto _e = any_unique(); if (_e) _o->any_unique.value = MyGame::Example::AnyUniqueAliasesUnion::UnPack(_e, any_unique_type(), _resolver); } { auto _e = any_ambiguous_type(); _o->any_ambiguous.type = _e; } - { auto _e = any_ambiguous(); if (_e) _o->any_ambiguous.value = AnyAmbiguousAliasesUnion::UnPack(_e, any_ambiguous_type(), _resolver); } + { auto _e = any_ambiguous(); if (_e) _o->any_ambiguous.value = MyGame::Example::AnyAmbiguousAliasesUnion::UnPack(_e, any_ambiguous_type(), _resolver); } { auto _e = vector_of_enums(); if (_e) { _o->vector_of_enums.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vector_of_enums[_i] = static_cast(_e->Get(_i)); } } } { auto _e = signed_enum(); _o->signed_enum = _e; } }