diff options
-rw-r--r-- | src/server/game/Entities/Object/Updates/UpdateFields.cpp | 12 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Updates/UpdateMask.h | 71 |
2 files changed, 38 insertions, 45 deletions
diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp index 924820bd8ce..aae6e1dd1e9 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp @@ -325,7 +325,7 @@ void ItemData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi void ItemData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) - allowedMaskForTarget |= { 0x07F58D80u, 0x00000000u }; + allowedMaskForTarget |= std::array<uint32, 2>{ 0x07F58D80u, 0x00000000u }; } void ItemData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) @@ -707,7 +707,7 @@ void AzeriteItemData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fi void AzeriteItemData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) - allowedMaskForTarget |= { 0x000003E2u }; + allowedMaskForTarget |= std::array<uint32, 1>{ 0x000003E2u }; } void AzeriteItemData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) @@ -1145,11 +1145,11 @@ void UnitData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi void UnitData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) - allowedMaskForTarget |= { 0x00002000u, 0x0F004000u, 0xFFF08000u, 0x000000FEu, 0xFF800004u, 0xFFFC07FFu, 0x01FFFFFFu }; + allowedMaskForTarget |= std::array<uint32, 7>{ 0x00002000u, 0x0F004000u, 0xFFF08000u, 0x000000FEu, 0xFF800004u, 0xFFFC07FFu, 0x01FFFFFFu }; if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::UnitAll)) - allowedMaskForTarget |= { 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFF800004u, 0x000007FFu, 0x00000000u }; + allowedMaskForTarget |= std::array<uint32, 7>{ 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFF800004u, 0x000007FFu, 0x00000000u }; if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Empath)) - allowedMaskForTarget |= { 0x00000000u, 0x0F000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x000007F8u }; + allowedMaskForTarget |= std::array<uint32, 7>{ 0x00000000u, 0x0F000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x000007F8u }; } void UnitData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) @@ -2394,7 +2394,7 @@ void PlayerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi void PlayerData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::PartyMember)) - allowedMaskForTarget |= { 0x00000022u, 0xFFFE0000u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000001u, 0x00000000u, 0x00000000u }; + allowedMaskForTarget |= std::array<uint32, 10>{ 0x00000022u, 0xFFFE0000u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000001u, 0x00000000u, 0x00000000u }; } void PlayerData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) diff --git a/src/server/game/Entities/Object/Updates/UpdateMask.h b/src/server/game/Entities/Object/Updates/UpdateMask.h index 68dae2674d9..b8262387907 100644 --- a/src/server/game/Entities/Object/Updates/UpdateMask.h +++ b/src/server/game/Entities/Object/Updates/UpdateMask.h @@ -20,6 +20,7 @@ #include "Define.h" #include <algorithm> +#include <cstring> // std::memset namespace UpdateMaskHelpers { @@ -34,77 +35,82 @@ public: static constexpr uint32 BlockCount = (Bits + 31) / 32; static constexpr uint32 BlocksMaskCount = (BlockCount + 31) / 32; - UpdateMask() + constexpr UpdateMask() : _blocksMask(), _blocks() { - std::fill(std::begin(_blocksMask), std::end(_blocksMask), 0); - std::fill(std::begin(_blocks), std::end(_blocks), 0); } - UpdateMask(std::initializer_list<uint32> init) + constexpr UpdateMask(std::array<uint32, BlockCount> const& init) { - InitFromBlocks(init.begin(), init.size()); + _blocksMask.back() = 0; // only last value of blocksMask will not be written fully + for (uint32 block = 0; block < BlockCount; ++block) + { + if ((_blocks[block] = init[block]) != 0) + _blocksMask[UpdateMaskHelpers::GetBlockIndex(block)] |= UpdateMaskHelpers::GetBlockFlag(block); + else + _blocksMask[UpdateMaskHelpers::GetBlockIndex(block)] &= ~UpdateMaskHelpers::GetBlockFlag(block); + } } - uint32 GetBlocksMask(uint32 index) const + constexpr uint32 GetBlocksMask(uint32 index) const { return _blocksMask[index]; } - uint32 GetBlock(uint32 index) const + constexpr uint32 GetBlock(uint32 index) const { return _blocks[index]; } - bool operator[](uint32 index) const + constexpr bool operator[](uint32 index) const { return (_blocks[index / 32] & (1 << (index % 32))) != 0; } - bool IsAnySet() const + constexpr bool IsAnySet() const { - return std::any_of(std::begin(_blocksMask), std::end(_blocksMask), [](uint32 blockMask) + return std::ranges::any_of(_blocksMask, [](uint32 blockMask) { return blockMask != 0; }); } - void Reset(uint32 index) + constexpr void Reset(uint32 index) { std::size_t blockIndex = UpdateMaskHelpers::GetBlockIndex(index); if (!(_blocks[blockIndex] &= ~UpdateMaskHelpers::GetBlockFlag(index))) _blocksMask[UpdateMaskHelpers::GetBlockIndex(blockIndex)] &= ~UpdateMaskHelpers::GetBlockFlag(blockIndex); } - void ResetAll() + constexpr void ResetAll() { - std::fill(std::begin(_blocksMask), std::end(_blocksMask), 0); - std::fill(std::begin(_blocks), std::end(_blocks), 0); + _blocksMask = { }; + _blocks = { }; } - void Set(uint32 index) + constexpr void Set(uint32 index) { std::size_t blockIndex = UpdateMaskHelpers::GetBlockIndex(index); _blocks[blockIndex] |= UpdateMaskHelpers::GetBlockFlag(index); _blocksMask[UpdateMaskHelpers::GetBlockIndex(blockIndex)] |= UpdateMaskHelpers::GetBlockFlag(blockIndex); } - void SetAll() + constexpr void SetAll() { - std::fill(std::begin(_blocksMask), std::end(_blocksMask), 0xFFFFFFFF); - if (BlocksMaskCount % 32) + std::memset(_blocksMask.data(), 0xFF, _blocksMask.size() * sizeof(typename decltype(_blocksMask)::value_type)); + if constexpr (BlocksMaskCount % 32) { constexpr uint32 unused = 32 - (BlocksMaskCount % 32); - _blocksMask[BlocksMaskCount - 1] &= (0xFFFFFFFF >> unused); + _blocksMask.back() &= (0xFFFFFFFF >> unused); } - std::fill(std::begin(_blocks), std::end(_blocks), 0xFFFFFFFF); - if (BlockCount % 32) + std::memset(_blocks.data(), 0xFF, _blocks.size() * sizeof(typename decltype(_blocks)::value_type)); + if constexpr (BlockCount % 32) { constexpr uint32 unused = 32 - (BlockCount % 32); - _blocks[BlockCount - 1] &= (0xFFFFFFFF >> unused); + _blocks.back() &= (0xFFFFFFFF >> unused); } } - UpdateMask& operator&=(UpdateMask const& right) + constexpr UpdateMask& operator&=(UpdateMask const& right) { for (uint32 i = 0; i < BlocksMaskCount; ++i) _blocksMask[i] &= right._blocksMask[i]; @@ -116,7 +122,7 @@ public: return *this; } - UpdateMask& operator|=(UpdateMask const& right) + constexpr UpdateMask& operator|=(UpdateMask const& right) { for (std::size_t i = 0; i < BlocksMaskCount; ++i) _blocksMask[i] |= right._blocksMask[i]; @@ -128,21 +134,8 @@ public: } private: - void InitFromBlocks(uint32 const* input, uint32 size) - { - std::fill(std::begin(_blocksMask), std::end(_blocksMask), 0); - - uint32 block = 0; - for (; block < size; ++block) - if ((_blocks[block] = input[block]) != 0) - _blocksMask[UpdateMaskHelpers::GetBlockIndex(block)] |= UpdateMaskHelpers::GetBlockFlag(block); - - for (; block < BlockCount; ++block) - _blocks[block] = 0; - } - - uint32 _blocksMask[BlocksMaskCount]; - uint32 _blocks[BlockCount]; + std::array<uint32, BlocksMaskCount> _blocksMask; + std::array<uint32, BlockCount> _blocks; }; template<uint32 Bits> |