TrinityCore
Loading...
Searching...
No Matches
UpdateMask.h
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#ifndef __UPDATEMASK_H
19#define __UPDATEMASK_H
20
21#include "UpdateFields.h"
22#include "ByteBuffer.h"
23#include "Errors.h"
24
26{
27public:
28 UpdateMask() : _bits(nullptr), _fieldCount(0) { }
29
30 void SetBit(uint32 index)
31 {
32 _bits[index] = 1;
33 }
34
35 void UnsetBit(uint32 index)
36 {
37 _bits[index] = 0;
38 }
39
40 bool GetBit(uint32 index) const
41 {
42 return _bits[index] != 0;
43 }
44
45 void SetCount(uint32 valuesCount)
46 {
47 _bits = std::make_unique<uint8[]>(valuesCount);
48 std::uninitialized_fill_n(&_bits[0], valuesCount, 0);
49 _fieldCount = valuesCount;
50 }
51
52 void Clear()
53 {
54 if (_bits)
55 std::fill_n(&_bits[0], _fieldCount, 0);
56 }
57
58private:
59 std::unique_ptr<uint8[]> _bits;
61};
62
64{
65public:
68
73
74 explicit UpdateMaskPacketBuilder(uint32 valuesCount) : _lastSetBit(0)
75 {
76 std::size_t blockCount = CalculateBlockCount(valuesCount);
77 _mask = std::make_unique<ClientUpdateMaskType[]>(blockCount);
78 std::uninitialized_fill_n(&_mask[0], blockCount, 0);
79 }
80
81 void SetBit(uint32 bit)
82 {
83 _mask[GetBlockIndex(bit)] |= GetBlockFlag(bit);
84 _lastSetBit = bit;
85 }
86
88 {
89 uint8 blockCount = CalculateBlockCount(_lastSetBit + 1);
90 *data << uint8(blockCount);
91 if (blockCount)
92 data->append(&_mask[0], blockCount);
93 }
94
95private:
96 static constexpr uint8 CalculateBlockCount(uint32 fieldCount)
97 {
98 return (fieldCount + CLIENT_UPDATE_MASK_BITS - 1) / CLIENT_UPDATE_MASK_BITS;
99 }
100
101 static constexpr std::size_t GetBlockIndex(uint32 bit)
102 {
103 return bit / 32;
104 }
105
106 static constexpr uint32 GetBlockFlag(uint32 bit)
107 {
108 return 1u << (bit % 32);
109 }
110
111 std::unique_ptr<ClientUpdateMaskType[]> _mask;
113};
114
115#endif
uint8_t uint8
Definition Define.h:135
uint32_t uint32
Definition Define.h:133
void append(T value)
Definition ByteBuffer.h:129
static constexpr std::size_t GetBlockIndex(uint32 bit)
Definition UpdateMask.h:101
void SetBit(uint32 bit)
Definition UpdateMask.h:81
UpdateMaskPacketBuilder(uint32 valuesCount)
Definition UpdateMask.h:74
std::unique_ptr< ClientUpdateMaskType[]> _mask
Definition UpdateMask.h:111
static constexpr uint32 GetBlockFlag(uint32 bit)
Definition UpdateMask.h:106
uint32 ClientUpdateMaskType
Type representing how client reads update mask.
Definition UpdateMask.h:67
static constexpr uint8 CalculateBlockCount(uint32 fieldCount)
Definition UpdateMask.h:96
void AppendToPacket(ByteBuffer *data)
Definition UpdateMask.h:87
void Clear()
Definition UpdateMask.h:52
bool GetBit(uint32 index) const
Definition UpdateMask.h:40
uint32 _fieldCount
Definition UpdateMask.h:60
void UnsetBit(uint32 index)
Definition UpdateMask.h:35
void SetCount(uint32 valuesCount)
Definition UpdateMask.h:45
std::unique_ptr< uint8[]> _bits
Definition UpdateMask.h:59
void SetBit(uint32 index)
Definition UpdateMask.h:30