gwnavruntime/containers/bitfield.h Source File

bitfield.h
Go to the documentation of this file.
1 /*
2 * Copyright 2016 Autodesk, Inc. All rights reserved.
3 * Use of this software is subject to the terms of the Autodesk license agreement and any attachments or Appendices thereto provided at the time of installation or download,
4 * or which otherwise accompanies this software in either electronic or hard copy form, or which is signed by you and accepted by Autodesk.
5 */
6 
7 #pragma once
8 
11 
12 namespace Kaim
13 {
14 
15 class BitFieldBlob;
16 
17 class BitFieldBase
18 {
19  KY_DEFINE_NEW_DELETE_OPERATORS(Stat_Default_Mem)
20 public:
21 
22  BitFieldBase() : m_words(nullptr), m_wordsCapacity(0), m_bitsCount(0) {}
23  ~BitFieldBase() { KY_FREE(m_words); }
24 
25  KyUInt32 GetCount() const;
26 
27  void SetBit(KyUInt32 bitIndex);
28  void UnsetBit(KyUInt32 bitIndex);
29  bool IsBitSet(KyUInt32 bitIndex) const;
30 
31  void UnsetAllBits();
32  void SetAllBits();
33 
34  // bitValue must be 0 or 1
35  void SetBitValue(KyUInt32 bitIndex, KyUInt32 bitValue);
36  void SetBitValue(KyUInt32 bitIndex, bool bitValue);
37 
38  // return 0 or 1
39  KyUInt32 GetBitValue(KyUInt32 bitIndex) const;
40 
41  void Clear(); // frees memory !
42 
43 protected:
44  void Resize_(KyUInt32 newBitsCount, int memStat, MemoryHeap* heap = nullptr);
45  void Reserve_(KyUInt32 newBitsCount, int memStat, MemoryHeap* heap = nullptr);
46  void InitFromBlob_(const BitFieldBlob& bitFieldBlob, int memStat, MemoryHeap* heap = nullptr);
47 private:
48  KyUInt32 Word(KyUInt32 bitIndex) const;
49  KyUInt32& Word(KyUInt32 bitIndex) ;
50 
51 private:
52  friend class BitFieldBlob;
53  friend class BitFieldBlobBuilder;
54 
55  KyUInt32* m_words;
56  KyUInt32 m_wordsCapacity;
57  KyUInt32 m_bitsCount;
58 };
59 
60 
61 template<int SID>
62 class BitFieldMemStat : public BitFieldBase
63 {
65 public:
66  KY_INLINE explicit BitFieldMemStat() : BitFieldBase() {}
67  KY_INLINE explicit BitFieldMemStat(KyUInt32 newBitsCount) { Resize_(newBitsCount, SID); }
68  KY_INLINE void Resize(KyUInt32 newBitsCount) { Resize_(newBitsCount, SID); }
69  KY_INLINE void Reserve(KyUInt32 newBitsCount) { Reserve_(newBitsCount, SID); }
70  KY_INLINE void InitFromBlob(const BitFieldBlob& bitFieldBlob) { InitFromBlob_(bitFieldBlob, SID); }
71 };
72 
73 typedef BitFieldMemStat<Stat_Default_Mem> BitField;
74 
75 
76 
77 KY_INLINE void BitFieldBase::SetBitValue(KyUInt32 bitIndex, KyUInt32 bitValue) { bitValue == 0 ? UnsetBit(bitIndex) : SetBit(bitIndex); }
78 KY_INLINE void BitFieldBase::SetBitValue(KyUInt32 bitIndex, bool bitValue) { bitValue == false ? UnsetBit(bitIndex) : SetBit(bitIndex); }
79 KY_INLINE KyUInt32 BitFieldBase::GetBitValue(KyUInt32 bitIndex) const { return (Word(bitIndex) >> BitFieldUtils::GetBitIndexInWord(bitIndex)) & 0x00000001; }
80 
81 KY_INLINE void BitFieldBase::SetBit(KyUInt32 bitIndex) { BitFieldUtils::SetBit(m_words, bitIndex); }
82 KY_INLINE void BitFieldBase::UnsetBit(KyUInt32 bitIndex) { BitFieldUtils::UnsetBit(m_words, bitIndex); }
83 KY_INLINE bool BitFieldBase::IsBitSet(KyUInt32 bitIndex) const { return BitFieldUtils::IsBitSet(m_words , bitIndex); }
84 KY_INLINE KyUInt32 BitFieldBase::GetCount() const { return m_bitsCount; }
85 
86 KY_INLINE KyUInt32 BitFieldBase::Word(KyUInt32 bitIndex) const { return m_words[BitFieldUtils::GetWordIndex(bitIndex)]; }
87 KY_INLINE KyUInt32& BitFieldBase::Word(KyUInt32 bitIndex) { return m_words[BitFieldUtils::GetWordIndex(bitIndex)]; }
88 
89 } // Kaim
90 
std::uint32_t KyUInt32
uint32_t
Definition: types.h:29
#define KY_DEFINE_NEW_DELETE_OPERATORS(MemStat)
This macro defines new and delete operators.
Definition: memory.h:132
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17