From 1d5696a08bd5afae366b36d257aa06c465a980f2 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 13 Aug 2022 19:34:15 +0200 Subject: [PATCH] Core/Misc: Refactor some updatefield constant creation code to work around msvc internal compiler errors --- .../game/Entities/Object/Updates/UpdateField.h | 18 +++++++++++++++--- src/server/game/Entities/Player/Player.h | 14 +++++++------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/server/game/Entities/Object/Updates/UpdateField.h b/src/server/game/Entities/Object/Updates/UpdateField.h index 9c2eebb82af..0c8266b9cf0 100644 --- a/src/server/game/Entities/Object/Updates/UpdateField.h +++ b/src/server/game/Entities/Object/Updates/UpdateField.h @@ -726,7 +726,7 @@ namespace UF { }; - template + template class UpdateFieldArrayBase : public UpdateFieldArrayBaseWithoutSize { template @@ -740,7 +740,6 @@ namespace UF public: using value_type = T; - static constexpr std::size_t Size = Size_; T const* begin() const { @@ -752,7 +751,7 @@ namespace UF return std::end(_values); } - constexpr std::size_t size() const + static constexpr std::size_t size() { return Size; } @@ -766,6 +765,19 @@ namespace UF T _values[Size] = {}; }; + // workaround functions for internal compiler errors in msvc 19.33.31629 + template + constexpr std::size_t size() + { + return T::size(); + } + + template + constexpr std::size_t size_of_value_type() + { + return sizeof(typename T::value_type); + } + template class UpdateFieldArray : public UpdateFieldArrayBase { diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index d0b57e446ae..40567b8533b 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -124,13 +124,13 @@ typedef std::deque PlayerMails; enum PlayerSkillsConstants { - PLAYER_MAX_SKILLS = decltype(UF::SkillInfo::SkillLineID)::Size + PLAYER_MAX_SKILLS = UF::size() }; enum PlayerExplorationConstants { - PLAYER_EXPLORED_ZONES_SIZE = decltype(UF::ActivePlayerData::ExploredZones)::Size, - PLAYER_EXPLORED_ZONES_BITS = sizeof(decltype(UF::ActivePlayerData::ExploredZones)::value_type) * 8 + PLAYER_EXPLORED_ZONES_SIZE = UF::size(), + PLAYER_EXPLORED_ZONES_BITS = UF::size_of_value_type() * 8 }; enum SpellModType : uint8 @@ -586,13 +586,13 @@ typedef std::map QuestStatusSaveMap; // Size of client completed quests bit map enum PlayerQuestCompletedConstants { - QUESTS_COMPLETED_BITS_SIZE = decltype(UF::ActivePlayerData::QuestCompleted)::Size, - QUESTS_COMPLETED_BITS_PER_BLOCK = sizeof(decltype(UF::ActivePlayerData::QuestCompleted)::value_type) * 8 + QUESTS_COMPLETED_BITS_SIZE = UF::size(), + QUESTS_COMPLETED_BITS_PER_BLOCK = UF::size_of_value_type() * 8 }; enum PlayerQuestLogConstants { - MAX_QUEST_COUNTS = decltype(UF::QuestLog::ObjectiveProgress)::Size + MAX_QUEST_COUNTS = UF::size() }; enum QuestSlotStateMask @@ -635,7 +635,7 @@ enum PlayerSlots PLAYER_SLOTS_COUNT = (PLAYER_SLOT_END - PLAYER_SLOT_START) }; -static_assert(decltype(UF::ActivePlayerData::InvSlots)::Size == PLAYER_SLOT_END); +static_assert(UF::size() == PLAYER_SLOT_END); #define INVENTORY_SLOT_BAG_0 255 #define INVENTORY_DEFAULT_SIZE 16