aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.cpp12
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateMask.h71
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>