From e1a360408df66bda1f9e6d95e26b230321d26d21 Mon Sep 17 00:00:00 2001 From: ArseniyShestakov Date: Sun, 22 Nov 2015 07:16:20 +0300 Subject: [PATCH] GameConstants: move operators into header and always inline them --- lib/GameConstants.cpp | 52 --------------------------------- lib/GameConstants.h | 67 +++++++++++++++++++++++++++---------------- 2 files changed, 42 insertions(+), 77 deletions(-) diff --git a/lib/GameConstants.cpp b/lib/GameConstants.cpp index 2b9556091..864b1aba2 100644 --- a/lib/GameConstants.cpp +++ b/lib/GameConstants.cpp @@ -25,58 +25,6 @@ const PlayerColor PlayerColor::NEUTRAL = PlayerColor(255); const PlayerColor PlayerColor::PLAYER_LIMIT = PlayerColor(PLAYER_LIMIT_I); const TeamID TeamID::NO_TEAM = TeamID(255); -#define ID_LIKE_OPERATORS_INTERNAL(A, B, AN, BN) \ -bool operator==(const A & a, const B & b) \ -{ \ - return AN == BN ; \ -} \ -bool operator!=(const A & a, const B & b) \ -{ \ - return AN != BN ; \ -} \ -bool operator<(const A & a, const B & b) \ -{ \ - return AN < BN ; \ -} \ -bool operator<=(const A & a, const B & b) \ -{ \ - return AN <= BN ; \ -} \ -bool operator>(const A & a, const B & b) \ -{ \ - return AN > BN ; \ -} \ -bool operator>=(const A & a, const B & b) \ -{ \ - return AN >= BN ; \ -} - -#define ID_LIKE_OPERATORS(CLASS_NAME, ENUM_NAME) \ - ID_LIKE_OPERATORS_INTERNAL(CLASS_NAME, CLASS_NAME, a.num, b.num) \ - ID_LIKE_OPERATORS_INTERNAL(CLASS_NAME, ENUM_NAME, a.num, b) \ - ID_LIKE_OPERATORS_INTERNAL(ENUM_NAME, CLASS_NAME, a, b.num) - - -ID_LIKE_OPERATORS(SecondarySkill, SecondarySkill::ESecondarySkill) - -ID_LIKE_OPERATORS(Obj, Obj::EObj) - -ID_LIKE_OPERATORS(ETerrainType, ETerrainType::EETerrainType) - -ID_LIKE_OPERATORS(EPathfindingLayer, EPathfindingLayer::EEPathfindingLayer) - -ID_LIKE_OPERATORS(ArtifactID, ArtifactID::EArtifactID) - -ID_LIKE_OPERATORS(ArtifactPosition, ArtifactPosition::EArtifactPosition) - -ID_LIKE_OPERATORS(CreatureID, CreatureID::ECreatureID) - -ID_LIKE_OPERATORS(SpellID, SpellID::ESpellID) - -ID_LIKE_OPERATORS(BuildingID, BuildingID::EBuildingID) - -ID_LIKE_OPERATORS(BFieldType, BFieldType::EBFieldType) - CArtifact * ArtifactID::toArtifact() const { return VLC->arth->artifacts[*this]; diff --git a/lib/GameConstants.h b/lib/GameConstants.h index 3607ae5bf..20262fee0 100644 --- a/lib/GameConstants.h +++ b/lib/GameConstants.h @@ -93,18 +93,37 @@ CLASS_NAME & advance(int i) \ } -#define ID_LIKE_OPERATORS_INTERNAL_DECLS(A, B) \ -bool DLL_LINKAGE operator==(const A & a, const B & b); \ -bool DLL_LINKAGE operator!=(const A & a, const B & b); \ -bool DLL_LINKAGE operator<(const A & a, const B & b); \ -bool DLL_LINKAGE operator<=(const A & a, const B & b); \ -bool DLL_LINKAGE operator>(const A & a, const B & b); \ -bool DLL_LINKAGE operator>=(const A & a, const B & b); +// Operators are performance-critical and to be inlined they must be in header +#define ID_LIKE_OPERATORS_INTERNAL(A, B, AN, BN) \ +STRONG_INLINE bool operator==(const A & a, const B & b) \ +{ \ + return AN == BN ; \ +} \ +STRONG_INLINE bool operator!=(const A & a, const B & b) \ +{ \ + return AN != BN ; \ +} \ +STRONG_INLINE bool operator<(const A & a, const B & b) \ +{ \ + return AN < BN ; \ +} \ +STRONG_INLINE bool operator<=(const A & a, const B & b) \ +{ \ + return AN <= BN ; \ +} \ +STRONG_INLINE bool operator>(const A & a, const B & b) \ +{ \ + return AN > BN ; \ +} \ +STRONG_INLINE bool operator>=(const A & a, const B & b) \ +{ \ + return AN >= BN ; \ +} -#define ID_LIKE_OPERATORS_DECLS(CLASS_NAME, ENUM_NAME) \ - ID_LIKE_OPERATORS_INTERNAL_DECLS(CLASS_NAME, CLASS_NAME) \ - ID_LIKE_OPERATORS_INTERNAL_DECLS(CLASS_NAME, ENUM_NAME) \ - ID_LIKE_OPERATORS_INTERNAL_DECLS(ENUM_NAME, CLASS_NAME) +#define ID_LIKE_OPERATORS(CLASS_NAME, ENUM_NAME) \ + ID_LIKE_OPERATORS_INTERNAL(CLASS_NAME, CLASS_NAME, a.num, b.num) \ + ID_LIKE_OPERATORS_INTERNAL(CLASS_NAME, ENUM_NAME, a.num, b) \ + ID_LIKE_OPERATORS_INTERNAL(ENUM_NAME, CLASS_NAME, a, b.num) #define OP_DECL_INT(CLASS_NAME, OP) \ @@ -296,7 +315,7 @@ public: ESecondarySkill num; }; -ID_LIKE_OPERATORS_DECLS(SecondarySkill, SecondarySkill::ESecondarySkill) +ID_LIKE_OPERATORS(SecondarySkill, SecondarySkill::ESecondarySkill) namespace EAlignment { @@ -384,7 +403,7 @@ public: EBuildingID num; }; -ID_LIKE_OPERATORS_DECLS(BuildingID, BuildingID::EBuildingID) +ID_LIKE_OPERATORS(BuildingID, BuildingID::EBuildingID) namespace EBuildingState { @@ -651,7 +670,7 @@ public: EObj num; }; -ID_LIKE_OPERATORS_DECLS(Obj, Obj::EObj) +ID_LIKE_OPERATORS(Obj, Obj::EObj) namespace SecSkillLevel { @@ -743,7 +762,7 @@ public: DLL_LINKAGE std::ostream & operator<<(std::ostream & os, const ETerrainType terrainType); -ID_LIKE_OPERATORS_DECLS(ETerrainType, ETerrainType::EETerrainType) +ID_LIKE_OPERATORS(ETerrainType, ETerrainType::EETerrainType) class DLL_LINKAGE EPathfindingLayer { @@ -763,7 +782,7 @@ public: DLL_LINKAGE std::ostream & operator<<(std::ostream & os, const EPathfindingLayer pathfindingLayer); -ID_LIKE_OPERATORS_DECLS(EPathfindingLayer, EPathfindingLayer::EEPathfindingLayer) +ID_LIKE_OPERATORS(EPathfindingLayer, EPathfindingLayer::EEPathfindingLayer) class BFieldType { @@ -786,7 +805,7 @@ public: EBFieldType num; }; -ID_LIKE_OPERATORS_DECLS(BFieldType, BFieldType::EBFieldType) +ID_LIKE_OPERATORS(BFieldType, BFieldType::EBFieldType) namespace EPlayerStatus { @@ -826,7 +845,7 @@ public: EArtifactPosition num; }; -ID_LIKE_OPERATORS_DECLS(ArtifactPosition, ArtifactPosition::EArtifactPosition) +ID_LIKE_OPERATORS(ArtifactPosition, ArtifactPosition::EArtifactPosition) class ArtifactID { @@ -871,7 +890,7 @@ public: EArtifactID num; }; -ID_LIKE_OPERATORS_DECLS(ArtifactID, ArtifactID::EArtifactID) +ID_LIKE_OPERATORS(ArtifactID, ArtifactID::EArtifactID) class CreatureID { @@ -915,7 +934,7 @@ public: ECreatureID num; }; -ID_LIKE_OPERATORS_DECLS(CreatureID, CreatureID::ECreatureID) +ID_LIKE_OPERATORS(CreatureID, CreatureID::ECreatureID) class SpellID { @@ -959,7 +978,7 @@ public: ESpellID num; }; -ID_LIKE_OPERATORS_DECLS(SpellID, SpellID::ESpellID) +ID_LIKE_OPERATORS(SpellID, SpellID::ESpellID) enum class ESpellSchool: ui8 { @@ -969,8 +988,6 @@ enum class ESpellSchool: ui8 EARTH = 3 }; -ID_LIKE_OPERATORS_DECLS(SpellID, SpellID::ESpellID) - // Typedef declarations typedef ui8 TFaction; typedef si64 TExpType; @@ -981,8 +998,8 @@ typedef si32 TQuantity; typedef int TRmgTemplateZoneId; #undef ID_LIKE_CLASS_COMMON -#undef ID_LIKE_OPERATORS_DECLS -#undef ID_LIKE_OPERATORS_INTERNAL_DECLS +#undef ID_LIKE_OPERATORS +#undef ID_LIKE_OPERATORS_INTERNAL #undef INSTID_LIKE_CLASS_COMMON #undef OP_DECL_INT