mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-30 23:01:37 +00:00
Fix --gen-compare to not generate comparators for native types. (#8681)
Per the definition of --gen-compare: only generate comparators for object API generated structs. Types annoated with native_type must define their own comparators if `--gen-compare` is enabled. Also enables --gen-compare for native_type_test and fixes the test by adding a comparator for the Native::Vector3D type.
This commit is contained in:
@@ -537,14 +537,13 @@ if(FLATBUFFERS_BUILD_TESTS)
|
|||||||
add_definitions(-DFLATBUFFERS_TEST_PATH_PREFIX=${CMAKE_CURRENT_SOURCE_DIR}/)
|
add_definitions(-DFLATBUFFERS_TEST_PATH_PREFIX=${CMAKE_CURRENT_SOURCE_DIR}/)
|
||||||
|
|
||||||
# The flattest target needs some generated files
|
# The flattest target needs some generated files
|
||||||
SET(FLATC_OPT --cpp --gen-mutable --gen-object-api --reflect-names)
|
SET(FLATC_OPT_COMP --cpp --gen-compare --gen-mutable --gen-object-api --reflect-names)
|
||||||
SET(FLATC_OPT_COMP ${FLATC_OPT};--gen-compare)
|
|
||||||
SET(FLATC_OPT_SCOPED_ENUMS ${FLATC_OPT_COMP};--scoped-enums)
|
SET(FLATC_OPT_SCOPED_ENUMS ${FLATC_OPT_COMP};--scoped-enums)
|
||||||
|
|
||||||
compile_schema_for_test(tests/alignment_test.fbs "${FLATC_OPT_COMP}")
|
compile_schema_for_test(tests/alignment_test.fbs "${FLATC_OPT_COMP}")
|
||||||
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}")
|
compile_schema_for_test(tests/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}")
|
||||||
|
|||||||
@@ -355,7 +355,7 @@ flatc(
|
|||||||
)
|
)
|
||||||
|
|
||||||
flatc(
|
flatc(
|
||||||
["--cpp", "--gen-mutable", "--gen-object-api", "--reflect-names"],
|
["--cpp", "--gen-compare", "--gen-mutable", "--gen-object-api", "--reflect-names"],
|
||||||
schema="native_type_test.fbs",
|
schema="native_type_test.fbs",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -512,7 +512,8 @@ class CppGenerator : public BaseGenerator {
|
|||||||
// Generate forward declarations for all equal operators
|
// Generate forward declarations for all equal operators
|
||||||
if (opts_.generate_object_based_api && opts_.gen_compare) {
|
if (opts_.generate_object_based_api && opts_.gen_compare) {
|
||||||
for (const auto& struct_def : parser_.structs_.vec) {
|
for (const auto& struct_def : parser_.structs_.vec) {
|
||||||
if (!struct_def->generated) {
|
const auto native_type = struct_def->attributes.Lookup("native_type");
|
||||||
|
if (!struct_def->generated && !native_type) {
|
||||||
SetNameSpace(struct_def->defined_namespace);
|
SetNameSpace(struct_def->defined_namespace);
|
||||||
auto nativeName = NativeName(Name(*struct_def), struct_def, opts_);
|
auto nativeName = NativeName(Name(*struct_def), struct_def, opts_);
|
||||||
code_ += "bool operator==(const " + nativeName + " &lhs, const " +
|
code_ += "bool operator==(const " + nativeName + " &lhs, const " +
|
||||||
@@ -2190,6 +2191,12 @@ class CppGenerator : public BaseGenerator {
|
|||||||
|
|
||||||
void GenCompareOperator(const StructDef& struct_def,
|
void GenCompareOperator(const StructDef& struct_def,
|
||||||
const std::string& accessSuffix = "") {
|
const std::string& accessSuffix = "") {
|
||||||
|
// Do not generate compare operators for native types.
|
||||||
|
const auto native_type = struct_def.attributes.Lookup("native_type");
|
||||||
|
if (native_type) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
std::string compare_op;
|
std::string compare_op;
|
||||||
for (auto it = struct_def.fields.vec.begin();
|
for (auto it = struct_def.fields.vec.begin();
|
||||||
it != struct_def.fields.vec.end(); ++it) {
|
it != struct_def.fields.vec.end(); ++it) {
|
||||||
|
|||||||
@@ -29,6 +29,11 @@ struct ApplicationData;
|
|||||||
struct ApplicationDataBuilder;
|
struct ApplicationDataBuilder;
|
||||||
struct ApplicationDataT;
|
struct ApplicationDataT;
|
||||||
|
|
||||||
|
bool operator==(const MatrixT &lhs, const MatrixT &rhs);
|
||||||
|
bool operator!=(const MatrixT &lhs, const MatrixT &rhs);
|
||||||
|
bool operator==(const ApplicationDataT &lhs, const ApplicationDataT &rhs);
|
||||||
|
bool operator!=(const ApplicationDataT &lhs, const ApplicationDataT &rhs);
|
||||||
|
|
||||||
inline const ::flatbuffers::TypeTable *Vector3DTypeTable();
|
inline const ::flatbuffers::TypeTable *Vector3DTypeTable();
|
||||||
|
|
||||||
inline const ::flatbuffers::TypeTable *Vector3DAltTypeTable();
|
inline const ::flatbuffers::TypeTable *Vector3DAltTypeTable();
|
||||||
@@ -377,6 +382,19 @@ inline ::flatbuffers::Offset<ApplicationData> CreateApplicationDataDirect(
|
|||||||
|
|
||||||
::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);
|
||||||
|
|
||||||
|
|
||||||
|
inline bool operator==(const MatrixT &lhs, const MatrixT &rhs) {
|
||||||
|
return
|
||||||
|
(lhs.rows == rhs.rows) &&
|
||||||
|
(lhs.columns == rhs.columns) &&
|
||||||
|
(lhs.values == rhs.values);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator!=(const MatrixT &lhs, const MatrixT &rhs) {
|
||||||
|
return !(lhs == rhs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
inline MatrixT *Matrix::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {
|
inline MatrixT *Matrix::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {
|
||||||
auto _o = std::unique_ptr<MatrixT>(new MatrixT());
|
auto _o = std::unique_ptr<MatrixT>(new MatrixT());
|
||||||
UnPackTo(_o.get(), _resolver);
|
UnPackTo(_o.get(), _resolver);
|
||||||
@@ -409,6 +427,22 @@ inline ::flatbuffers::Offset<Matrix> Matrix::Pack(::flatbuffers::FlatBufferBuild
|
|||||||
_values);
|
_values);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool operator==(const ApplicationDataT &lhs, const ApplicationDataT &rhs) {
|
||||||
|
return
|
||||||
|
(lhs.vectors == rhs.vectors) &&
|
||||||
|
(lhs.vectors_alt == rhs.vectors_alt) &&
|
||||||
|
((lhs.position == rhs.position) || (lhs.position && rhs.position && *lhs.position == *rhs.position)) &&
|
||||||
|
(lhs.position_inline == rhs.position_inline) &&
|
||||||
|
((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<Geometry::MatrixT> const &a, std::unique_ptr<Geometry::MatrixT> const &b) { return (a == b) || (a && b && *a == *b); }));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator!=(const ApplicationDataT &lhs, const ApplicationDataT &rhs) {
|
||||||
|
return !(lhs == rhs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
inline ApplicationDataT::ApplicationDataT(const ApplicationDataT &o)
|
inline ApplicationDataT::ApplicationDataT(const ApplicationDataT &o)
|
||||||
: vectors(o.vectors),
|
: vectors(o.vectors),
|
||||||
vectors_alt(o.vectors_alt),
|
vectors_alt(o.vectors_alt),
|
||||||
|
|||||||
@@ -17,6 +17,10 @@ struct Vector3D {
|
|||||||
this->y = _y;
|
this->y = _y;
|
||||||
this->z = _z;
|
this->z = _z;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool operator==(const Vector3D &other) const {
|
||||||
|
return (x == other.x) && (y == other.y) && (z == other.z);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
} // namespace Native
|
} // namespace Native
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user