1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-08-13 19:54:17 +02:00

Merge pull request #1916 from rilian-la-te/constexpr-id

vcmi: constexpr IDs
This commit is contained in:
Ivan Savenko
2023-04-10 18:28:45 +03:00
committed by GitHub

View File

@@ -40,67 +40,60 @@ namespace GameConstants
{
DLL_LINKAGE extern const std::string VCMI_VERSION;
const int PUZZLE_MAP_PIECES = 48;
constexpr int PUZZLE_MAP_PIECES = 48;
const int MAX_HEROES_PER_PLAYER = 8;
const int AVAILABLE_HEROES_PER_PLAYER = 2;
constexpr int MAX_HEROES_PER_PLAYER = 8;
constexpr int AVAILABLE_HEROES_PER_PLAYER = 2;
const int ALL_PLAYERS = 255; //bitfield
constexpr int ALL_PLAYERS = 255; //bitfield
const int CREATURES_PER_TOWN = 7; //without upgrades
const int SPELL_LEVELS = 5;
const int SPELL_SCHOOL_LEVELS = 4;
const int CRE_LEVELS = 10; // number of creature experience levels
constexpr int CREATURES_PER_TOWN = 7; //without upgrades
constexpr int SPELL_LEVELS = 5;
constexpr int SPELL_SCHOOL_LEVELS = 4;
constexpr int CRE_LEVELS = 10; // number of creature experience levels
const int HERO_GOLD_COST = 2500;
const int SPELLBOOK_GOLD_COST = 500;
const int SKILL_GOLD_COST = 2000;
const int BATTLE_PENALTY_DISTANCE = 10; //if the distance is > than this, then shooting stack has distance penalty
const int ARMY_SIZE = 7;
const int SKILL_PER_HERO = 8;
const ui32 HERO_HIGH_LEVEL = 10; // affects primary skill upgrade order
constexpr int HERO_GOLD_COST = 2500;
constexpr int SPELLBOOK_GOLD_COST = 500;
constexpr int SKILL_GOLD_COST = 2000;
constexpr int BATTLE_PENALTY_DISTANCE = 10; //if the distance is > than this, then shooting stack has distance penalty
constexpr int ARMY_SIZE = 7;
constexpr int SKILL_PER_HERO = 8;
constexpr ui32 HERO_HIGH_LEVEL = 10; // affects primary skill upgrade order
const int SKILL_QUANTITY=28;
const int PRIMARY_SKILLS=4;
const int RESOURCE_QUANTITY=8;
const int HEROES_PER_TYPE=8; //amount of heroes of each type
constexpr int SKILL_QUANTITY=28;
constexpr int PRIMARY_SKILLS=4;
constexpr int RESOURCE_QUANTITY=8;
constexpr int HEROES_PER_TYPE=8; //amount of heroes of each type
// amounts of OH3 objects. Can be changed by mods, should be used only during H3 loading phase
const int F_NUMBER = 9;
const int ARTIFACTS_QUANTITY=171;
const int HEROES_QUANTITY=156;
const int SPELLS_QUANTITY=70;
const int CREATURES_COUNT = 197;
constexpr int F_NUMBER = 9;
constexpr int ARTIFACTS_QUANTITY=171;
constexpr int HEROES_QUANTITY=156;
constexpr int SPELLS_QUANTITY=70;
constexpr int CREATURES_COUNT = 197;
const ui32 BASE_MOVEMENT_COST = 100; //default cost for non-diagonal movement
constexpr ui32 BASE_MOVEMENT_COST = 100; //default cost for non-diagonal movement
const int HERO_PORTRAIT_SHIFT = 30;// 2 special frames + some extra portraits
constexpr int HERO_PORTRAIT_SHIFT = 30;// 2 special frames + some extra portraits
const std::array<int, 11> POSSIBLE_TURNTIME = {1, 2, 4, 6, 8, 10, 15, 20, 25, 30, 0};
constexpr std::array<int, 11> POSSIBLE_TURNTIME = {1, 2, 4, 6, 8, 10, 15, 20, 25, 30, 0};
}
#define ID_LIKE_CLASS_COMMON(CLASS_NAME, ENUM_NAME) \
CLASS_NAME(const CLASS_NAME & other) \
{ \
num = other.num; \
} \
CLASS_NAME & operator=(const CLASS_NAME & other) \
{ \
num = other.num; \
return *this; \
} \
explicit CLASS_NAME(si32 id) \
constexpr CLASS_NAME(const CLASS_NAME & other) = default; \
constexpr CLASS_NAME & operator=(const CLASS_NAME & other) = default; \
explicit constexpr CLASS_NAME(si32 id) \
: num(static_cast<ENUM_NAME>(id)) \
{} \
operator ENUM_NAME() const \
constexpr operator ENUM_NAME() const \
{ \
return num; \
} \
si32 getNum() const \
constexpr si32 getNum() const \
{ \
return static_cast<si32>(num); \
return static_cast<si32>(num); \
} \
ENUM_NAME toEnum() const \
constexpr ENUM_NAME toEnum() const \
{ \
return num; \
} \
@@ -108,36 +101,36 @@ template <typename Handler> void serialize(Handler &h, const int version) \
{ \
h & num; \
} \
CLASS_NAME & advance(int i) \
constexpr CLASS_NAME & advance(int i) \
{ \
num = (ENUM_NAME)((int)num + i); \
num = static_cast<ENUM_NAME>(static_cast<int>(num) + i); \
return *this; \
}
// 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) \
STRONG_INLINE constexpr bool operator==(const A & a, const B & b) \
{ \
return AN == BN ; \
} \
STRONG_INLINE bool operator!=(const A & a, const B & b) \
STRONG_INLINE constexpr bool operator!=(const A & a, const B & b) \
{ \
return AN != BN ; \
} \
STRONG_INLINE bool operator<(const A & a, const B & b) \
STRONG_INLINE constexpr bool operator<(const A & a, const B & b) \
{ \
return AN < BN ; \
} \
STRONG_INLINE bool operator<=(const A & a, const B & b) \
STRONG_INLINE constexpr bool operator<=(const A & a, const B & b) \
{ \
return AN <= BN ; \
} \
STRONG_INLINE bool operator>(const A & a, const B & b) \
STRONG_INLINE constexpr bool operator>(const A & a, const B & b) \
{ \
return AN > BN ; \
} \
STRONG_INLINE bool operator>=(const A & a, const B & b) \
STRONG_INLINE constexpr bool operator>=(const A & a, const B & b) \
{ \
return AN >= BN ; \
}
@@ -150,17 +143,13 @@ STRONG_INLINE bool operator>=(const A & a, const B & b) \
#define INSTID_LIKE_CLASS_COMMON(CLASS_NAME, NUMERIC_NAME) \
public: \
CLASS_NAME() : BaseForID<CLASS_NAME, NUMERIC_NAME>(-1) {} \
CLASS_NAME(const CLASS_NAME & other): \
constexpr CLASS_NAME(const CLASS_NAME & other): \
BaseForID<CLASS_NAME, NUMERIC_NAME>(other) \
{ \
} \
CLASS_NAME & operator=(const CLASS_NAME & other) \
{ \
num = other.num; \
return *this; \
} \
explicit CLASS_NAME(si32 id) \
constexpr CLASS_NAME & operator=(const CLASS_NAME & other) = default; \
constexpr CLASS_NAME & operator=(NUMERIC_NAME other) { num = other; return *this; }; \
explicit constexpr CLASS_NAME(si32 id = -1) \
: BaseForID<CLASS_NAME, NUMERIC_NAME>(id) \
{}
@@ -171,13 +160,13 @@ protected:
NumericType num;
public:
NumericType getNum() const
constexpr NumericType getNum() const
{
return num;
}
//to make it more similar to IDLIKE
NumericType toEnum() const
constexpr NumericType toEnum() const
{
return num;
}
@@ -187,26 +176,26 @@ public:
h & num;
}
explicit BaseForID(NumericType _num = -1)
constexpr explicit BaseForID(NumericType _num = -1) :
num(_num)
{
num = _num;
}
void advance(int change)
constexpr void advance(int change)
{
num += change;
}
bool operator == (const BaseForID & b) const { return num == b.num; }
bool operator <= (const BaseForID & b) const { return num <= b.num; }
bool operator >= (const BaseForID & b) const { return num >= b.num; }
bool operator != (const BaseForID & b) const { return num != b.num; }
bool operator < (const BaseForID & b) const { return num < b.num; }
bool operator > (const BaseForID & b) const { return num > b.num; }
constexpr bool operator == (const BaseForID & b) const { return num == b.num; }
constexpr bool operator <= (const BaseForID & b) const { return num <= b.num; }
constexpr bool operator >= (const BaseForID & b) const { return num >= b.num; }
constexpr bool operator != (const BaseForID & b) const { return num != b.num; }
constexpr bool operator < (const BaseForID & b) const { return num < b.num; }
constexpr bool operator > (const BaseForID & b) const { return num > b.num; }
BaseForID & operator++() { ++num; return *this; }
constexpr BaseForID & operator++() { ++num; return *this; }
operator NumericType() const
constexpr operator NumericType() const
{
return num;
}
@@ -223,12 +212,12 @@ private:
NumericType num;
public:
NumericType getNum() const
constexpr NumericType getNum() const
{
return num;
}
EnumType toEnum() const
constexpr EnumType toEnum() const
{
return static_cast<EnumType>(num);
}
@@ -238,42 +227,42 @@ public:
h & num;
}
explicit Identifier(NumericType _num = -1)
constexpr explicit Identifier(NumericType _num = -1)
{
num = _num;
}
/* implicit */ Identifier(EnumType _num)
/* implicit */constexpr Identifier(EnumType _num):
num(static_cast<NumericType>(_num))
{
num = static_cast<NumericType>(_num);
}
void advance(int change)
constexpr void advance(int change)
{
num += change;
}
bool operator == (const Identifier & b) const { return num == b.num; }
bool operator <= (const Identifier & b) const { return num <= b.num; }
bool operator >= (const Identifier & b) const { return num >= b.num; }
bool operator != (const Identifier & b) const { return num != b.num; }
bool operator < (const Identifier & b) const { return num < b.num; }
bool operator > (const Identifier & b) const { return num > b.num; }
constexpr bool operator == (const Identifier & b) const { return num == b.num; }
constexpr bool operator <= (const Identifier & b) const { return num <= b.num; }
constexpr bool operator >= (const Identifier & b) const { return num >= b.num; }
constexpr bool operator != (const Identifier & b) const { return num != b.num; }
constexpr bool operator < (const Identifier & b) const { return num < b.num; }
constexpr bool operator > (const Identifier & b) const { return num > b.num; }
Identifier & operator++()
constexpr Identifier & operator++()
{
++num;
return *this;
}
Identifier operator++(int)
constexpr Identifier operator++(int)
{
Identifier ret(*this);
++num;
return ret;
}
operator NumericType() const
constexpr operator NumericType() const
{
return num;
}
@@ -449,7 +438,7 @@ namespace ETownType//deprecated
};
}
class FactionID : public BaseForID<FactionID, si32>
class FactionID : public BaseForID<FactionID, int32_t>
{
INSTID_LIKE_CLASS_COMMON(FactionID, si32)