Core/PacketIO: Constexpr-ify UpdateMask

This commit is contained in:
Shauren
2024-05-28 12:41:10 +02:00
parent 1c3268155d
commit 0dc38ec722
2 changed files with 38 additions and 45 deletions
@@ -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)
@@ -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>