Core/PacketIO: Constexpr-ify UpdateMask
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user