From 67ef70347a1cba3a42a9be43af4830eab459439b Mon Sep 17 00:00:00 2001 From: Paulo Pinheiro Date: Wed, 4 Jan 2023 14:26:13 +0100 Subject: [PATCH] Add pointer reference to sibling union field on FieldDef To make it simple to map between a union field and its union type field we are adding a pointer to FieldDef to point to each other. For all other types the pointer will be nullptr. --- include/flatbuffers/idl.h | 9 ++++++++- src/idl_parser.cpp | 8 ++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/include/flatbuffers/idl.h b/include/flatbuffers/idl.h index b564b1b2714..cd70cb61285 100644 --- a/include/flatbuffers/idl.h +++ b/include/flatbuffers/idl.h @@ -297,7 +297,8 @@ struct FieldDef : public Definition { flexbuffer(false), presence(kDefault), nested_flatbuffer(nullptr), - padding(0) {} + padding(0), + sibling_union_field(nullptr){} Offset Serialize(FlatBufferBuilder *builder, uint16_t id, const Parser &parser) const; @@ -342,6 +343,12 @@ struct FieldDef : public Definition { StructDef *nested_flatbuffer; // This field contains nested FlatBuffer data. size_t padding; // Bytes to always pad after this field. + + // sibling_union_field is always set to nullptr. The only exception is + // when FieldDef is a union field or an union type field. Therefore, + // sibling_union_field on a union field points to the union type field + // and vice-versa. + FieldDef *sibling_union_field; }; struct StructDef : public Definition { diff --git a/src/idl_parser.cpp b/src/idl_parser.cpp index 9650cc9dd5b..360f0c744ab 100644 --- a/src/idl_parser.cpp +++ b/src/idl_parser.cpp @@ -970,6 +970,14 @@ CheckedError Parser::ParseField(StructDef &struct_def) { FieldDef *field; ECHECK(AddField(struct_def, name, type, &field)); + if (typefield) { + // We preserve the relation between the typefield + // and field, so we can easily map it in the code + // generators. + typefield->sibling_union_field = field; + field->sibling_union_field = typefield; + } + if (token_ == '=') { NEXT(); ECHECK(ParseSingleValue(&field->name, field->value, true));