diff --git a/CMakeLists.txt b/CMakeLists.txt index ca06af42e..456d0bee0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -478,6 +478,7 @@ if(FLATBUFFERS_BUILD_TESTS) compile_flatbuffers_schema_to_cpp(tests/namespace_test/namespace_test1.fbs) compile_flatbuffers_schema_to_cpp(tests/namespace_test/namespace_test2.fbs) compile_flatbuffers_schema_to_cpp(tests/union_vector/union_vector.fbs) + compile_flatbuffers_schema_to_cpp(tests/optional_scalars.fbs) compile_flatbuffers_schema_to_cpp_opt(tests/native_type_test.fbs "") compile_flatbuffers_schema_to_cpp_opt(tests/arrays_test.fbs "--scoped-enums;--gen-compare") compile_flatbuffers_schema_to_binary(tests/arrays_test.fbs) diff --git a/include/flatbuffers/flatbuffers.h b/include/flatbuffers/flatbuffers.h index 28441248e..799f6478a 100644 --- a/include/flatbuffers/flatbuffers.h +++ b/include/flatbuffers/flatbuffers.h @@ -2747,7 +2747,7 @@ inline const char * const *ElementaryTypeNames() { // Basic type info cost just 16bits per field! struct TypeCode { uint16_t base_type : 4; // ElementaryType - uint16_t is_vector : 1; + uint16_t is_repeating : 1; // Either vector (in table) or array (in struct) int16_t sequence_ref : 11; // Index into type_refs below, or -1 for none. }; @@ -2763,6 +2763,7 @@ struct TypeTable { size_t num_elems; // of type_codes, values, names (but not type_refs). const TypeCode *type_codes; // num_elems count const TypeFunction *type_refs; // less than num_elems entries (see TypeCode). + const int16_t *array_sizes; // less than num_elems entries (see TypeCode). const int64_t *values; // Only set for non-consecutive enum/union or structs. const char *const *names; // Only set if compiled with --reflect-names. }; diff --git a/include/flatbuffers/minireflect.h b/include/flatbuffers/minireflect.h index c2babdcc4..26fd86c96 100644 --- a/include/flatbuffers/minireflect.h +++ b/include/flatbuffers/minireflect.h @@ -234,10 +234,11 @@ inline void IterateObject(const uint8_t *obj, const TypeTable *type_table, visitor->StartSequence(); const uint8_t *prev_val = nullptr; size_t set_idx = 0; + size_t array_idx = 0; for (size_t i = 0; i < type_table->num_elems; i++) { auto type_code = type_table->type_codes[i]; auto type = static_cast(type_code.base_type); - auto is_vector = type_code.is_vector != 0; + auto is_repeating = type_code.is_repeating != 0; auto ref_idx = type_code.sequence_ref; const TypeTable *ref = nullptr; if (ref_idx >= 0) { ref = type_table->type_refs[ref_idx](); } @@ -249,15 +250,25 @@ inline void IterateObject(const uint8_t *obj, const TypeTable *type_table, } else { val = obj + type_table->values[i]; } - visitor->Field(i, set_idx, type, is_vector, ref, name, val); + visitor->Field(i, set_idx, type, is_repeating, ref, name, val); if (val) { set_idx++; - if (is_vector) { - val += ReadScalar(val); - auto vec = reinterpret_cast *>(val); + if (is_repeating) { + auto elem_ptr = val; + size_t size = 0; + if (type_table->st == ST_TABLE) { + // variable length vector + val += ReadScalar(val); + auto vec = reinterpret_cast *>(val); + elem_ptr = vec->Data(); + size = vec->size(); + } else { + // otherwise fixed size array + size = type_table->array_sizes[array_idx]; + ++array_idx; + } visitor->StartVector(); - auto elem_ptr = vec->Data(); - for (size_t j = 0; j < vec->size(); j++) { + for (size_t j = 0; j < size; j++) { visitor->Element(j, type, ref, elem_ptr); IterateValue(type, elem_ptr, ref, prev_val, static_cast(j), visitor); diff --git a/samples/monster_generated.h b/samples/monster_generated.h index 42482f6ed..531d65fdc 100644 --- a/samples/monster_generated.h +++ b/samples/monster_generated.h @@ -733,7 +733,7 @@ inline const flatbuffers::TypeTable *ColorTypeTable() { "Blue" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_ENUM, 3, type_codes, type_refs, nullptr, names + flatbuffers::ST_ENUM, 3, type_codes, type_refs, nullptr, nullptr, names }; return &tt; } @@ -751,7 +751,7 @@ inline const flatbuffers::TypeTable *EquipmentTypeTable() { "Weapon" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_UNION, 2, type_codes, type_refs, nullptr, names + flatbuffers::ST_UNION, 2, type_codes, type_refs, nullptr, nullptr, names }; return &tt; } @@ -769,7 +769,7 @@ inline const flatbuffers::TypeTable *Vec3TypeTable() { "z" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_STRUCT, 3, type_codes, nullptr, values, names + flatbuffers::ST_STRUCT, 3, type_codes, nullptr, nullptr, values, names }; return &tt; } @@ -808,7 +808,7 @@ inline const flatbuffers::TypeTable *MonsterTypeTable() { "path" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 11, type_codes, type_refs, nullptr, names + flatbuffers::ST_TABLE, 11, type_codes, type_refs, nullptr, nullptr, names }; return &tt; } @@ -823,7 +823,7 @@ inline const flatbuffers::TypeTable *WeaponTypeTable() { "damage" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 2, type_codes, nullptr, nullptr, names + flatbuffers::ST_TABLE, 2, type_codes, nullptr, nullptr, nullptr, names }; return &tt; } diff --git a/src/idl_gen_cpp.cpp b/src/idl_gen_cpp.cpp index 6ac73579d..260f0223a 100644 --- a/src/idl_gen_cpp.cpp +++ b/src/idl_gen_cpp.cpp @@ -954,11 +954,13 @@ class CppGenerator : public BaseGenerator { } std::string ts; std::vector type_refs; + std::vector array_sizes; for (auto it = types.begin(); it != types.end(); ++it) { auto &type = *it; if (!ts.empty()) ts += ",\n "; auto is_vector = type.base_type == BASE_TYPE_VECTOR; - auto bt = is_vector ? type.element : type.base_type; + auto is_array = type.base_type == BASE_TYPE_ARRAY; + auto bt = is_vector || is_array ? type.element : type.base_type; auto et = IsScalar(bt) || bt == BASE_TYPE_STRING ? bt - BASE_TYPE_UTYPE + ET_UTYPE : ET_SEQUENCE; @@ -980,14 +982,21 @@ class CppGenerator : public BaseGenerator { type_refs.push_back(ref_name); } } + if (is_array) { array_sizes.push_back(type.fixed_length); } ts += "{ flatbuffers::" + std::string(ElementaryTypeNames()[et]) + ", " + - NumToString(is_vector) + ", " + NumToString(ref_idx) + " }"; + NumToString(is_vector || is_array) + ", " + NumToString(ref_idx) + + " }"; } std::string rs; for (auto it = type_refs.begin(); it != type_refs.end(); ++it) { if (!rs.empty()) rs += ",\n "; rs += *it + "TypeTable"; } + std::string as; + for (auto it = array_sizes.begin(); it != array_sizes.end(); ++it) { + as += NumToString(*it); + as += ", "; + } std::string ns; for (auto it = names.begin(); it != names.end(); ++it) { if (!ns.empty()) ns += ",\n "; @@ -1016,6 +1025,7 @@ class CppGenerator : public BaseGenerator { } code_.SetValue("TYPES", ts); code_.SetValue("REFS", rs); + code_.SetValue("ARRAYSIZES", as); code_.SetValue("NAMES", ns); code_.SetValue("VALUES", vs); code_ += "inline const flatbuffers::TypeTable *{{NAME}}TypeTable() {"; @@ -1029,6 +1039,9 @@ class CppGenerator : public BaseGenerator { code_ += " {{REFS}}"; code_ += " };"; } + if (!as.empty()) { + code_ += " static const int16_t array_sizes[] = { {{ARRAYSIZES}} };"; + } if (!vs.empty()) { // Problem with uint64_t values greater than 9223372036854775807ULL. code_ += " static const int64_t values[] = { {{VALUES}} };"; @@ -1044,6 +1057,7 @@ class CppGenerator : public BaseGenerator { code_ += std::string(" flatbuffers::{{SEQ_TYPE}}, {{NUM_FIELDS}}, ") + (num_fields ? "type_codes, " : "nullptr, ") + (!type_refs.empty() ? "type_refs, " : "nullptr, ") + + (!as.empty() ? "array_sizes, " : "nullptr, ") + (!vs.empty() ? "values, " : "nullptr, ") + (has_names ? "names" : "nullptr"); code_ += " };"; diff --git a/tests/arrays_test_generated.h b/tests/arrays_test_generated.h index b7aae3b1e..eaea1c12b 100644 --- a/tests/arrays_test_generated.h +++ b/tests/arrays_test_generated.h @@ -341,21 +341,22 @@ inline const flatbuffers::TypeTable *TestEnumTypeTable() { "C" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_ENUM, 3, type_codes, type_refs, nullptr, names + flatbuffers::ST_ENUM, 3, type_codes, type_refs, nullptr, nullptr, names }; return &tt; } inline const flatbuffers::TypeTable *NestedStructTypeTable() { static const flatbuffers::TypeCode type_codes[] = { - { flatbuffers::ET_SEQUENCE, 0, -1 }, + { flatbuffers::ET_INT, 1, -1 }, { flatbuffers::ET_CHAR, 0, 0 }, - { flatbuffers::ET_SEQUENCE, 0, 0 }, - { flatbuffers::ET_SEQUENCE, 0, -1 } + { flatbuffers::ET_CHAR, 1, 0 }, + { flatbuffers::ET_LONG, 1, -1 } }; static const flatbuffers::TypeFunction type_refs[] = { MyGame::Example::TestEnumTypeTable }; + static const int16_t array_sizes[] = { 2, 2, 2, }; static const int64_t values[] = { 0, 8, 9, 16, 32 }; static const char * const names[] = { "a", @@ -364,7 +365,7 @@ inline const flatbuffers::TypeTable *NestedStructTypeTable() { "d" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_STRUCT, 4, type_codes, type_refs, values, names + flatbuffers::ST_STRUCT, 4, type_codes, type_refs, array_sizes, values, names }; return &tt; } @@ -372,15 +373,16 @@ inline const flatbuffers::TypeTable *NestedStructTypeTable() { inline const flatbuffers::TypeTable *ArrayStructTypeTable() { static const flatbuffers::TypeCode type_codes[] = { { flatbuffers::ET_FLOAT, 0, -1 }, - { flatbuffers::ET_SEQUENCE, 0, -1 }, + { flatbuffers::ET_INT, 1, -1 }, { flatbuffers::ET_CHAR, 0, -1 }, - { flatbuffers::ET_SEQUENCE, 0, 0 }, + { flatbuffers::ET_SEQUENCE, 1, 0 }, { flatbuffers::ET_INT, 0, -1 }, - { flatbuffers::ET_SEQUENCE, 0, -1 } + { flatbuffers::ET_LONG, 1, -1 } }; static const flatbuffers::TypeFunction type_refs[] = { MyGame::Example::NestedStructTypeTable }; + static const int16_t array_sizes[] = { 15, 2, 2, }; static const int64_t values[] = { 0, 4, 64, 72, 136, 144, 160 }; static const char * const names[] = { "a", @@ -391,7 +393,7 @@ inline const flatbuffers::TypeTable *ArrayStructTypeTable() { "f" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_STRUCT, 6, type_codes, type_refs, values, names + flatbuffers::ST_STRUCT, 6, type_codes, type_refs, array_sizes, values, names }; return &tt; } @@ -407,7 +409,7 @@ inline const flatbuffers::TypeTable *ArrayTableTypeTable() { "a" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 1, type_codes, type_refs, nullptr, names + flatbuffers::ST_TABLE, 1, type_codes, type_refs, nullptr, nullptr, names }; return &tt; } diff --git a/tests/cpp17/generated_cpp17/monster_test_generated.h b/tests/cpp17/generated_cpp17/monster_test_generated.h index 9e181585c..baa3a6e1e 100644 --- a/tests/cpp17/generated_cpp17/monster_test_generated.h +++ b/tests/cpp17/generated_cpp17/monster_test_generated.h @@ -2867,7 +2867,7 @@ inline const flatbuffers::TypeTable *ColorTypeTable() { "Blue" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_ENUM, 3, type_codes, type_refs, values, names + flatbuffers::ST_ENUM, 3, type_codes, type_refs, nullptr, values, names }; return &tt; } @@ -2890,7 +2890,7 @@ inline const flatbuffers::TypeTable *RaceTypeTable() { "Elf" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_ENUM, 4, type_codes, type_refs, values, names + flatbuffers::ST_ENUM, 4, type_codes, type_refs, nullptr, values, names }; return &tt; } @@ -2914,7 +2914,7 @@ inline const flatbuffers::TypeTable *AnyTypeTable() { "MyGame_Example2_Monster" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, names + flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, nullptr, names }; return &tt; } @@ -2938,7 +2938,7 @@ inline const flatbuffers::TypeTable *AnyUniqueAliasesTypeTable() { "M2" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, names + flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, nullptr, names }; return &tt; } @@ -2960,7 +2960,7 @@ inline const flatbuffers::TypeTable *AnyAmbiguousAliasesTypeTable() { "M3" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, names + flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, nullptr, names }; return &tt; } @@ -2969,7 +2969,7 @@ inline const flatbuffers::TypeTable *AnyAmbiguousAliasesTypeTable() { inline const flatbuffers::TypeTable *InParentNamespaceTypeTable() { static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 0, nullptr, nullptr, nullptr, nullptr + flatbuffers::ST_TABLE, 0, nullptr, nullptr, nullptr, nullptr, nullptr }; return &tt; } @@ -2978,7 +2978,7 @@ namespace Example2 { inline const flatbuffers::TypeTable *MonsterTypeTable() { static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 0, nullptr, nullptr, nullptr, nullptr + flatbuffers::ST_TABLE, 0, nullptr, nullptr, nullptr, nullptr, nullptr }; return &tt; } @@ -2998,7 +2998,7 @@ inline const flatbuffers::TypeTable *TestTypeTable() { "b" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_STRUCT, 2, type_codes, nullptr, values, names + flatbuffers::ST_STRUCT, 2, type_codes, nullptr, nullptr, values, names }; return &tt; } @@ -3014,7 +3014,7 @@ inline const flatbuffers::TypeTable *TestSimpleTableWithEnumTypeTable() { "color" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 1, type_codes, type_refs, nullptr, names + flatbuffers::ST_TABLE, 1, type_codes, type_refs, nullptr, nullptr, names }; return &tt; } @@ -3042,7 +3042,7 @@ inline const flatbuffers::TypeTable *Vec3TypeTable() { "test3" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_STRUCT, 6, type_codes, type_refs, values, names + flatbuffers::ST_STRUCT, 6, type_codes, type_refs, nullptr, values, names }; return &tt; } @@ -3058,7 +3058,7 @@ inline const flatbuffers::TypeTable *AbilityTypeTable() { "distance" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_STRUCT, 2, type_codes, nullptr, values, names + flatbuffers::ST_STRUCT, 2, type_codes, nullptr, nullptr, values, names }; return &tt; } @@ -3075,7 +3075,7 @@ inline const flatbuffers::TypeTable *StatTypeTable() { "count" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 3, type_codes, nullptr, nullptr, names + flatbuffers::ST_TABLE, 3, type_codes, nullptr, nullptr, nullptr, names }; return &tt; } @@ -3088,7 +3088,7 @@ inline const flatbuffers::TypeTable *ReferrableTypeTable() { "id" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 1, type_codes, nullptr, nullptr, names + flatbuffers::ST_TABLE, 1, type_codes, nullptr, nullptr, nullptr, names }; return &tt; } @@ -3211,7 +3211,7 @@ inline const flatbuffers::TypeTable *MonsterTypeTable() { "signed_enum" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 49, type_codes, type_refs, nullptr, names + flatbuffers::ST_TABLE, 49, type_codes, type_refs, nullptr, nullptr, names }; return &tt; } @@ -3246,7 +3246,7 @@ inline const flatbuffers::TypeTable *TypeAliasesTypeTable() { "vf64" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 12, type_codes, nullptr, nullptr, names + flatbuffers::ST_TABLE, 12, type_codes, nullptr, nullptr, nullptr, names }; return &tt; } diff --git a/tests/cpp17/generated_cpp17/optional_scalars_generated.h b/tests/cpp17/generated_cpp17/optional_scalars_generated.h index cc879137c..60c09e76f 100644 --- a/tests/cpp17/generated_cpp17/optional_scalars_generated.h +++ b/tests/cpp17/generated_cpp17/optional_scalars_generated.h @@ -725,7 +725,7 @@ inline const flatbuffers::TypeTable *OptionalByteTypeTable() { "One" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_ENUM, 2, type_codes, type_refs, nullptr, names + flatbuffers::ST_ENUM, 2, type_codes, type_refs, nullptr, nullptr, names }; return &tt; } @@ -809,7 +809,7 @@ inline const flatbuffers::TypeTable *ScalarStuffTypeTable() { "default_enum" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 35, type_codes, type_refs, nullptr, names + flatbuffers::ST_TABLE, 35, type_codes, type_refs, nullptr, nullptr, names }; return &tt; } diff --git a/tests/monster_extra_generated.h b/tests/monster_extra_generated.h index 231d6c12e..5c4d8de1c 100644 --- a/tests/monster_extra_generated.h +++ b/tests/monster_extra_generated.h @@ -341,7 +341,7 @@ inline const flatbuffers::TypeTable *MonsterExtraTypeTable() { "deprec" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 11, type_codes, nullptr, nullptr, names + flatbuffers::ST_TABLE, 11, type_codes, nullptr, nullptr, nullptr, names }; return &tt; } diff --git a/tests/monster_test_generated.h b/tests/monster_test_generated.h index 38f33eb4c..b932622bf 100644 --- a/tests/monster_test_generated.h +++ b/tests/monster_test_generated.h @@ -3149,7 +3149,7 @@ inline const flatbuffers::TypeTable *ColorTypeTable() { "Blue" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_ENUM, 3, type_codes, type_refs, values, names + flatbuffers::ST_ENUM, 3, type_codes, type_refs, nullptr, values, names }; return &tt; } @@ -3172,7 +3172,7 @@ inline const flatbuffers::TypeTable *RaceTypeTable() { "Elf" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_ENUM, 4, type_codes, type_refs, values, names + flatbuffers::ST_ENUM, 4, type_codes, type_refs, nullptr, values, names }; return &tt; } @@ -3196,7 +3196,7 @@ inline const flatbuffers::TypeTable *AnyTypeTable() { "MyGame_Example2_Monster" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, names + flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, nullptr, names }; return &tt; } @@ -3220,7 +3220,7 @@ inline const flatbuffers::TypeTable *AnyUniqueAliasesTypeTable() { "M2" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, names + flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, nullptr, names }; return &tt; } @@ -3242,7 +3242,7 @@ inline const flatbuffers::TypeTable *AnyAmbiguousAliasesTypeTable() { "M3" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, names + flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, nullptr, names }; return &tt; } @@ -3251,7 +3251,7 @@ inline const flatbuffers::TypeTable *AnyAmbiguousAliasesTypeTable() { inline const flatbuffers::TypeTable *InParentNamespaceTypeTable() { static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 0, nullptr, nullptr, nullptr, nullptr + flatbuffers::ST_TABLE, 0, nullptr, nullptr, nullptr, nullptr, nullptr }; return &tt; } @@ -3260,7 +3260,7 @@ namespace Example2 { inline const flatbuffers::TypeTable *MonsterTypeTable() { static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 0, nullptr, nullptr, nullptr, nullptr + flatbuffers::ST_TABLE, 0, nullptr, nullptr, nullptr, nullptr, nullptr }; return &tt; } @@ -3280,7 +3280,7 @@ inline const flatbuffers::TypeTable *TestTypeTable() { "b" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_STRUCT, 2, type_codes, nullptr, values, names + flatbuffers::ST_STRUCT, 2, type_codes, nullptr, nullptr, values, names }; return &tt; } @@ -3296,7 +3296,7 @@ inline const flatbuffers::TypeTable *TestSimpleTableWithEnumTypeTable() { "color" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 1, type_codes, type_refs, nullptr, names + flatbuffers::ST_TABLE, 1, type_codes, type_refs, nullptr, nullptr, names }; return &tt; } @@ -3324,7 +3324,7 @@ inline const flatbuffers::TypeTable *Vec3TypeTable() { "test3" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_STRUCT, 6, type_codes, type_refs, values, names + flatbuffers::ST_STRUCT, 6, type_codes, type_refs, nullptr, values, names }; return &tt; } @@ -3340,7 +3340,7 @@ inline const flatbuffers::TypeTable *AbilityTypeTable() { "distance" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_STRUCT, 2, type_codes, nullptr, values, names + flatbuffers::ST_STRUCT, 2, type_codes, nullptr, nullptr, values, names }; return &tt; } @@ -3357,7 +3357,7 @@ inline const flatbuffers::TypeTable *StatTypeTable() { "count" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 3, type_codes, nullptr, nullptr, names + flatbuffers::ST_TABLE, 3, type_codes, nullptr, nullptr, nullptr, names }; return &tt; } @@ -3370,7 +3370,7 @@ inline const flatbuffers::TypeTable *ReferrableTypeTable() { "id" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 1, type_codes, nullptr, nullptr, names + flatbuffers::ST_TABLE, 1, type_codes, nullptr, nullptr, nullptr, names }; return &tt; } @@ -3493,7 +3493,7 @@ inline const flatbuffers::TypeTable *MonsterTypeTable() { "signed_enum" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 49, type_codes, type_refs, nullptr, names + flatbuffers::ST_TABLE, 49, type_codes, type_refs, nullptr, nullptr, names }; return &tt; } @@ -3528,7 +3528,7 @@ inline const flatbuffers::TypeTable *TypeAliasesTypeTable() { "vf64" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 12, type_codes, nullptr, nullptr, names + flatbuffers::ST_TABLE, 12, type_codes, nullptr, nullptr, nullptr, names }; return &tt; } diff --git a/tests/namespace_test/namespace_test1_generated.h b/tests/namespace_test/namespace_test1_generated.h index 416d39a91..5ec21f81a 100644 --- a/tests/namespace_test/namespace_test1_generated.h +++ b/tests/namespace_test/namespace_test1_generated.h @@ -221,7 +221,7 @@ inline const flatbuffers::TypeTable *EnumInNestedNSTypeTable() { "C" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_ENUM, 3, type_codes, type_refs, nullptr, names + flatbuffers::ST_ENUM, 3, type_codes, type_refs, nullptr, nullptr, names }; return &tt; } @@ -234,7 +234,7 @@ inline const flatbuffers::TypeTable *TableInNestedNSTypeTable() { "foo" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 1, type_codes, nullptr, nullptr, names + flatbuffers::ST_TABLE, 1, type_codes, nullptr, nullptr, nullptr, names }; return &tt; } @@ -250,7 +250,7 @@ inline const flatbuffers::TypeTable *StructInNestedNSTypeTable() { "b" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_STRUCT, 2, type_codes, nullptr, values, names + flatbuffers::ST_STRUCT, 2, type_codes, nullptr, nullptr, values, names }; return &tt; } diff --git a/tests/namespace_test/namespace_test2_generated.h b/tests/namespace_test/namespace_test2_generated.h index a0504263b..9c0a1b6cf 100644 --- a/tests/namespace_test/namespace_test2_generated.h +++ b/tests/namespace_test/namespace_test2_generated.h @@ -455,7 +455,7 @@ inline const flatbuffers::TypeTable *TableInFirstNSTypeTable() { "foo_struct" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 3, type_codes, type_refs, nullptr, names + flatbuffers::ST_TABLE, 3, type_codes, type_refs, nullptr, nullptr, names }; return &tt; } @@ -478,7 +478,7 @@ inline const flatbuffers::TypeTable *TableInCTypeTable() { "refer_to_a2" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 2, type_codes, type_refs, nullptr, names + flatbuffers::ST_TABLE, 2, type_codes, type_refs, nullptr, nullptr, names }; return &tt; } @@ -498,7 +498,7 @@ inline const flatbuffers::TypeTable *SecondTableInATypeTable() { "refer_to_c" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 1, type_codes, type_refs, nullptr, names + flatbuffers::ST_TABLE, 1, type_codes, type_refs, nullptr, nullptr, names }; return &tt; } diff --git a/tests/native_type_test_generated.h b/tests/native_type_test_generated.h index 1b38724ff..e504c926d 100644 --- a/tests/native_type_test_generated.h +++ b/tests/native_type_test_generated.h @@ -170,7 +170,7 @@ inline const flatbuffers::TypeTable *Vector3DTypeTable() { "z" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_STRUCT, 3, type_codes, nullptr, values, names + flatbuffers::ST_STRUCT, 3, type_codes, nullptr, nullptr, values, names }; return &tt; } @@ -186,7 +186,7 @@ inline const flatbuffers::TypeTable *ApplicationDataTypeTable() { "vectors" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 1, type_codes, type_refs, nullptr, names + flatbuffers::ST_TABLE, 1, type_codes, type_refs, nullptr, nullptr, names }; return &tt; } diff --git a/tests/optional_scalars_generated.h b/tests/optional_scalars_generated.h index 95e51d3b0..6e2b49cc1 100644 --- a/tests/optional_scalars_generated.h +++ b/tests/optional_scalars_generated.h @@ -803,7 +803,7 @@ inline const flatbuffers::TypeTable *OptionalByteTypeTable() { "One" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_ENUM, 2, type_codes, type_refs, nullptr, names + flatbuffers::ST_ENUM, 2, type_codes, type_refs, nullptr, nullptr, names }; return &tt; } @@ -887,7 +887,7 @@ inline const flatbuffers::TypeTable *ScalarStuffTypeTable() { "default_enum" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 35, type_codes, type_refs, nullptr, names + flatbuffers::ST_TABLE, 35, type_codes, type_refs, nullptr, nullptr, names }; return &tt; } diff --git a/tests/test.cpp b/tests/test.cpp index 3f205603f..93f95d9aa 100644 --- a/tests/test.cpp +++ b/tests/test.cpp @@ -1108,6 +1108,30 @@ void MiniReflectFlatBuffersTest(uint8_t *flatbuf) { "16, b: 32 } }"); } +void MiniReflectFixedLengthArrayTest() { + // VS10 does not support typed enums, exclude from tests +#if !defined(_MSC_VER) || _MSC_VER >= 1700 + flatbuffers::FlatBufferBuilder fbb; + MyGame::Example::ArrayStruct aStruct(2, 12, 1); + auto aTable = MyGame::Example::CreateArrayTable(fbb, &aStruct); + fbb.Finish(aTable); + + auto flatbuf = fbb.Release(); + auto s = flatbuffers::FlatBufferToString( + flatbuf.data(), MyGame::Example::ArrayTableTypeTable()); + TEST_EQ_STR( + "{ " + "a: { a: 2.0, " + "b: [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], " + "c: 12, " + "d: [ { a: [ 0, 0 ], b: A, c: [ A, A ], d: [ 0, 0 ] }, " + "{ a: [ 0, 0 ], b: A, c: [ A, A ], d: [ 0, 0 ] } ], " + "e: 1, f: [ 0, 0 ] } " + "}", + s.c_str()); +#endif +} + // Parse a .proto schema, output as .fbs void ParseProtoTest() { // load the .proto and the golden file from disk @@ -3566,6 +3590,7 @@ int FlatBufferTests() { ObjectFlatBuffersTest(flatbuf.data()); MiniReflectFlatBuffersTest(flatbuf.data()); + MiniReflectFixedLengthArrayTest(); SizePrefixedTest(); diff --git a/tests/union_vector/union_vector_generated.h b/tests/union_vector/union_vector_generated.h index 3cc53cbaa..e6c797127 100644 --- a/tests/union_vector/union_vector_generated.h +++ b/tests/union_vector/union_vector_generated.h @@ -752,7 +752,7 @@ inline const flatbuffers::TypeTable *CharacterTypeTable() { "Unused" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_UNION, 7, type_codes, type_refs, nullptr, names + flatbuffers::ST_UNION, 7, type_codes, type_refs, nullptr, nullptr, names }; return &tt; } @@ -765,7 +765,7 @@ inline const flatbuffers::TypeTable *AttackerTypeTable() { "sword_attack_damage" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 1, type_codes, nullptr, nullptr, names + flatbuffers::ST_TABLE, 1, type_codes, nullptr, nullptr, nullptr, names }; return &tt; } @@ -779,7 +779,7 @@ inline const flatbuffers::TypeTable *RapunzelTypeTable() { "hair_length" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_STRUCT, 1, type_codes, nullptr, values, names + flatbuffers::ST_STRUCT, 1, type_codes, nullptr, nullptr, values, names }; return &tt; } @@ -793,7 +793,7 @@ inline const flatbuffers::TypeTable *BookReaderTypeTable() { "books_read" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_STRUCT, 1, type_codes, nullptr, values, names + flatbuffers::ST_STRUCT, 1, type_codes, nullptr, nullptr, values, names }; return &tt; } @@ -815,7 +815,7 @@ inline const flatbuffers::TypeTable *MovieTypeTable() { "characters" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 4, type_codes, type_refs, nullptr, names + flatbuffers::ST_TABLE, 4, type_codes, type_refs, nullptr, nullptr, names }; return &tt; }