[C++] Fix compile failure on Object API union construction for struct member (#6923)

* Add dedicated traits to Object API version of unions.

* Add suppression for unused parameters on unions of structs.
This commit is contained in:
Taiju Tsuiki
2021-11-19 03:55:11 +09:00
committed by GitHub
parent a9c341545f
commit 587bbd49a7
29 changed files with 1990 additions and 17 deletions

View File

@@ -212,6 +212,22 @@ template<> struct AnyTraits<MyGame::Example2::Monster> {
static const Any enum_value = Any::MyGame_Example2_Monster;
};
template<typename T> struct AnyUnionTraits {
static const Any enum_value = Any::NONE;
};
template<> struct AnyUnionTraits<MyGame::Example::MonsterT> {
static const Any enum_value = Any::Monster;
};
template<> struct AnyUnionTraits<MyGame::Example::TestSimpleTableWithEnumT> {
static const Any enum_value = Any::TestSimpleTableWithEnum;
};
template<> struct AnyUnionTraits<MyGame::Example2::MonsterT> {
static const Any enum_value = Any::MyGame_Example2_Monster;
};
struct AnyUnion {
Any type;
void *value;
@@ -231,9 +247,9 @@ struct AnyUnion {
template <typename T>
void Set(T&& val) {
using RT = typename std::remove_reference<T>::type;
typedef typename std::remove_reference<T>::type RT;
Reset();
type = AnyTraits<typename RT::TableType>::enum_value;
type = AnyUnionTraits<RT>::enum_value;
if (type != Any::NONE) {
value = new RT(std::forward<T>(val));
}
@@ -323,6 +339,22 @@ template<> struct AnyUniqueAliasesTraits<MyGame::Example2::Monster> {
static const AnyUniqueAliases enum_value = AnyUniqueAliases::M2;
};
template<typename T> struct AnyUniqueAliasesUnionTraits {
static const AnyUniqueAliases enum_value = AnyUniqueAliases::NONE;
};
template<> struct AnyUniqueAliasesUnionTraits<MyGame::Example::MonsterT> {
static const AnyUniqueAliases enum_value = AnyUniqueAliases::M;
};
template<> struct AnyUniqueAliasesUnionTraits<MyGame::Example::TestSimpleTableWithEnumT> {
static const AnyUniqueAliases enum_value = AnyUniqueAliases::TS;
};
template<> struct AnyUniqueAliasesUnionTraits<MyGame::Example2::MonsterT> {
static const AnyUniqueAliases enum_value = AnyUniqueAliases::M2;
};
struct AnyUniqueAliasesUnion {
AnyUniqueAliases type;
void *value;
@@ -342,9 +374,9 @@ struct AnyUniqueAliasesUnion {
template <typename T>
void Set(T&& val) {
using RT = typename std::remove_reference<T>::type;
typedef typename std::remove_reference<T>::type RT;
Reset();
type = AnyUniqueAliasesTraits<typename RT::TableType>::enum_value;
type = AnyUniqueAliasesUnionTraits<RT>::enum_value;
if (type != AnyUniqueAliases::NONE) {
value = new RT(std::forward<T>(val));
}
@@ -2936,6 +2968,7 @@ inline bool VerifyAnyVector(flatbuffers::Verifier &verifier, const flatbuffers::
}
inline void *AnyUnion::UnPack(const void *obj, Any type, const flatbuffers::resolver_function_t *resolver) {
(void)resolver;
switch (type) {
case Any::Monster: {
auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);
@@ -2954,6 +2987,7 @@ inline void *AnyUnion::UnPack(const void *obj, Any type, const flatbuffers::reso
}
inline flatbuffers::Offset<void> AnyUnion::Pack(flatbuffers::FlatBufferBuilder &_fbb, const flatbuffers::rehasher_function_t *_rehasher) const {
(void)_rehasher;
switch (type) {
case Any::Monster: {
auto ptr = reinterpret_cast<const MyGame::Example::MonsterT *>(value);
@@ -3047,6 +3081,7 @@ inline bool VerifyAnyUniqueAliasesVector(flatbuffers::Verifier &verifier, const
}
inline void *AnyUniqueAliasesUnion::UnPack(const void *obj, AnyUniqueAliases type, const flatbuffers::resolver_function_t *resolver) {
(void)resolver;
switch (type) {
case AnyUniqueAliases::M: {
auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);
@@ -3065,6 +3100,7 @@ inline void *AnyUniqueAliasesUnion::UnPack(const void *obj, AnyUniqueAliases typ
}
inline flatbuffers::Offset<void> AnyUniqueAliasesUnion::Pack(flatbuffers::FlatBufferBuilder &_fbb, const flatbuffers::rehasher_function_t *_rehasher) const {
(void)_rehasher;
switch (type) {
case AnyUniqueAliases::M: {
auto ptr = reinterpret_cast<const MyGame::Example::MonsterT *>(value);
@@ -3158,6 +3194,7 @@ inline bool VerifyAnyAmbiguousAliasesVector(flatbuffers::Verifier &verifier, con
}
inline void *AnyAmbiguousAliasesUnion::UnPack(const void *obj, AnyAmbiguousAliases type, const flatbuffers::resolver_function_t *resolver) {
(void)resolver;
switch (type) {
case AnyAmbiguousAliases::M1: {
auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);
@@ -3176,6 +3213,7 @@ inline void *AnyAmbiguousAliasesUnion::UnPack(const void *obj, AnyAmbiguousAlias
}
inline flatbuffers::Offset<void> AnyAmbiguousAliasesUnion::Pack(flatbuffers::FlatBufferBuilder &_fbb, const flatbuffers::rehasher_function_t *_rehasher) const {
(void)_rehasher;
switch (type) {
case AnyAmbiguousAliases::M1: {
auto ptr = reinterpret_cast<const MyGame::Example::MonsterT *>(value);