forked from BigfootDev/flatbuffers
Compare commits
5 Commits
master
...
v25.12.19-
| Author | SHA1 | Date | |
|---|---|---|---|
| 505ec2fb6a | |||
| 19aa2ce420 | |||
| 35665b5ae7 | |||
| 9e9f5bbfcf | |||
| 4edfa03ffc |
@@ -240,6 +240,9 @@ set(FlatBuffers_Tests_SRCS
|
|||||||
tests/vector_table_naked_ptr_test.cpp
|
tests/vector_table_naked_ptr_test.cpp
|
||||||
tests/native_type_test_impl.h
|
tests/native_type_test_impl.h
|
||||||
tests/native_type_test_impl.cpp
|
tests/native_type_test_impl.cpp
|
||||||
|
tests/cpp_vec_type_test_impl.h
|
||||||
|
tests/cpp_vec_type_native_type_test_impl.h
|
||||||
|
tests/cpp_vec_type_native_type_test_impl.cpp
|
||||||
tests/alignment_test.h
|
tests/alignment_test.h
|
||||||
tests/alignment_test.cpp
|
tests/alignment_test.cpp
|
||||||
tests/64bit/offset64_test.h
|
tests/64bit/offset64_test.h
|
||||||
@@ -554,6 +557,8 @@ if(FLATBUFFERS_BUILD_TESTS)
|
|||||||
compile_schema_for_test(tests/arrays_test.fbs "${FLATC_OPT_SCOPED_ENUMS}")
|
compile_schema_for_test(tests/arrays_test.fbs "${FLATC_OPT_SCOPED_ENUMS}")
|
||||||
compile_schema_for_test(tests/native_inline_table_test.fbs "${FLATC_OPT_COMP}")
|
compile_schema_for_test(tests/native_inline_table_test.fbs "${FLATC_OPT_COMP}")
|
||||||
compile_schema_for_test(tests/native_type_test.fbs "${FLATC_OPT_COMP}")
|
compile_schema_for_test(tests/native_type_test.fbs "${FLATC_OPT_COMP}")
|
||||||
|
compile_schema_for_test(tests/cpp_vec_type_test.fbs "${FLATC_OPT_COMP}")
|
||||||
|
compile_schema_for_test(tests/cpp_vec_type_native_type_test.fbs "${FLATC_OPT_COMP}")
|
||||||
compile_schema_for_test(tests/key_field/key_field_sample.fbs "${FLATC_OPT_COMP}")
|
compile_schema_for_test(tests/key_field/key_field_sample.fbs "${FLATC_OPT_COMP}")
|
||||||
compile_schema_for_test(tests/64bit/test_64bit.fbs "${FLATC_OPT_COMP};--bfbs-gen-embed")
|
compile_schema_for_test(tests/64bit/test_64bit.fbs "${FLATC_OPT_COMP};--bfbs-gen-embed")
|
||||||
compile_schema_for_test(tests/64bit/evolution/v1.fbs "${FLATC_OPT_COMP}")
|
compile_schema_for_test(tests/64bit/evolution/v1.fbs "${FLATC_OPT_COMP}")
|
||||||
|
|||||||
@@ -676,6 +676,7 @@ struct IDLOptions {
|
|||||||
bool gen_absl_hash;
|
bool gen_absl_hash;
|
||||||
std::string cpp_object_api_pointer_type;
|
std::string cpp_object_api_pointer_type;
|
||||||
std::string cpp_object_api_string_type;
|
std::string cpp_object_api_string_type;
|
||||||
|
std::string cpp_object_api_vector_type;
|
||||||
bool cpp_object_api_string_flexible_constructor;
|
bool cpp_object_api_string_flexible_constructor;
|
||||||
CaseStyle cpp_object_api_field_case_style;
|
CaseStyle cpp_object_api_field_case_style;
|
||||||
bool cpp_direct_copy;
|
bool cpp_direct_copy;
|
||||||
@@ -1012,6 +1013,7 @@ class Parser : public ParserState {
|
|||||||
known_attributes_["cpp_ptr_type_get"] = true;
|
known_attributes_["cpp_ptr_type_get"] = true;
|
||||||
known_attributes_["cpp_str_type"] = true;
|
known_attributes_["cpp_str_type"] = true;
|
||||||
known_attributes_["cpp_str_flex_ctor"] = true;
|
known_attributes_["cpp_str_flex_ctor"] = true;
|
||||||
|
known_attributes_["cpp_vec_type"] = true;
|
||||||
known_attributes_["native_inline"] = true;
|
known_attributes_["native_inline"] = true;
|
||||||
known_attributes_["native_custom_alloc"] = true;
|
known_attributes_["native_custom_alloc"] = true;
|
||||||
known_attributes_["native_type"] = true;
|
known_attributes_["native_type"] = true;
|
||||||
|
|||||||
@@ -383,6 +383,11 @@ flatc(
|
|||||||
schema="native_type_test.fbs",
|
schema="native_type_test.fbs",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
flatc(
|
||||||
|
["--cpp", "--gen-compare", "--gen-mutable", "--gen-object-api", "--reflect-names"],
|
||||||
|
schema="cpp_vec_type_test.fbs",
|
||||||
|
)
|
||||||
|
|
||||||
flatc(
|
flatc(
|
||||||
[
|
[
|
||||||
"--cpp",
|
"--cpp",
|
||||||
|
|||||||
@@ -142,6 +142,10 @@ const static FlatCOption flatc_options[] = {
|
|||||||
"and T::empty() must be supported. The custom type also needs to be "
|
"and T::empty() must be supported. The custom type also needs to be "
|
||||||
"constructible from std::string (see the --cpp-str-flex-ctor option to "
|
"constructible from std::string (see the --cpp-str-flex-ctor option to "
|
||||||
"change this behavior)"},
|
"change this behavior)"},
|
||||||
|
{"", "cpp-vec-type", "T",
|
||||||
|
"Set object API vector type (default std::vector). T must support the "
|
||||||
|
"same interface as std::vector: size(), resize(), reserve(), "
|
||||||
|
"emplace_back(), operator[], begin(), end(), and data()."},
|
||||||
{"", "cpp-str-flex-ctor", "",
|
{"", "cpp-str-flex-ctor", "",
|
||||||
"Don't construct custom string types by passing std::string from "
|
"Don't construct custom string types by passing std::string from "
|
||||||
"Flatbuffers, but (char* + length)."},
|
"Flatbuffers, but (char* + length)."},
|
||||||
@@ -543,6 +547,9 @@ FlatCOptions FlatCompiler::ParseFromCommandLineArguments(int argc,
|
|||||||
} else if (arg == "--cpp-str-type") {
|
} else if (arg == "--cpp-str-type") {
|
||||||
if (++argi >= argc) Error("missing type following: " + arg, true);
|
if (++argi >= argc) Error("missing type following: " + arg, true);
|
||||||
opts.cpp_object_api_string_type = argv[argi];
|
opts.cpp_object_api_string_type = argv[argi];
|
||||||
|
} else if (arg == "--cpp-vec-type") {
|
||||||
|
if (++argi >= argc) Error("missing type following: " + arg, true);
|
||||||
|
opts.cpp_object_api_vector_type = argv[argi];
|
||||||
} else if (arg == "--cpp-str-flex-ctor") {
|
} else if (arg == "--cpp-str-flex-ctor") {
|
||||||
opts.cpp_object_api_string_flexible_constructor = true;
|
opts.cpp_object_api_string_flexible_constructor = true;
|
||||||
} else if (arg == "--no-cpp-direct-copy") {
|
} else if (arg == "--no-cpp-direct-copy") {
|
||||||
|
|||||||
@@ -929,6 +929,15 @@ class CppGenerator : public BaseGenerator {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const std::string NativeVector(const FieldDef* field) {
|
||||||
|
auto attr = field ? field->attributes.Lookup("cpp_vec_type") : nullptr;
|
||||||
|
auto& ret = attr ? attr->constant : opts_.cpp_object_api_vector_type;
|
||||||
|
if (ret.empty()) {
|
||||||
|
return "std::vector";
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
bool FlexibleStringConstructor(const FieldDef* field) {
|
bool FlexibleStringConstructor(const FieldDef* field) {
|
||||||
auto attr = field != nullptr &&
|
auto attr = field != nullptr &&
|
||||||
(field->attributes.Lookup("cpp_str_flex_ctor") != nullptr);
|
(field->attributes.Lookup("cpp_str_flex_ctor") != nullptr);
|
||||||
@@ -974,20 +983,26 @@ class CppGenerator : public BaseGenerator {
|
|||||||
case BASE_TYPE_VECTOR64:
|
case BASE_TYPE_VECTOR64:
|
||||||
case BASE_TYPE_VECTOR: {
|
case BASE_TYPE_VECTOR: {
|
||||||
const auto type_name = GenTypeNative(type.VectorType(), true, field);
|
const auto type_name = GenTypeNative(type.VectorType(), true, field);
|
||||||
if (type.struct_def &&
|
const auto vec_type = NativeVector(&field);
|
||||||
|
if (vec_type == "std::vector" && type.struct_def &&
|
||||||
type.struct_def->attributes.Lookup("native_custom_alloc")) {
|
type.struct_def->attributes.Lookup("native_custom_alloc")) {
|
||||||
auto native_custom_alloc =
|
auto native_custom_alloc =
|
||||||
type.struct_def->attributes.Lookup("native_custom_alloc");
|
type.struct_def->attributes.Lookup("native_custom_alloc");
|
||||||
return "std::vector<" + type_name + "," +
|
return "std::vector<" + type_name + "," +
|
||||||
native_custom_alloc->constant + "<" + type_name + ">>";
|
native_custom_alloc->constant + "<" + type_name + ">>";
|
||||||
} else {
|
|
||||||
return "std::vector<" + type_name + ">";
|
|
||||||
}
|
}
|
||||||
|
return vec_type + "<" + type_name + ">";
|
||||||
}
|
}
|
||||||
case BASE_TYPE_STRUCT: {
|
case BASE_TYPE_STRUCT: {
|
||||||
auto type_name = WrapInNameSpace(*type.struct_def);
|
auto type_name = WrapInNameSpace(*type.struct_def);
|
||||||
if (IsStruct(type)) {
|
if (IsStruct(type)) {
|
||||||
auto native_type = type.struct_def->attributes.Lookup("native_type");
|
// Field-level native_type takes priority over struct-level
|
||||||
|
// native_type
|
||||||
|
auto field_native_type = field.attributes.Lookup("native_type");
|
||||||
|
auto native_type =
|
||||||
|
field_native_type
|
||||||
|
? field_native_type
|
||||||
|
: type.struct_def->attributes.Lookup("native_type");
|
||||||
if (native_type) {
|
if (native_type) {
|
||||||
type_name = native_type->constant;
|
type_name = native_type->constant;
|
||||||
}
|
}
|
||||||
@@ -1951,9 +1966,10 @@ class CppGenerator : public BaseGenerator {
|
|||||||
field.offset64);
|
field.offset64);
|
||||||
}
|
}
|
||||||
if (TypeHasKey(vtype)) {
|
if (TypeHasKey(vtype)) {
|
||||||
code_.SetValue("PARAM_TYPE", "std::vector<" + type + "> *");
|
code_.SetValue("PARAM_TYPE", NativeVector(&field) + "<" + type + "> *");
|
||||||
} else {
|
} else {
|
||||||
code_.SetValue("PARAM_TYPE", "const std::vector<" + type + "> *");
|
code_.SetValue("PARAM_TYPE",
|
||||||
|
"const " + NativeVector(&field) + "<" + type + "> *");
|
||||||
}
|
}
|
||||||
code_.SetValue("PARAM_VALUE", "nullptr");
|
code_.SetValue("PARAM_VALUE", "nullptr");
|
||||||
} else {
|
} else {
|
||||||
@@ -1979,7 +1995,7 @@ class CppGenerator : public BaseGenerator {
|
|||||||
const std::string& full_type =
|
const std::string& full_type =
|
||||||
(cpp_type
|
(cpp_type
|
||||||
? (IsVector(field.value.type)
|
? (IsVector(field.value.type)
|
||||||
? "std::vector<" +
|
? NativeVector(&field) + "<" +
|
||||||
GenTypeNativePtr(cpp_type->constant, &field,
|
GenTypeNativePtr(cpp_type->constant, &field,
|
||||||
false) +
|
false) +
|
||||||
"> "
|
"> "
|
||||||
@@ -3516,10 +3532,21 @@ class CppGenerator : public BaseGenerator {
|
|||||||
case BASE_TYPE_STRUCT: {
|
case BASE_TYPE_STRUCT: {
|
||||||
if (IsStruct(type)) {
|
if (IsStruct(type)) {
|
||||||
const auto& struct_attrs = type.struct_def->attributes;
|
const auto& struct_attrs = type.struct_def->attributes;
|
||||||
const auto native_type = struct_attrs.Lookup("native_type");
|
// Field-level native_type takes priority over struct-level
|
||||||
|
// native_type
|
||||||
|
auto field_native_type = afield.attributes.Lookup("native_type");
|
||||||
|
const auto native_type = field_native_type
|
||||||
|
? field_native_type
|
||||||
|
: struct_attrs.Lookup("native_type");
|
||||||
if (native_type) {
|
if (native_type) {
|
||||||
std::string unpack_call = "::flatbuffers::UnPack";
|
std::string unpack_call = "::flatbuffers::UnPack";
|
||||||
const auto pack_name = struct_attrs.Lookup("native_type_pack_name");
|
// Field-level native_type_pack_name takes priority over
|
||||||
|
// struct-level
|
||||||
|
auto field_pack_name =
|
||||||
|
afield.attributes.Lookup("native_type_pack_name");
|
||||||
|
const auto pack_name =
|
||||||
|
field_pack_name ? field_pack_name
|
||||||
|
: struct_attrs.Lookup("native_type_pack_name");
|
||||||
if (pack_name) {
|
if (pack_name) {
|
||||||
unpack_call += pack_name->constant;
|
unpack_call += pack_name->constant;
|
||||||
}
|
}
|
||||||
@@ -3774,7 +3801,8 @@ class CppGenerator : public BaseGenerator {
|
|||||||
auto vector_type = field.value.type.VectorType();
|
auto vector_type = field.value.type.VectorType();
|
||||||
switch (vector_type.base_type) {
|
switch (vector_type.base_type) {
|
||||||
case BASE_TYPE_STRING: {
|
case BASE_TYPE_STRING: {
|
||||||
if (NativeString(&field) == "std::string") {
|
if (NativeString(&field) == "std::string" &&
|
||||||
|
NativeVector(&field) == "std::vector") {
|
||||||
code += "_fbb.CreateVectorOfStrings(" + value + ")";
|
code += "_fbb.CreateVectorOfStrings(" + value + ")";
|
||||||
} else {
|
} else {
|
||||||
// Use by-function serialization to emulate
|
// Use by-function serialization to emulate
|
||||||
@@ -3795,30 +3823,52 @@ class CppGenerator : public BaseGenerator {
|
|||||||
if (IsStruct(vector_type)) {
|
if (IsStruct(vector_type)) {
|
||||||
const auto& struct_attrs =
|
const auto& struct_attrs =
|
||||||
field.value.type.struct_def->attributes;
|
field.value.type.struct_def->attributes;
|
||||||
const auto native_type = struct_attrs.Lookup("native_type");
|
// Field-level native_type takes priority over struct-level
|
||||||
|
// native_type
|
||||||
|
auto field_native_type = field.attributes.Lookup("native_type");
|
||||||
|
const auto native_type = field_native_type
|
||||||
|
? field_native_type
|
||||||
|
: struct_attrs.Lookup("native_type");
|
||||||
if (native_type) {
|
if (native_type) {
|
||||||
code += "_fbb.CreateVectorOfNativeStructs<";
|
code += "_fbb.CreateVectorOfNativeStructs<";
|
||||||
code += WrapInNameSpace(*vector_type.struct_def) + ", " +
|
code += WrapInNameSpace(*vector_type.struct_def) + ", " +
|
||||||
native_type->constant + ">";
|
native_type->constant + ">";
|
||||||
code += "(" + value;
|
// Field-level native_type_pack_name takes priority over
|
||||||
|
// struct-level
|
||||||
|
auto field_pack_name =
|
||||||
|
field.attributes.Lookup("native_type_pack_name");
|
||||||
const auto pack_name =
|
const auto pack_name =
|
||||||
struct_attrs.Lookup("native_type_pack_name");
|
field_pack_name
|
||||||
|
? field_pack_name
|
||||||
|
: struct_attrs.Lookup("native_type_pack_name");
|
||||||
|
// Non-std vectors (e.g. eastl::vector) don't match the
|
||||||
|
// std::vector overload, so use the pointer+size overload.
|
||||||
|
const bool is_std_vec = NativeVector(&field) == "std::vector";
|
||||||
|
if (is_std_vec) {
|
||||||
|
code += "(" + value;
|
||||||
|
} else {
|
||||||
|
code += "(" + value + ".data(), " + value + ".size()";
|
||||||
|
}
|
||||||
if (pack_name) {
|
if (pack_name) {
|
||||||
code += ", ::flatbuffers::Pack" + pack_name->constant;
|
code += ", ::flatbuffers::Pack" + pack_name->constant;
|
||||||
}
|
}
|
||||||
code += ")";
|
code += ")";
|
||||||
} else {
|
} else {
|
||||||
// If the field uses 64-bit addressing, create a 64-bit vector.
|
// If the field uses 64-bit addressing, create a 64-bit vector.
|
||||||
|
const bool is_std_vec = NativeVector(&field) == "std::vector";
|
||||||
|
const std::string vec_args =
|
||||||
|
is_std_vec ? ("(" + value + ")")
|
||||||
|
: ("(" + value + ".data(), " + value + ".size())");
|
||||||
if (field.value.type.base_type == BASE_TYPE_VECTOR64) {
|
if (field.value.type.base_type == BASE_TYPE_VECTOR64) {
|
||||||
code += "_fbb.CreateVectorOfStructs64";
|
code += "_fbb.CreateVectorOfStructs64" + vec_args;
|
||||||
} else {
|
} else {
|
||||||
code += "_fbb.CreateVectorOfStructs";
|
code += "_fbb.CreateVectorOfStructs";
|
||||||
if (field.offset64) {
|
if (field.offset64) {
|
||||||
// This is normal 32-bit vector, with 64-bit addressing.
|
// This is normal 32-bit vector, with 64-bit addressing.
|
||||||
code += "64<::flatbuffers::Vector>";
|
code += "64<::flatbuffers::Vector>";
|
||||||
}
|
}
|
||||||
|
code += vec_args;
|
||||||
}
|
}
|
||||||
code += "(" + value + ")";
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
code += "_fbb.CreateVector<::flatbuffers::Offset<";
|
code += "_fbb.CreateVector<::flatbuffers::Offset<";
|
||||||
@@ -3837,7 +3887,12 @@ class CppGenerator : public BaseGenerator {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case BASE_TYPE_BOOL: {
|
case BASE_TYPE_BOOL: {
|
||||||
code += "_fbb.CreateVector(" + value + ")";
|
if (NativeVector(&field) == "std::vector") {
|
||||||
|
code += "_fbb.CreateVector(" + value + ")";
|
||||||
|
} else {
|
||||||
|
code += "_fbb.CreateVector(" + value + ".data(), " + value +
|
||||||
|
".size())";
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case BASE_TYPE_UNION: {
|
case BASE_TYPE_UNION: {
|
||||||
@@ -3886,15 +3941,19 @@ class CppGenerator : public BaseGenerator {
|
|||||||
code += "; }, &_va )";
|
code += "; }, &_va )";
|
||||||
} else {
|
} else {
|
||||||
// If the field uses 64-bit addressing, create a 64-bit vector.
|
// If the field uses 64-bit addressing, create a 64-bit vector.
|
||||||
|
const bool is_std_vec = NativeVector(&field) == "std::vector";
|
||||||
|
const std::string vec_args =
|
||||||
|
is_std_vec ? ("(" + value + ")")
|
||||||
|
: ("(" + value + ".data(), " + value + ".size())");
|
||||||
if (field.value.type.base_type == BASE_TYPE_VECTOR64) {
|
if (field.value.type.base_type == BASE_TYPE_VECTOR64) {
|
||||||
code += "_fbb.CreateVector64(" + value + ")";
|
code += "_fbb.CreateVector64" + vec_args;
|
||||||
} else {
|
} else {
|
||||||
code += "_fbb.CreateVector";
|
code += "_fbb.CreateVector";
|
||||||
if (field.offset64) {
|
if (field.offset64) {
|
||||||
// This is normal 32-bit vector, with 64-bit addressing.
|
// This is normal 32-bit vector, with 64-bit addressing.
|
||||||
code += "64<::flatbuffers::Vector>";
|
code += "64<::flatbuffers::Vector>";
|
||||||
}
|
}
|
||||||
code += "(" + value + ")";
|
code += vec_args;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -3918,11 +3977,22 @@ class CppGenerator : public BaseGenerator {
|
|||||||
case BASE_TYPE_STRUCT: {
|
case BASE_TYPE_STRUCT: {
|
||||||
if (IsStruct(field.value.type)) {
|
if (IsStruct(field.value.type)) {
|
||||||
const auto& struct_attribs = field.value.type.struct_def->attributes;
|
const auto& struct_attribs = field.value.type.struct_def->attributes;
|
||||||
const auto native_type = struct_attribs.Lookup("native_type");
|
// Field-level native_type takes priority over struct-level
|
||||||
|
// native_type
|
||||||
|
auto field_native_type = field.attributes.Lookup("native_type");
|
||||||
|
const auto native_type = field_native_type
|
||||||
|
? field_native_type
|
||||||
|
: struct_attribs.Lookup("native_type");
|
||||||
if (native_type && field.native_inline) {
|
if (native_type && field.native_inline) {
|
||||||
code += "::flatbuffers::Pack";
|
code += "::flatbuffers::Pack";
|
||||||
|
// Field-level native_type_pack_name takes priority over
|
||||||
|
// struct-level
|
||||||
|
auto field_pack_name =
|
||||||
|
field.attributes.Lookup("native_type_pack_name");
|
||||||
const auto pack_name =
|
const auto pack_name =
|
||||||
struct_attribs.Lookup("native_type_pack_name");
|
field_pack_name
|
||||||
|
? field_pack_name
|
||||||
|
: struct_attribs.Lookup("native_type_pack_name");
|
||||||
if (pack_name) {
|
if (pack_name) {
|
||||||
code += pack_name->constant;
|
code += pack_name->constant;
|
||||||
}
|
}
|
||||||
@@ -4086,9 +4156,15 @@ class CppGenerator : public BaseGenerator {
|
|||||||
bool check_ptr = false;
|
bool check_ptr = false;
|
||||||
if (field->value.type.base_type == BASE_TYPE_STRUCT) {
|
if (field->value.type.base_type == BASE_TYPE_STRUCT) {
|
||||||
if (IsStruct(field->value.type)) {
|
if (IsStruct(field->value.type)) {
|
||||||
|
// Field-level native_type takes priority over struct-level
|
||||||
|
// native_type
|
||||||
|
auto field_native_type =
|
||||||
|
field->attributes.Lookup("native_type");
|
||||||
auto native_type =
|
auto native_type =
|
||||||
field->value.type.struct_def->attributes.Lookup(
|
field_native_type
|
||||||
"native_type");
|
? field_native_type
|
||||||
|
: field->value.type.struct_def->attributes.Lookup(
|
||||||
|
"native_type");
|
||||||
auto native_inline = field->attributes.Lookup("native_inline");
|
auto native_inline = field->attributes.Lookup("native_inline");
|
||||||
if (native_type) {
|
if (native_type) {
|
||||||
pass_by_address = true;
|
pass_by_address = true;
|
||||||
|
|||||||
16
tests/cpp_vec_type_native_type_test.fbs
Normal file
16
tests/cpp_vec_type_native_type_test.fbs
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
native_include "cpp_vec_type_native_type_test_impl.h";
|
||||||
|
|
||||||
|
namespace CppVecNativeTypeTest;
|
||||||
|
|
||||||
|
struct Vec3 (native_type: "CppVecNativeTypeTest::Native::Vec3") {
|
||||||
|
x: float;
|
||||||
|
y: float;
|
||||||
|
z: float;
|
||||||
|
}
|
||||||
|
|
||||||
|
table Container {
|
||||||
|
points: [Vec3] (cpp_vec_type: "CppVecNativeTypeTest::CustomVec");
|
||||||
|
bytes: [ubyte] (cpp_vec_type: "CppVecNativeTypeTest::CustomVec");
|
||||||
|
}
|
||||||
|
|
||||||
|
root_type Container;
|
||||||
15
tests/cpp_vec_type_native_type_test_impl.cpp
Normal file
15
tests/cpp_vec_type_native_type_test_impl.cpp
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#include "cpp_vec_type_native_type_test_impl.h"
|
||||||
|
|
||||||
|
#include "cpp_vec_type_native_type_test_generated.h"
|
||||||
|
|
||||||
|
namespace flatbuffers {
|
||||||
|
CppVecNativeTypeTest::Vec3 Pack(
|
||||||
|
const CppVecNativeTypeTest::Native::Vec3& obj) {
|
||||||
|
return CppVecNativeTypeTest::Vec3(obj.x, obj.y, obj.z);
|
||||||
|
}
|
||||||
|
|
||||||
|
const CppVecNativeTypeTest::Native::Vec3 UnPack(
|
||||||
|
const CppVecNativeTypeTest::Vec3& obj) {
|
||||||
|
return CppVecNativeTypeTest::Native::Vec3(obj.x(), obj.y(), obj.z());
|
||||||
|
}
|
||||||
|
} // namespace flatbuffers
|
||||||
34
tests/cpp_vec_type_native_type_test_impl.h
Normal file
34
tests/cpp_vec_type_native_type_test_impl.h
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
#ifndef CPP_VEC_TYPE_NATIVE_TYPE_TEST_IMPL_H
|
||||||
|
#define CPP_VEC_TYPE_NATIVE_TYPE_TEST_IMPL_H
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace CppVecNativeTypeTest {
|
||||||
|
|
||||||
|
namespace Native {
|
||||||
|
struct Vec3 {
|
||||||
|
float x, y, z;
|
||||||
|
Vec3() : x(0), y(0), z(0) {}
|
||||||
|
Vec3(float x_, float y_, float z_) : x(x_), y(y_), z(z_) {}
|
||||||
|
bool operator==(const Vec3& o) const {
|
||||||
|
return x == o.x && y == o.y && z == o.z;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} // namespace Native
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
struct CustomVec : public std::vector<T> {
|
||||||
|
using std::vector<T>::vector;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Vec3; // flatbuffers-generated struct
|
||||||
|
|
||||||
|
} // namespace CppVecNativeTypeTest
|
||||||
|
|
||||||
|
namespace flatbuffers {
|
||||||
|
CppVecNativeTypeTest::Vec3 Pack(const CppVecNativeTypeTest::Native::Vec3& obj);
|
||||||
|
const CppVecNativeTypeTest::Native::Vec3 UnPack(
|
||||||
|
const CppVecNativeTypeTest::Vec3& obj);
|
||||||
|
} // namespace flatbuffers
|
||||||
|
|
||||||
|
#endif // CPP_VEC_TYPE_NATIVE_TYPE_TEST_IMPL_H
|
||||||
17
tests/cpp_vec_type_test.fbs
Normal file
17
tests/cpp_vec_type_test.fbs
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
native_include "cpp_vec_type_test_impl.h";
|
||||||
|
|
||||||
|
namespace CppVecTest;
|
||||||
|
|
||||||
|
table Item {
|
||||||
|
id: int;
|
||||||
|
value: float;
|
||||||
|
}
|
||||||
|
|
||||||
|
table Data {
|
||||||
|
values: [int] (cpp_vec_type: "CppVecTest::CustomVec");
|
||||||
|
items: [Item] (cpp_vec_type: "CppVecTest::CustomVec");
|
||||||
|
strs: [string] (cpp_vec_type: "CppVecTest::CustomVec");
|
||||||
|
regular: [int];
|
||||||
|
}
|
||||||
|
|
||||||
|
root_type Data;
|
||||||
15
tests/cpp_vec_type_test_impl.h
Normal file
15
tests/cpp_vec_type_test_impl.h
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#ifndef CPP_VEC_TYPE_TEST_IMPL_H
|
||||||
|
#define CPP_VEC_TYPE_TEST_IMPL_H
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace CppVecTest {
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct CustomVec : public std::vector<T> {
|
||||||
|
using std::vector<T>::vector;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace CppVecTest
|
||||||
|
|
||||||
|
#endif // CPP_VEC_TYPE_TEST_IMPL_H
|
||||||
@@ -14,6 +14,12 @@ struct Vector3DAlt (native_type:"Native::Vector3D", native_type_pack_name:"Vecto
|
|||||||
c:float;
|
c:float;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct Vector3DSimple {
|
||||||
|
x:float;
|
||||||
|
y:float;
|
||||||
|
z:float;
|
||||||
|
}
|
||||||
|
|
||||||
table Matrix (native_type:"Native::Matrix") {
|
table Matrix (native_type:"Native::Matrix") {
|
||||||
rows:int32;
|
rows:int32;
|
||||||
columns:int32;
|
columns:int32;
|
||||||
@@ -27,6 +33,8 @@ table ApplicationData {
|
|||||||
position_inline:Vector3D (native_inline);
|
position_inline:Vector3D (native_inline);
|
||||||
matrix:Matrix;
|
matrix:Matrix;
|
||||||
matrices:[Matrix];
|
matrices:[Matrix];
|
||||||
|
simple_position:Vector3DSimple (native_type: "Native::Vector3D", native_inline, native_type_pack_name: "Vector3DSimple");
|
||||||
|
simple_vectors:[Vector3DSimple] (native_type: "Native::Vector3D", native_type_pack_name: "Vector3DSimple");
|
||||||
}
|
}
|
||||||
|
|
||||||
root_type ApplicationData;
|
root_type ApplicationData;
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ struct Vector3D;
|
|||||||
|
|
||||||
struct Vector3DAlt;
|
struct Vector3DAlt;
|
||||||
|
|
||||||
|
struct Vector3DSimple;
|
||||||
|
|
||||||
struct Matrix;
|
struct Matrix;
|
||||||
struct MatrixBuilder;
|
struct MatrixBuilder;
|
||||||
|
|
||||||
@@ -28,6 +30,8 @@ struct ApplicationData;
|
|||||||
struct ApplicationDataBuilder;
|
struct ApplicationDataBuilder;
|
||||||
struct ApplicationDataT;
|
struct ApplicationDataT;
|
||||||
|
|
||||||
|
bool operator==(const Vector3DSimple &lhs, const Vector3DSimple &rhs);
|
||||||
|
bool operator!=(const Vector3DSimple &lhs, const Vector3DSimple &rhs);
|
||||||
bool operator==(const ApplicationDataT &lhs, const ApplicationDataT &rhs);
|
bool operator==(const ApplicationDataT &lhs, const ApplicationDataT &rhs);
|
||||||
bool operator!=(const ApplicationDataT &lhs, const ApplicationDataT &rhs);
|
bool operator!=(const ApplicationDataT &lhs, const ApplicationDataT &rhs);
|
||||||
|
|
||||||
@@ -35,6 +39,8 @@ inline const ::flatbuffers::TypeTable *Vector3DTypeTable();
|
|||||||
|
|
||||||
inline const ::flatbuffers::TypeTable *Vector3DAltTypeTable();
|
inline const ::flatbuffers::TypeTable *Vector3DAltTypeTable();
|
||||||
|
|
||||||
|
inline const ::flatbuffers::TypeTable *Vector3DSimpleTypeTable();
|
||||||
|
|
||||||
inline const ::flatbuffers::TypeTable *MatrixTypeTable();
|
inline const ::flatbuffers::TypeTable *MatrixTypeTable();
|
||||||
|
|
||||||
inline const ::flatbuffers::TypeTable *ApplicationDataTypeTable();
|
inline const ::flatbuffers::TypeTable *ApplicationDataTypeTable();
|
||||||
@@ -121,6 +127,59 @@ FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(4) Vector3DAlt FLATBUFFERS_FINAL_CLASS {
|
|||||||
};
|
};
|
||||||
FLATBUFFERS_STRUCT_END(Vector3DAlt, 12);
|
FLATBUFFERS_STRUCT_END(Vector3DAlt, 12);
|
||||||
|
|
||||||
|
FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(4) Vector3DSimple FLATBUFFERS_FINAL_CLASS {
|
||||||
|
private:
|
||||||
|
float x_;
|
||||||
|
float y_;
|
||||||
|
float z_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {
|
||||||
|
return Vector3DSimpleTypeTable();
|
||||||
|
}
|
||||||
|
Vector3DSimple()
|
||||||
|
: x_(0),
|
||||||
|
y_(0),
|
||||||
|
z_(0) {
|
||||||
|
}
|
||||||
|
Vector3DSimple(float _x, float _y, float _z)
|
||||||
|
: x_(::flatbuffers::EndianScalar(_x)),
|
||||||
|
y_(::flatbuffers::EndianScalar(_y)),
|
||||||
|
z_(::flatbuffers::EndianScalar(_z)) {
|
||||||
|
}
|
||||||
|
float x() const {
|
||||||
|
return ::flatbuffers::EndianScalar(x_);
|
||||||
|
}
|
||||||
|
void mutate_x(float _x) {
|
||||||
|
::flatbuffers::WriteScalar(&x_, _x);
|
||||||
|
}
|
||||||
|
float y() const {
|
||||||
|
return ::flatbuffers::EndianScalar(y_);
|
||||||
|
}
|
||||||
|
void mutate_y(float _y) {
|
||||||
|
::flatbuffers::WriteScalar(&y_, _y);
|
||||||
|
}
|
||||||
|
float z() const {
|
||||||
|
return ::flatbuffers::EndianScalar(z_);
|
||||||
|
}
|
||||||
|
void mutate_z(float _z) {
|
||||||
|
::flatbuffers::WriteScalar(&z_, _z);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
FLATBUFFERS_STRUCT_END(Vector3DSimple, 12);
|
||||||
|
|
||||||
|
inline bool operator==(const Vector3DSimple &lhs, const Vector3DSimple &rhs) {
|
||||||
|
return
|
||||||
|
(lhs.x() == rhs.x()) &&
|
||||||
|
(lhs.y() == rhs.y()) &&
|
||||||
|
(lhs.z() == rhs.z());
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator!=(const Vector3DSimple &lhs, const Vector3DSimple &rhs) {
|
||||||
|
return !(lhs == rhs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
struct Matrix FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
|
struct Matrix FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
|
||||||
typedef Native::Matrix NativeTableType;
|
typedef Native::Matrix NativeTableType;
|
||||||
typedef MatrixBuilder Builder;
|
typedef MatrixBuilder Builder;
|
||||||
@@ -223,6 +282,8 @@ struct ApplicationDataT : public ::flatbuffers::NativeTable {
|
|||||||
Native::Vector3D position_inline{};
|
Native::Vector3D position_inline{};
|
||||||
std::unique_ptr<Native::Matrix> matrix{};
|
std::unique_ptr<Native::Matrix> matrix{};
|
||||||
std::vector<std::unique_ptr<Native::Matrix>> matrices{};
|
std::vector<std::unique_ptr<Native::Matrix>> matrices{};
|
||||||
|
Native::Vector3D simple_position{};
|
||||||
|
std::vector<Native::Vector3D> simple_vectors{};
|
||||||
ApplicationDataT() = default;
|
ApplicationDataT() = default;
|
||||||
ApplicationDataT(const ApplicationDataT &o);
|
ApplicationDataT(const ApplicationDataT &o);
|
||||||
ApplicationDataT(ApplicationDataT&&) FLATBUFFERS_NOEXCEPT = default;
|
ApplicationDataT(ApplicationDataT&&) FLATBUFFERS_NOEXCEPT = default;
|
||||||
@@ -241,7 +302,9 @@ struct ApplicationData FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
|
|||||||
VT_POSITION = 8,
|
VT_POSITION = 8,
|
||||||
VT_POSITION_INLINE = 10,
|
VT_POSITION_INLINE = 10,
|
||||||
VT_MATRIX = 12,
|
VT_MATRIX = 12,
|
||||||
VT_MATRICES = 14
|
VT_MATRICES = 14,
|
||||||
|
VT_SIMPLE_POSITION = 16,
|
||||||
|
VT_SIMPLE_VECTORS = 18
|
||||||
};
|
};
|
||||||
const ::flatbuffers::Vector<const Geometry::Vector3D *> *vectors() const {
|
const ::flatbuffers::Vector<const Geometry::Vector3D *> *vectors() const {
|
||||||
return GetPointer<const ::flatbuffers::Vector<const Geometry::Vector3D *> *>(VT_VECTORS);
|
return GetPointer<const ::flatbuffers::Vector<const Geometry::Vector3D *> *>(VT_VECTORS);
|
||||||
@@ -279,6 +342,18 @@ struct ApplicationData FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
|
|||||||
::flatbuffers::Vector<::flatbuffers::Offset<Geometry::Matrix>> *mutable_matrices() {
|
::flatbuffers::Vector<::flatbuffers::Offset<Geometry::Matrix>> *mutable_matrices() {
|
||||||
return GetPointer<::flatbuffers::Vector<::flatbuffers::Offset<Geometry::Matrix>> *>(VT_MATRICES);
|
return GetPointer<::flatbuffers::Vector<::flatbuffers::Offset<Geometry::Matrix>> *>(VT_MATRICES);
|
||||||
}
|
}
|
||||||
|
const Geometry::Vector3DSimple *simple_position() const {
|
||||||
|
return GetStruct<const Geometry::Vector3DSimple *>(VT_SIMPLE_POSITION);
|
||||||
|
}
|
||||||
|
Geometry::Vector3DSimple *mutable_simple_position() {
|
||||||
|
return GetStruct<Geometry::Vector3DSimple *>(VT_SIMPLE_POSITION);
|
||||||
|
}
|
||||||
|
const ::flatbuffers::Vector<const Geometry::Vector3DSimple *> *simple_vectors() const {
|
||||||
|
return GetPointer<const ::flatbuffers::Vector<const Geometry::Vector3DSimple *> *>(VT_SIMPLE_VECTORS);
|
||||||
|
}
|
||||||
|
::flatbuffers::Vector<const Geometry::Vector3DSimple *> *mutable_simple_vectors() {
|
||||||
|
return GetPointer<::flatbuffers::Vector<const Geometry::Vector3DSimple *> *>(VT_SIMPLE_VECTORS);
|
||||||
|
}
|
||||||
template <bool B = false>
|
template <bool B = false>
|
||||||
bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {
|
bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {
|
||||||
return VerifyTableStart(verifier) &&
|
return VerifyTableStart(verifier) &&
|
||||||
@@ -293,6 +368,9 @@ struct ApplicationData FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
|
|||||||
VerifyOffset(verifier, VT_MATRICES) &&
|
VerifyOffset(verifier, VT_MATRICES) &&
|
||||||
verifier.VerifyVector(matrices()) &&
|
verifier.VerifyVector(matrices()) &&
|
||||||
verifier.VerifyVectorOfTables(matrices()) &&
|
verifier.VerifyVectorOfTables(matrices()) &&
|
||||||
|
VerifyField<Geometry::Vector3DSimple>(verifier, VT_SIMPLE_POSITION, 4) &&
|
||||||
|
VerifyOffset(verifier, VT_SIMPLE_VECTORS) &&
|
||||||
|
verifier.VerifyVector(simple_vectors()) &&
|
||||||
verifier.EndTable();
|
verifier.EndTable();
|
||||||
}
|
}
|
||||||
ApplicationDataT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;
|
ApplicationDataT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;
|
||||||
@@ -322,6 +400,12 @@ struct ApplicationDataBuilder {
|
|||||||
void add_matrices(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<Geometry::Matrix>>> matrices) {
|
void add_matrices(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<Geometry::Matrix>>> matrices) {
|
||||||
fbb_.AddOffset(ApplicationData::VT_MATRICES, matrices);
|
fbb_.AddOffset(ApplicationData::VT_MATRICES, matrices);
|
||||||
}
|
}
|
||||||
|
void add_simple_position(const Geometry::Vector3DSimple *simple_position) {
|
||||||
|
fbb_.AddStruct(ApplicationData::VT_SIMPLE_POSITION, simple_position);
|
||||||
|
}
|
||||||
|
void add_simple_vectors(::flatbuffers::Offset<::flatbuffers::Vector<const Geometry::Vector3DSimple *>> simple_vectors) {
|
||||||
|
fbb_.AddOffset(ApplicationData::VT_SIMPLE_VECTORS, simple_vectors);
|
||||||
|
}
|
||||||
explicit ApplicationDataBuilder(::flatbuffers::FlatBufferBuilder &_fbb)
|
explicit ApplicationDataBuilder(::flatbuffers::FlatBufferBuilder &_fbb)
|
||||||
: fbb_(_fbb) {
|
: fbb_(_fbb) {
|
||||||
start_ = fbb_.StartTable();
|
start_ = fbb_.StartTable();
|
||||||
@@ -340,8 +424,12 @@ inline ::flatbuffers::Offset<ApplicationData> CreateApplicationData(
|
|||||||
const Geometry::Vector3D *position = nullptr,
|
const Geometry::Vector3D *position = nullptr,
|
||||||
const Geometry::Vector3D *position_inline = nullptr,
|
const Geometry::Vector3D *position_inline = nullptr,
|
||||||
::flatbuffers::Offset<Geometry::Matrix> matrix = 0,
|
::flatbuffers::Offset<Geometry::Matrix> matrix = 0,
|
||||||
::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<Geometry::Matrix>>> matrices = 0) {
|
::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<Geometry::Matrix>>> matrices = 0,
|
||||||
|
const Geometry::Vector3DSimple *simple_position = nullptr,
|
||||||
|
::flatbuffers::Offset<::flatbuffers::Vector<const Geometry::Vector3DSimple *>> simple_vectors = 0) {
|
||||||
ApplicationDataBuilder builder_(_fbb);
|
ApplicationDataBuilder builder_(_fbb);
|
||||||
|
builder_.add_simple_vectors(simple_vectors);
|
||||||
|
builder_.add_simple_position(simple_position);
|
||||||
builder_.add_matrices(matrices);
|
builder_.add_matrices(matrices);
|
||||||
builder_.add_matrix(matrix);
|
builder_.add_matrix(matrix);
|
||||||
builder_.add_position_inline(position_inline);
|
builder_.add_position_inline(position_inline);
|
||||||
@@ -358,10 +446,13 @@ inline ::flatbuffers::Offset<ApplicationData> CreateApplicationDataDirect(
|
|||||||
const Geometry::Vector3D *position = nullptr,
|
const Geometry::Vector3D *position = nullptr,
|
||||||
const Geometry::Vector3D *position_inline = nullptr,
|
const Geometry::Vector3D *position_inline = nullptr,
|
||||||
::flatbuffers::Offset<Geometry::Matrix> matrix = 0,
|
::flatbuffers::Offset<Geometry::Matrix> matrix = 0,
|
||||||
const std::vector<::flatbuffers::Offset<Geometry::Matrix>> *matrices = nullptr) {
|
const std::vector<::flatbuffers::Offset<Geometry::Matrix>> *matrices = nullptr,
|
||||||
|
const Geometry::Vector3DSimple *simple_position = nullptr,
|
||||||
|
const std::vector<Geometry::Vector3DSimple> *simple_vectors = nullptr) {
|
||||||
auto vectors__ = vectors ? _fbb.CreateVectorOfStructs<Geometry::Vector3D>(*vectors) : 0;
|
auto vectors__ = vectors ? _fbb.CreateVectorOfStructs<Geometry::Vector3D>(*vectors) : 0;
|
||||||
auto vectors_alt__ = vectors_alt ? _fbb.CreateVectorOfStructs<Geometry::Vector3DAlt>(*vectors_alt) : 0;
|
auto vectors_alt__ = vectors_alt ? _fbb.CreateVectorOfStructs<Geometry::Vector3DAlt>(*vectors_alt) : 0;
|
||||||
auto matrices__ = matrices ? _fbb.CreateVector<::flatbuffers::Offset<Geometry::Matrix>>(*matrices) : 0;
|
auto matrices__ = matrices ? _fbb.CreateVector<::flatbuffers::Offset<Geometry::Matrix>>(*matrices) : 0;
|
||||||
|
auto simple_vectors__ = simple_vectors ? _fbb.CreateVectorOfStructs<Geometry::Vector3DSimple>(*simple_vectors) : 0;
|
||||||
return Geometry::CreateApplicationData(
|
return Geometry::CreateApplicationData(
|
||||||
_fbb,
|
_fbb,
|
||||||
vectors__,
|
vectors__,
|
||||||
@@ -369,7 +460,9 @@ inline ::flatbuffers::Offset<ApplicationData> CreateApplicationDataDirect(
|
|||||||
position,
|
position,
|
||||||
position_inline,
|
position_inline,
|
||||||
matrix,
|
matrix,
|
||||||
matrices__);
|
matrices__,
|
||||||
|
simple_position,
|
||||||
|
simple_vectors__);
|
||||||
}
|
}
|
||||||
|
|
||||||
::flatbuffers::Offset<ApplicationData> CreateApplicationData(::flatbuffers::FlatBufferBuilder &_fbb, const ApplicationDataT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);
|
::flatbuffers::Offset<ApplicationData> CreateApplicationData(::flatbuffers::FlatBufferBuilder &_fbb, const ApplicationDataT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);
|
||||||
@@ -392,7 +485,9 @@ inline bool operator==(const ApplicationDataT &lhs, const ApplicationDataT &rhs)
|
|||||||
((lhs.position == rhs.position) || (lhs.position && rhs.position && *lhs.position == *rhs.position)) &&
|
((lhs.position == rhs.position) || (lhs.position && rhs.position && *lhs.position == *rhs.position)) &&
|
||||||
(lhs.position_inline == rhs.position_inline) &&
|
(lhs.position_inline == rhs.position_inline) &&
|
||||||
((lhs.matrix == rhs.matrix) || (lhs.matrix && rhs.matrix && *lhs.matrix == *rhs.matrix)) &&
|
((lhs.matrix == rhs.matrix) || (lhs.matrix && rhs.matrix && *lhs.matrix == *rhs.matrix)) &&
|
||||||
(lhs.matrices.size() == rhs.matrices.size() && std::equal(lhs.matrices.cbegin(), lhs.matrices.cend(), rhs.matrices.cbegin(), [](std::unique_ptr<Native::Matrix> const &a, std::unique_ptr<Native::Matrix> const &b) { return (a == b) || (a && b && *a == *b); }));
|
(lhs.matrices.size() == rhs.matrices.size() && std::equal(lhs.matrices.cbegin(), lhs.matrices.cend(), rhs.matrices.cbegin(), [](std::unique_ptr<Native::Matrix> const &a, std::unique_ptr<Native::Matrix> const &b) { return (a == b) || (a && b && *a == *b); })) &&
|
||||||
|
(lhs.simple_position == rhs.simple_position) &&
|
||||||
|
(lhs.simple_vectors == rhs.simple_vectors);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool operator!=(const ApplicationDataT &lhs, const ApplicationDataT &rhs) {
|
inline bool operator!=(const ApplicationDataT &lhs, const ApplicationDataT &rhs) {
|
||||||
@@ -405,7 +500,9 @@ inline ApplicationDataT::ApplicationDataT(const ApplicationDataT &o)
|
|||||||
vectors_alt(o.vectors_alt),
|
vectors_alt(o.vectors_alt),
|
||||||
position((o.position) ? new Native::Vector3D(*o.position) : nullptr),
|
position((o.position) ? new Native::Vector3D(*o.position) : nullptr),
|
||||||
position_inline(o.position_inline),
|
position_inline(o.position_inline),
|
||||||
matrix((o.matrix) ? new Native::Matrix(*o.matrix) : nullptr) {
|
matrix((o.matrix) ? new Native::Matrix(*o.matrix) : nullptr),
|
||||||
|
simple_position(o.simple_position),
|
||||||
|
simple_vectors(o.simple_vectors) {
|
||||||
matrices.reserve(o.matrices.size());
|
matrices.reserve(o.matrices.size());
|
||||||
for (const auto &matrices_ : o.matrices) { matrices.emplace_back((matrices_) ? new Native::Matrix(*matrices_) : nullptr); }
|
for (const auto &matrices_ : o.matrices) { matrices.emplace_back((matrices_) ? new Native::Matrix(*matrices_) : nullptr); }
|
||||||
}
|
}
|
||||||
@@ -417,6 +514,8 @@ inline ApplicationDataT &ApplicationDataT::operator=(ApplicationDataT o) FLATBUF
|
|||||||
std::swap(position_inline, o.position_inline);
|
std::swap(position_inline, o.position_inline);
|
||||||
std::swap(matrix, o.matrix);
|
std::swap(matrix, o.matrix);
|
||||||
std::swap(matrices, o.matrices);
|
std::swap(matrices, o.matrices);
|
||||||
|
std::swap(simple_position, o.simple_position);
|
||||||
|
std::swap(simple_vectors, o.simple_vectors);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -435,6 +534,8 @@ inline void ApplicationData::UnPackTo(ApplicationDataT *_o, const ::flatbuffers:
|
|||||||
{ auto _e = position_inline(); if (_e) _o->position_inline = ::flatbuffers::UnPack(*_e); }
|
{ auto _e = position_inline(); if (_e) _o->position_inline = ::flatbuffers::UnPack(*_e); }
|
||||||
{ auto _e = matrix(); if (_e) { if(_o->matrix) { _e->UnPackTo(_o->matrix.get(), _resolver); } else { _o->matrix = std::unique_ptr<Native::Matrix>(_e->UnPack(_resolver)); } } else if (_o->matrix) { _o->matrix.reset(); } }
|
{ auto _e = matrix(); if (_e) { if(_o->matrix) { _e->UnPackTo(_o->matrix.get(), _resolver); } else { _o->matrix = std::unique_ptr<Native::Matrix>(_e->UnPack(_resolver)); } } else if (_o->matrix) { _o->matrix.reset(); } }
|
||||||
{ auto _e = matrices(); if (_e) { _o->matrices.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { if(_o->matrices[_i]) { _e->Get(_i)->UnPackTo(_o->matrices[_i].get(), _resolver); } else { _o->matrices[_i] = std::unique_ptr<Native::Matrix>(_e->Get(_i)->UnPack(_resolver)); } } } else { _o->matrices.resize(0); } }
|
{ auto _e = matrices(); if (_e) { _o->matrices.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { if(_o->matrices[_i]) { _e->Get(_i)->UnPackTo(_o->matrices[_i].get(), _resolver); } else { _o->matrices[_i] = std::unique_ptr<Native::Matrix>(_e->Get(_i)->UnPack(_resolver)); } } } else { _o->matrices.resize(0); } }
|
||||||
|
{ auto _e = simple_position(); if (_e) _o->simple_position = ::flatbuffers::UnPackVector3DSimple(*_e); }
|
||||||
|
{ auto _e = simple_vectors(); if (_e) { _o->simple_vectors.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->simple_vectors[_i] = ::flatbuffers::UnPackVector3DSimple(*_e->Get(_i)); } } else { _o->simple_vectors.resize(0); } }
|
||||||
}
|
}
|
||||||
|
|
||||||
inline ::flatbuffers::Offset<ApplicationData> CreateApplicationData(::flatbuffers::FlatBufferBuilder &_fbb, const ApplicationDataT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {
|
inline ::flatbuffers::Offset<ApplicationData> CreateApplicationData(::flatbuffers::FlatBufferBuilder &_fbb, const ApplicationDataT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {
|
||||||
@@ -451,6 +552,8 @@ inline ::flatbuffers::Offset<ApplicationData> ApplicationData::Pack(::flatbuffer
|
|||||||
auto _position_inline = ::flatbuffers::Pack(_o->position_inline);
|
auto _position_inline = ::flatbuffers::Pack(_o->position_inline);
|
||||||
auto _matrix = _o->matrix ? CreateMatrix(_fbb, _o->matrix.get(), _rehasher) : 0;
|
auto _matrix = _o->matrix ? CreateMatrix(_fbb, _o->matrix.get(), _rehasher) : 0;
|
||||||
auto _matrices = _o->matrices.size() ? _fbb.CreateVector<::flatbuffers::Offset<Geometry::Matrix>> (_o->matrices.size(), [](size_t i, _VectorArgs *__va) { return CreateMatrix(*__va->__fbb, __va->__o->matrices[i].get(), __va->__rehasher); }, &_va ) : 0;
|
auto _matrices = _o->matrices.size() ? _fbb.CreateVector<::flatbuffers::Offset<Geometry::Matrix>> (_o->matrices.size(), [](size_t i, _VectorArgs *__va) { return CreateMatrix(*__va->__fbb, __va->__o->matrices[i].get(), __va->__rehasher); }, &_va ) : 0;
|
||||||
|
auto _simple_position = ::flatbuffers::PackVector3DSimple(_o->simple_position);
|
||||||
|
auto _simple_vectors = _o->simple_vectors.size() ? _fbb.CreateVectorOfNativeStructs<Geometry::Vector3DSimple, Native::Vector3D>(_o->simple_vectors, ::flatbuffers::PackVector3DSimple) : 0;
|
||||||
return Geometry::CreateApplicationData(
|
return Geometry::CreateApplicationData(
|
||||||
_fbb,
|
_fbb,
|
||||||
_vectors,
|
_vectors,
|
||||||
@@ -458,7 +561,9 @@ inline ::flatbuffers::Offset<ApplicationData> ApplicationData::Pack(::flatbuffer
|
|||||||
_o->position ? &_position : nullptr,
|
_o->position ? &_position : nullptr,
|
||||||
&_position_inline,
|
&_position_inline,
|
||||||
_matrix,
|
_matrix,
|
||||||
_matrices);
|
_matrices,
|
||||||
|
&_simple_position,
|
||||||
|
_simple_vectors);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const ::flatbuffers::TypeTable *Vector3DTypeTable() {
|
inline const ::flatbuffers::TypeTable *Vector3DTypeTable() {
|
||||||
@@ -497,6 +602,24 @@ inline const ::flatbuffers::TypeTable *Vector3DAltTypeTable() {
|
|||||||
return &tt;
|
return &tt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline const ::flatbuffers::TypeTable *Vector3DSimpleTypeTable() {
|
||||||
|
static const ::flatbuffers::TypeCode type_codes[] = {
|
||||||
|
{ ::flatbuffers::ET_FLOAT, 0, -1 },
|
||||||
|
{ ::flatbuffers::ET_FLOAT, 0, -1 },
|
||||||
|
{ ::flatbuffers::ET_FLOAT, 0, -1 }
|
||||||
|
};
|
||||||
|
static const int64_t values[] = { 0, 4, 8, 12 };
|
||||||
|
static const char * const names[] = {
|
||||||
|
"x",
|
||||||
|
"y",
|
||||||
|
"z"
|
||||||
|
};
|
||||||
|
static const ::flatbuffers::TypeTable tt = {
|
||||||
|
::flatbuffers::ST_STRUCT, 3, type_codes, nullptr, nullptr, values, names
|
||||||
|
};
|
||||||
|
return &tt;
|
||||||
|
}
|
||||||
|
|
||||||
inline const ::flatbuffers::TypeTable *MatrixTypeTable() {
|
inline const ::flatbuffers::TypeTable *MatrixTypeTable() {
|
||||||
static const ::flatbuffers::TypeCode type_codes[] = {
|
static const ::flatbuffers::TypeCode type_codes[] = {
|
||||||
{ ::flatbuffers::ET_INT, 0, -1 },
|
{ ::flatbuffers::ET_INT, 0, -1 },
|
||||||
@@ -521,12 +644,15 @@ inline const ::flatbuffers::TypeTable *ApplicationDataTypeTable() {
|
|||||||
{ ::flatbuffers::ET_SEQUENCE, 0, 0 },
|
{ ::flatbuffers::ET_SEQUENCE, 0, 0 },
|
||||||
{ ::flatbuffers::ET_SEQUENCE, 0, 0 },
|
{ ::flatbuffers::ET_SEQUENCE, 0, 0 },
|
||||||
{ ::flatbuffers::ET_SEQUENCE, 0, 2 },
|
{ ::flatbuffers::ET_SEQUENCE, 0, 2 },
|
||||||
{ ::flatbuffers::ET_SEQUENCE, 1, 2 }
|
{ ::flatbuffers::ET_SEQUENCE, 1, 2 },
|
||||||
|
{ ::flatbuffers::ET_SEQUENCE, 0, 3 },
|
||||||
|
{ ::flatbuffers::ET_SEQUENCE, 1, 3 }
|
||||||
};
|
};
|
||||||
static const ::flatbuffers::TypeFunction type_refs[] = {
|
static const ::flatbuffers::TypeFunction type_refs[] = {
|
||||||
Geometry::Vector3DTypeTable,
|
Geometry::Vector3DTypeTable,
|
||||||
Geometry::Vector3DAltTypeTable,
|
Geometry::Vector3DAltTypeTable,
|
||||||
Geometry::MatrixTypeTable
|
Geometry::MatrixTypeTable,
|
||||||
|
Geometry::Vector3DSimpleTypeTable
|
||||||
};
|
};
|
||||||
static const char * const names[] = {
|
static const char * const names[] = {
|
||||||
"vectors",
|
"vectors",
|
||||||
@@ -534,10 +660,12 @@ inline const ::flatbuffers::TypeTable *ApplicationDataTypeTable() {
|
|||||||
"position",
|
"position",
|
||||||
"position_inline",
|
"position_inline",
|
||||||
"matrix",
|
"matrix",
|
||||||
"matrices"
|
"matrices",
|
||||||
|
"simple_position",
|
||||||
|
"simple_vectors"
|
||||||
};
|
};
|
||||||
static const ::flatbuffers::TypeTable tt = {
|
static const ::flatbuffers::TypeTable tt = {
|
||||||
::flatbuffers::ST_TABLE, 6, type_codes, type_refs, nullptr, nullptr, names
|
::flatbuffers::ST_TABLE, 8, type_codes, type_refs, nullptr, nullptr, names
|
||||||
};
|
};
|
||||||
return &tt;
|
return &tt;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,15 @@ Geometry::Vector3DAlt PackVector3DAlt(const Native::Vector3D& obj) {
|
|||||||
const Native::Vector3D UnPackVector3DAlt(const Geometry::Vector3DAlt& obj) {
|
const Native::Vector3D UnPackVector3DAlt(const Geometry::Vector3DAlt& obj) {
|
||||||
return Native::Vector3D(obj.a(), obj.b(), obj.c());
|
return Native::Vector3D(obj.a(), obj.b(), obj.c());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Geometry::Vector3DSimple PackVector3DSimple(const Native::Vector3D& obj) {
|
||||||
|
return Geometry::Vector3DSimple(obj.x, obj.y, obj.z);
|
||||||
|
}
|
||||||
|
|
||||||
|
const Native::Vector3D UnPackVector3DSimple(
|
||||||
|
const Geometry::Vector3DSimple& obj) {
|
||||||
|
return Native::Vector3D(obj.x(), obj.y(), obj.z());
|
||||||
|
}
|
||||||
} // namespace flatbuffers
|
} // namespace flatbuffers
|
||||||
|
|
||||||
namespace Geometry {
|
namespace Geometry {
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ struct Matrix {
|
|||||||
namespace Geometry {
|
namespace Geometry {
|
||||||
struct Vector3D;
|
struct Vector3D;
|
||||||
struct Vector3DAlt;
|
struct Vector3DAlt;
|
||||||
|
struct Vector3DSimple;
|
||||||
} // namespace Geometry
|
} // namespace Geometry
|
||||||
|
|
||||||
namespace flatbuffers {
|
namespace flatbuffers {
|
||||||
@@ -55,6 +56,8 @@ Geometry::Vector3D Pack(const Native::Vector3D& obj);
|
|||||||
const Native::Vector3D UnPack(const Geometry::Vector3D& obj);
|
const Native::Vector3D UnPack(const Geometry::Vector3D& obj);
|
||||||
Geometry::Vector3DAlt PackVector3DAlt(const Native::Vector3D& obj);
|
Geometry::Vector3DAlt PackVector3DAlt(const Native::Vector3D& obj);
|
||||||
const Native::Vector3D UnPackVector3DAlt(const Geometry::Vector3DAlt& obj);
|
const Native::Vector3D UnPackVector3DAlt(const Geometry::Vector3DAlt& obj);
|
||||||
|
Geometry::Vector3DSimple PackVector3DSimple(const Native::Vector3D& obj);
|
||||||
|
const Native::Vector3D UnPackVector3DSimple(const Geometry::Vector3DSimple& obj);
|
||||||
} // namespace flatbuffers
|
} // namespace flatbuffers
|
||||||
|
|
||||||
#endif // VECTOR3D_PACK_H
|
#endif // VECTOR3D_PACK_H
|
||||||
|
|||||||
107
tests/test.cpp
107
tests/test.cpp
@@ -63,7 +63,9 @@
|
|||||||
#include "flexbuffers_test.h"
|
#include "flexbuffers_test.h"
|
||||||
#include "is_quiet_nan.h"
|
#include "is_quiet_nan.h"
|
||||||
#include "monster_test_bfbs_generated.h" // Generated using --bfbs-comments --bfbs-builtins --cpp --bfbs-gen-embed
|
#include "monster_test_bfbs_generated.h" // Generated using --bfbs-comments --bfbs-builtins --cpp --bfbs-gen-embed
|
||||||
|
#include "cpp_vec_type_test_generated.h"
|
||||||
#include "native_type_test_generated.h"
|
#include "native_type_test_generated.h"
|
||||||
|
#include "cpp_vec_type_native_type_test_generated.h"
|
||||||
#include "test_assert.h"
|
#include "test_assert.h"
|
||||||
#include "util_test.h"
|
#include "util_test.h"
|
||||||
#include "vector_table_naked_ptr_test.h"
|
#include "vector_table_naked_ptr_test.h"
|
||||||
@@ -929,6 +931,12 @@ void NativeTypeTest() {
|
|||||||
Native::Vector3D(20 * i + 0.1f, 20 * i + 0.2f, 20 * i + 0.3f));
|
Native::Vector3D(20 * i + 0.1f, 20 * i + 0.2f, 20 * i + 0.3f));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
src_data.simple_position = Native::Vector3D(7.0f, 8.0f, 9.0f);
|
||||||
|
for (int i = 0; i < N; ++i) {
|
||||||
|
src_data.simple_vectors.push_back(
|
||||||
|
Native::Vector3D(30 * i + 0.1f, 30 * i + 0.2f, 30 * i + 0.3f));
|
||||||
|
}
|
||||||
|
|
||||||
src_data.matrix = std::unique_ptr<Native::Matrix>(new Native::Matrix(1, 2));
|
src_data.matrix = std::unique_ptr<Native::Matrix>(new Native::Matrix(1, 2));
|
||||||
src_data.matrix->values = {3, 4};
|
src_data.matrix->values = {3, 4};
|
||||||
|
|
||||||
@@ -963,6 +971,17 @@ void NativeTypeTest() {
|
|||||||
TEST_EQ(v2.z, 20 * i + 0.3f);
|
TEST_EQ(v2.z, 20 * i + 0.3f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_EQ(dstDataT->simple_position.x, 7.0f);
|
||||||
|
TEST_EQ(dstDataT->simple_position.y, 8.0f);
|
||||||
|
TEST_EQ(dstDataT->simple_position.z, 9.0f);
|
||||||
|
|
||||||
|
for (int i = 0; i < N; ++i) {
|
||||||
|
const Native::Vector3D& sv = dstDataT->simple_vectors[i];
|
||||||
|
TEST_EQ(sv.x, 30 * i + 0.1f);
|
||||||
|
TEST_EQ(sv.y, 30 * i + 0.2f);
|
||||||
|
TEST_EQ(sv.z, 30 * i + 0.3f);
|
||||||
|
}
|
||||||
|
|
||||||
TEST_EQ(dstDataT->matrix->rows, 1);
|
TEST_EQ(dstDataT->matrix->rows, 1);
|
||||||
TEST_EQ(dstDataT->matrix->columns, 2);
|
TEST_EQ(dstDataT->matrix->columns, 2);
|
||||||
TEST_EQ(dstDataT->matrix->values[0], 3);
|
TEST_EQ(dstDataT->matrix->values[0], 3);
|
||||||
@@ -978,6 +997,92 @@ void NativeTypeTest() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CppVecTypeTest() {
|
||||||
|
static_assert(
|
||||||
|
std::is_same<decltype(CppVecTest::DataT{}.values),
|
||||||
|
CppVecTest::CustomVec<int32_t>>::value,
|
||||||
|
"values should be CustomVec<int32_t>");
|
||||||
|
static_assert(
|
||||||
|
std::is_same<decltype(CppVecTest::DataT{}.regular),
|
||||||
|
std::vector<int32_t>>::value,
|
||||||
|
"regular should be std::vector<int32_t>");
|
||||||
|
|
||||||
|
CppVecTest::DataT src;
|
||||||
|
src.values.push_back(10);
|
||||||
|
src.values.push_back(20);
|
||||||
|
src.values.push_back(30);
|
||||||
|
|
||||||
|
auto item = flatbuffers::unique_ptr<CppVecTest::ItemT>(new CppVecTest::ItemT());
|
||||||
|
item->id = 42;
|
||||||
|
item->value = 1.5f;
|
||||||
|
src.items.push_back(std::move(item));
|
||||||
|
|
||||||
|
src.strs.push_back("hello");
|
||||||
|
src.strs.push_back("world");
|
||||||
|
|
||||||
|
flatbuffers::FlatBufferBuilder fbb;
|
||||||
|
fbb.Finish(CppVecTest::Data::Pack(fbb, &src));
|
||||||
|
|
||||||
|
auto dst = CppVecTest::UnPackData(fbb.GetBufferPointer());
|
||||||
|
|
||||||
|
TEST_EQ(dst->values.size(), 3U);
|
||||||
|
TEST_EQ(dst->values[0], 10);
|
||||||
|
TEST_EQ(dst->values[1], 20);
|
||||||
|
TEST_EQ(dst->values[2], 30);
|
||||||
|
|
||||||
|
TEST_EQ(dst->items.size(), 1U);
|
||||||
|
TEST_EQ(dst->items[0]->id, 42);
|
||||||
|
TEST_EQ(dst->items[0]->value, 1.5f);
|
||||||
|
|
||||||
|
TEST_EQ(dst->strs.size(), 2U);
|
||||||
|
TEST_EQ(dst->strs[0], std::string("hello"));
|
||||||
|
TEST_EQ(dst->strs[1], std::string("world"));
|
||||||
|
|
||||||
|
TEST_EQ(dst->regular.size(), 0U);
|
||||||
|
TEST_ASSERT(*dst == *dst);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CppVecTypeNativeTypeTest() {
|
||||||
|
// Verify that combining cpp_vec_type + native_type on a vector of structs
|
||||||
|
// produces the correct container type in the NativeTable.
|
||||||
|
static_assert(
|
||||||
|
std::is_same<
|
||||||
|
decltype(CppVecNativeTypeTest::ContainerT{}.points),
|
||||||
|
CppVecNativeTypeTest::CustomVec<
|
||||||
|
CppVecNativeTypeTest::Native::Vec3>>::value,
|
||||||
|
"points should be CustomVec<Native::Vec3>");
|
||||||
|
static_assert(
|
||||||
|
std::is_same<decltype(CppVecNativeTypeTest::ContainerT{}.bytes),
|
||||||
|
CppVecNativeTypeTest::CustomVec<uint8_t>>::value,
|
||||||
|
"bytes should be CustomVec<uint8_t>");
|
||||||
|
|
||||||
|
const int N = 3;
|
||||||
|
CppVecNativeTypeTest::ContainerT src;
|
||||||
|
for (int i = 0; i < N; ++i) {
|
||||||
|
src.points.push_back(
|
||||||
|
CppVecNativeTypeTest::Native::Vec3(1.0f * i, 2.0f * i, 3.0f * i));
|
||||||
|
src.bytes.push_back(static_cast<uint8_t>(i * 10));
|
||||||
|
}
|
||||||
|
|
||||||
|
flatbuffers::FlatBufferBuilder fbb;
|
||||||
|
fbb.Finish(CppVecNativeTypeTest::Container::Pack(fbb, &src));
|
||||||
|
|
||||||
|
auto dst =
|
||||||
|
CppVecNativeTypeTest::UnPackContainer(fbb.GetBufferPointer());
|
||||||
|
|
||||||
|
TEST_EQ(dst->points.size(), static_cast<size_t>(N));
|
||||||
|
for (int i = 0; i < N; ++i) {
|
||||||
|
TEST_EQ(dst->points[i].x, 1.0f * i);
|
||||||
|
TEST_EQ(dst->points[i].y, 2.0f * i);
|
||||||
|
TEST_EQ(dst->points[i].z, 3.0f * i);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_EQ(dst->bytes.size(), static_cast<size_t>(N));
|
||||||
|
for (int i = 0; i < N; ++i) {
|
||||||
|
TEST_EQ(dst->bytes[i], static_cast<uint8_t>(i * 10));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Guard against -Wunused-function on platforms without file tests.
|
// Guard against -Wunused-function on platforms without file tests.
|
||||||
#ifndef FLATBUFFERS_NO_FILE_TESTS
|
#ifndef FLATBUFFERS_NO_FILE_TESTS
|
||||||
// VS10 does not support typed enums, exclude from tests
|
// VS10 does not support typed enums, exclude from tests
|
||||||
@@ -1813,6 +1918,8 @@ int FlatBufferTests(const std::string& tests_data_path) {
|
|||||||
InvalidFloatTest();
|
InvalidFloatTest();
|
||||||
FixedLengthArrayTest();
|
FixedLengthArrayTest();
|
||||||
NativeTypeTest();
|
NativeTypeTest();
|
||||||
|
CppVecTypeTest();
|
||||||
|
CppVecTypeNativeTypeTest();
|
||||||
OptionalScalarsTest();
|
OptionalScalarsTest();
|
||||||
ParseFlexbuffersFromJsonWithNullTest();
|
ParseFlexbuffersFromJsonWithNullTest();
|
||||||
FlatbuffersSpanTest();
|
FlatbuffersSpanTest();
|
||||||
|
|||||||
Reference in New Issue
Block a user