diff --git a/samples/monster_generated.h b/samples/monster_generated.h index 5286ffd80..0f7d06460 100644 --- a/samples/monster_generated.h +++ b/samples/monster_generated.h @@ -18,8 +18,11 @@ struct Weapon; struct WeaponT; bool operator==(const Vec3 &lhs, const Vec3 &rhs); +bool operator!=(const Vec3 &lhs, const Vec3 &rhs); bool operator==(const MonsterT &lhs, const MonsterT &rhs); +bool operator!=(const MonsterT &lhs, const MonsterT &rhs); bool operator==(const WeaponT &lhs, const WeaponT &rhs); +bool operator!=(const WeaponT &lhs, const WeaponT &rhs); inline const flatbuffers::TypeTable *Vec3TypeTable(); @@ -155,6 +158,11 @@ inline bool operator==(const EquipmentUnion &lhs, const EquipmentUnion &rhs) { } } } + +inline bool operator!=(const EquipmentUnion &lhs, const EquipmentUnion &rhs) { + return !(lhs == rhs); +} + bool VerifyEquipment(flatbuffers::Verifier &verifier, const void *obj, Equipment type); bool VerifyEquipmentVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector> *values, const flatbuffers::Vector *types); @@ -201,6 +209,11 @@ inline bool operator==(const Vec3 &lhs, const Vec3 &rhs) { (lhs.z() == rhs.z()); } +inline bool operator!=(const Vec3 &lhs, const Vec3 &rhs) { + return !(lhs == rhs); +} + + struct MonsterT : public flatbuffers::NativeTable { typedef Monster TableType; flatbuffers::unique_ptr pos; @@ -230,6 +243,11 @@ inline bool operator==(const MonsterT &lhs, const MonsterT &rhs) { (lhs.equipped == rhs.equipped); } +inline bool operator!=(const MonsterT &lhs, const MonsterT &rhs) { + return !(lhs == rhs); +} + + struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef MonsterT NativeTableType; static const flatbuffers::TypeTable *MiniReflectTypeTable() { @@ -441,6 +459,11 @@ inline bool operator==(const WeaponT &lhs, const WeaponT &rhs) { (lhs.damage == rhs.damage); } +inline bool operator!=(const WeaponT &lhs, const WeaponT &rhs) { + return !(lhs == rhs); +} + + struct Weapon FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef WeaponT NativeTableType; static const flatbuffers::TypeTable *MiniReflectTypeTable() { diff --git a/src/idl_gen_cpp.cpp b/src/idl_gen_cpp.cpp index 90f747aa2..15b02156a 100644 --- a/src/idl_gen_cpp.cpp +++ b/src/idl_gen_cpp.cpp @@ -250,6 +250,8 @@ class CppGenerator : public BaseGenerator { NativeName(Name(struct_def), &struct_def, parser_.opts); code_ += "bool operator==(const " + nativeName + " &lhs, const " + nativeName + " &rhs);"; + code_ += "bool operator!=(const " + nativeName + " &lhs, const " + + nativeName + " &rhs);"; } } code_ += ""; @@ -1174,6 +1176,14 @@ class CppGenerator : public BaseGenerator { code_ += " }"; code_ += " }"; code_ += "}"; + + code_ += ""; + code_ += + "inline bool operator!=(const {{NAME}}Union &lhs, const " + "{{NAME}}Union &rhs) {"; + code_ += " return !(lhs == rhs);"; + code_ += "}"; + code_ += ""; } } @@ -1583,6 +1593,14 @@ class CppGenerator : public BaseGenerator { "{{NATIVE_NAME}} &{{CMP_RHS}}) {"; code_ += "{{CMP_OP}}"; code_ += "}"; + + code_ += ""; + code_ += + "inline bool operator!=(const {{NATIVE_NAME}} &lhs, const " + "{{NATIVE_NAME}} &rhs) {"; + code_ += " return !(lhs == rhs);"; + code_ += "}"; + code_ += ""; } void GenOperatorNewDelete(const StructDef &struct_def) { diff --git a/tests/monster_extra_generated.h b/tests/monster_extra_generated.h index ac316d6f9..8599b8112 100644 --- a/tests/monster_extra_generated.h +++ b/tests/monster_extra_generated.h @@ -12,6 +12,7 @@ struct MonsterExtra; struct MonsterExtraT; bool operator==(const MonsterExtraT &lhs, const MonsterExtraT &rhs); +bool operator!=(const MonsterExtraT &lhs, const MonsterExtraT &rhs); inline const flatbuffers::TypeTable *MonsterExtraTypeTable(); @@ -43,6 +44,11 @@ inline bool operator==(const MonsterExtraT &lhs, const MonsterExtraT &rhs) { (lhs.testd_ninf == rhs.testd_ninf); } +inline bool operator!=(const MonsterExtraT &lhs, const MonsterExtraT &rhs) { + return !(lhs == rhs); +} + + struct MonsterExtra FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef MonsterExtraT NativeTableType; static const flatbuffers::TypeTable *MiniReflectTypeTable() { diff --git a/tests/monster_test_generated.h b/tests/monster_test_generated.h index f8c82f528..1285ba8ec 100644 --- a/tests/monster_test_generated.h +++ b/tests/monster_test_generated.h @@ -45,21 +45,31 @@ struct TypeAliasesT; } // namespace Example bool operator==(const InParentNamespaceT &lhs, const InParentNamespaceT &rhs); +bool operator!=(const InParentNamespaceT &lhs, const InParentNamespaceT &rhs); namespace Example2 { bool operator==(const MonsterT &lhs, const MonsterT &rhs); +bool operator!=(const MonsterT &lhs, const MonsterT &rhs); } // namespace Example2 namespace Example { bool operator==(const Test &lhs, const Test &rhs); +bool operator!=(const Test &lhs, const Test &rhs); bool operator==(const TestSimpleTableWithEnumT &lhs, const TestSimpleTableWithEnumT &rhs); +bool operator!=(const TestSimpleTableWithEnumT &lhs, const TestSimpleTableWithEnumT &rhs); bool operator==(const Vec3 &lhs, const Vec3 &rhs); +bool operator!=(const Vec3 &lhs, const Vec3 &rhs); bool operator==(const Ability &lhs, const Ability &rhs); +bool operator!=(const Ability &lhs, const Ability &rhs); bool operator==(const StatT &lhs, const StatT &rhs); +bool operator!=(const StatT &lhs, const StatT &rhs); bool operator==(const ReferrableT &lhs, const ReferrableT &rhs); +bool operator!=(const ReferrableT &lhs, const ReferrableT &rhs); bool operator==(const MonsterT &lhs, const MonsterT &rhs); +bool operator!=(const MonsterT &lhs, const MonsterT &rhs); bool operator==(const TypeAliasesT &lhs, const TypeAliasesT &rhs); +bool operator!=(const TypeAliasesT &lhs, const TypeAliasesT &rhs); } // namespace Example @@ -260,6 +270,11 @@ inline bool operator==(const AnyUnion &lhs, const AnyUnion &rhs) { } } } + +inline bool operator!=(const AnyUnion &lhs, const AnyUnion &rhs) { + return !(lhs == rhs); +} + bool VerifyAny(flatbuffers::Verifier &verifier, const void *obj, Any type); bool VerifyAnyVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector> *values, const flatbuffers::Vector *types); @@ -396,6 +411,11 @@ inline bool operator==(const AnyUniqueAliasesUnion &lhs, const AnyUniqueAliasesU } } } + +inline bool operator!=(const AnyUniqueAliasesUnion &lhs, const AnyUniqueAliasesUnion &rhs) { + return !(lhs == rhs); +} + bool VerifyAnyUniqueAliases(flatbuffers::Verifier &verifier, const void *obj, AnyUniqueAliases type); bool VerifyAnyUniqueAliasesVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector> *values, const flatbuffers::Vector *types); @@ -505,6 +525,11 @@ inline bool operator==(const AnyAmbiguousAliasesUnion &lhs, const AnyAmbiguousAl } } } + +inline bool operator!=(const AnyAmbiguousAliasesUnion &lhs, const AnyAmbiguousAliasesUnion &rhs) { + return !(lhs == rhs); +} + bool VerifyAnyAmbiguousAliases(flatbuffers::Verifier &verifier, const void *obj, AnyAmbiguousAliases type); bool VerifyAnyAmbiguousAliasesVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector> *values, const flatbuffers::Vector *types); @@ -545,6 +570,11 @@ inline bool operator==(const Test &lhs, const Test &rhs) { (lhs.b() == rhs.b()); } +inline bool operator!=(const Test &lhs, const Test &rhs) { + return !(lhs == rhs); +} + + FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(8) Vec3 FLATBUFFERS_FINAL_CLASS { private: float x_; @@ -624,6 +654,11 @@ inline bool operator==(const Vec3 &lhs, const Vec3 &rhs) { (lhs.test3() == rhs.test3()); } +inline bool operator!=(const Vec3 &lhs, const Vec3 &rhs) { + return !(lhs == rhs); +} + + FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(4) Ability FLATBUFFERS_FINAL_CLASS { private: uint32_t id_; @@ -664,6 +699,11 @@ inline bool operator==(const Ability &lhs, const Ability &rhs) { (lhs.distance() == rhs.distance()); } +inline bool operator!=(const Ability &lhs, const Ability &rhs) { + return !(lhs == rhs); +} + + } // namespace Example struct InParentNamespaceT : public flatbuffers::NativeTable { @@ -676,6 +716,11 @@ inline bool operator==(const InParentNamespaceT &, const InParentNamespaceT &) { return true; } +inline bool operator!=(const InParentNamespaceT &lhs, const InParentNamespaceT &rhs) { + return !(lhs == rhs); +} + + struct InParentNamespace FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef InParentNamespaceT NativeTableType; static const flatbuffers::TypeTable *MiniReflectTypeTable() { @@ -725,6 +770,11 @@ inline bool operator==(const MonsterT &, const MonsterT &) { return true; } +inline bool operator!=(const MonsterT &lhs, const MonsterT &rhs) { + return !(lhs == rhs); +} + + struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef MonsterT NativeTableType; static const flatbuffers::TypeTable *MiniReflectTypeTable() { @@ -779,6 +829,11 @@ inline bool operator==(const TestSimpleTableWithEnumT &lhs, const TestSimpleTabl (lhs.color == rhs.color); } +inline bool operator!=(const TestSimpleTableWithEnumT &lhs, const TestSimpleTableWithEnumT &rhs) { + return !(lhs == rhs); +} + + struct TestSimpleTableWithEnum FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef TestSimpleTableWithEnumT NativeTableType; static const flatbuffers::TypeTable *MiniReflectTypeTable() { @@ -849,6 +904,11 @@ inline bool operator==(const StatT &lhs, const StatT &rhs) { (lhs.count == rhs.count); } +inline bool operator!=(const StatT &lhs, const StatT &rhs) { + return !(lhs == rhs); +} + + struct Stat FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef StatT NativeTableType; static const flatbuffers::TypeTable *MiniReflectTypeTable() { @@ -954,6 +1014,11 @@ inline bool operator==(const ReferrableT &lhs, const ReferrableT &rhs) { (lhs.id == rhs.id); } +inline bool operator!=(const ReferrableT &lhs, const ReferrableT &rhs) { + return !(lhs == rhs); +} + + struct Referrable FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef ReferrableT NativeTableType; static const flatbuffers::TypeTable *MiniReflectTypeTable() { @@ -1128,6 +1193,11 @@ inline bool operator==(const MonsterT &lhs, const MonsterT &rhs) { (lhs.vector_of_enums == rhs.vector_of_enums); } +inline bool operator!=(const MonsterT &lhs, const MonsterT &rhs) { + return !(lhs == rhs); +} + + /// an example documentation comment: monster object struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef MonsterT NativeTableType; @@ -2040,6 +2110,11 @@ inline bool operator==(const TypeAliasesT &lhs, const TypeAliasesT &rhs) { (lhs.vf64 == rhs.vf64); } +inline bool operator!=(const TypeAliasesT &lhs, const TypeAliasesT &rhs) { + return !(lhs == rhs); +} + + struct TypeAliases FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef TypeAliasesT NativeTableType; static const flatbuffers::TypeTable *MiniReflectTypeTable() { diff --git a/tests/test.cpp b/tests/test.cpp index 73d6663c5..2f60ca811 100644 --- a/tests/test.cpp +++ b/tests/test.cpp @@ -2423,19 +2423,25 @@ void EqualOperatorTest() { MonsterT a; MonsterT b; TEST_EQ(b == a, true); + TEST_EQ(b != a, false); b.mana = 33; TEST_EQ(b == a, false); + TEST_EQ(b != a, true); b.mana = 150; TEST_EQ(b == a, true); + TEST_EQ(b != a, false); b.inventory.push_back(3); TEST_EQ(b == a, false); + TEST_EQ(b != a, true); b.inventory.clear(); TEST_EQ(b == a, true); + TEST_EQ(b != a, false); b.test.type = Any_Monster; TEST_EQ(b == a, false); + TEST_EQ(b != a, true); } // For testing any binaries, e.g. from fuzzing. diff --git a/tests/union_vector/union_vector_generated.h b/tests/union_vector/union_vector_generated.h index 8629d4edf..22c0217ea 100644 --- a/tests/union_vector/union_vector_generated.h +++ b/tests/union_vector/union_vector_generated.h @@ -17,9 +17,13 @@ struct Movie; struct MovieT; bool operator==(const AttackerT &lhs, const AttackerT &rhs); +bool operator!=(const AttackerT &lhs, const AttackerT &rhs); bool operator==(const Rapunzel &lhs, const Rapunzel &rhs); +bool operator!=(const Rapunzel &lhs, const Rapunzel &rhs); bool operator==(const BookReader &lhs, const BookReader &rhs); +bool operator!=(const BookReader &lhs, const BookReader &rhs); bool operator==(const MovieT &lhs, const MovieT &rhs); +bool operator!=(const MovieT &lhs, const MovieT &rhs); inline const flatbuffers::TypeTable *AttackerTypeTable(); @@ -180,6 +184,11 @@ inline bool operator==(const CharacterUnion &lhs, const CharacterUnion &rhs) { } } } + +inline bool operator!=(const CharacterUnion &lhs, const CharacterUnion &rhs) { + return !(lhs == rhs); +} + bool VerifyCharacter(flatbuffers::Verifier &verifier, const void *obj, Character type); bool VerifyCharacterVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector> *values, const flatbuffers::Vector *types); @@ -208,6 +217,11 @@ inline bool operator==(const Rapunzel &lhs, const Rapunzel &rhs) { (lhs.hair_length() == rhs.hair_length()); } +inline bool operator!=(const Rapunzel &lhs, const Rapunzel &rhs) { + return !(lhs == rhs); +} + + FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(4) BookReader FLATBUFFERS_FINAL_CLASS { private: int32_t books_read_; @@ -233,6 +247,11 @@ inline bool operator==(const BookReader &lhs, const BookReader &rhs) { (lhs.books_read() == rhs.books_read()); } +inline bool operator!=(const BookReader &lhs, const BookReader &rhs) { + return !(lhs == rhs); +} + + struct AttackerT : public flatbuffers::NativeTable { typedef Attacker TableType; int32_t sword_attack_damage; @@ -246,6 +265,11 @@ inline bool operator==(const AttackerT &lhs, const AttackerT &rhs) { (lhs.sword_attack_damage == rhs.sword_attack_damage); } +inline bool operator!=(const AttackerT &lhs, const AttackerT &rhs) { + return !(lhs == rhs); +} + + struct Attacker FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef AttackerT NativeTableType; static const flatbuffers::TypeTable *MiniReflectTypeTable() { @@ -312,6 +336,11 @@ inline bool operator==(const MovieT &lhs, const MovieT &rhs) { (lhs.characters == rhs.characters); } +inline bool operator!=(const MovieT &lhs, const MovieT &rhs) { + return !(lhs == rhs); +} + + struct Movie FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef MovieT NativeTableType; static const flatbuffers::TypeTable *MiniReflectTypeTable() {