gwnavruntime/containers/bitfield.h Source File

bitfield.h
Go to the documentation of this file.
1 /*
2 * Copyright 2015 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 #ifndef Navigation_BitField_H
8 #define Navigation_BitField_H
9 
12 
13 namespace Kaim
14 {
15 
16 class BitFieldBlob;
17 
18 class BitFieldBase
19 {
20  KY_DEFINE_NEW_DELETE_OPERATORS(Stat_Default_Mem)
21 public:
22 
23  BitFieldBase() : m_words(KY_NULL), m_wordsCapacity(0), m_bitsCount(0) {}
24  ~BitFieldBase() { KY_FREE(m_words); }
25 
26  KyUInt32 GetCount() const;
27 
28  void SetBit(KyUInt32 bitIndex);
29  void UnsetBit(KyUInt32 bitIndex);
30  bool IsBitSet(KyUInt32 bitIndex) const;
31 
32  void UnsetAllBits();
33  void SetAllBits();
34 
35  // bitValue must be 0 or 1
36  void SetBitValue(KyUInt32 bitIndex, KyUInt32 bitValue);
37  void SetBitValue(KyUInt32 bitIndex, bool bitValue);
38 
39  // return 0 or 1
40  KyUInt32 GetBitValue(KyUInt32 bitIndex) const;
41 
42  void Clear(); // frees memory !
43 
44 protected:
45  void Resize_(KyUInt32 newBitsCount, int memStat, MemoryHeap* heap = KY_NULL);
46  void Reserve_(KyUInt32 newBitsCount, int memStat, MemoryHeap* heap = KY_NULL);
47  void InitFromBlob_(const BitFieldBlob& bitFieldBlob, int memStat, MemoryHeap* heap = KY_NULL);
48 private:
49  KyUInt32 Word(KyUInt32 bitIndex) const;
50  KyUInt32& Word(KyUInt32 bitIndex) ;
51 
52 private:
53  friend class BitFieldBlob;
54  friend class BitFieldBlobBuilder;
55 
56  KyUInt32* m_words;
57  KyUInt32 m_wordsCapacity;
58  KyUInt32 m_bitsCount;
59 };
60 
61 
62 template<int SID>
63 class BitFieldMemStat : public BitFieldBase
64 {
66 public:
67  KY_INLINE explicit BitFieldMemStat() : BitFieldBase() {}
68  KY_INLINE explicit BitFieldMemStat(KyUInt32 newBitsCount) { Resize_(newBitsCount, SID); }
69  KY_INLINE void Resize(KyUInt32 newBitsCount) { Resize_(newBitsCount, SID); }
70  KY_INLINE void Reserve(KyUInt32 newBitsCount) { Reserve_(newBitsCount, SID); }
71  KY_INLINE void InitFromBlob(const BitFieldBlob& bitFieldBlob) { InitFromBlob_(bitFieldBlob, SID); }
72 };
73 
74 typedef BitFieldMemStat<Stat_Default_Mem> BitField;
75 
76 
77 
78 KY_INLINE void BitFieldBase::SetBitValue(KyUInt32 bitIndex, KyUInt32 bitValue) { bitValue == 0 ? UnsetBit(bitIndex) : SetBit(bitIndex); }
79 KY_INLINE void BitFieldBase::SetBitValue(KyUInt32 bitIndex, bool bitValue) { bitValue == false ? UnsetBit(bitIndex) : SetBit(bitIndex); }
80 KY_INLINE KyUInt32 BitFieldBase::GetBitValue(KyUInt32 bitIndex) const { return (Word(bitIndex) >> BitFieldUtils::GetBitIndexInWord(bitIndex)) & 0x00000001; }
81 
82 KY_INLINE void BitFieldBase::SetBit(KyUInt32 bitIndex) { BitFieldUtils::SetBit(m_words, bitIndex); }
83 KY_INLINE void BitFieldBase::UnsetBit(KyUInt32 bitIndex) { BitFieldUtils::UnsetBit(m_words, bitIndex); }
84 KY_INLINE bool BitFieldBase::IsBitSet(KyUInt32 bitIndex) const { return BitFieldUtils::IsBitSet(m_words , bitIndex); }
85 KY_INLINE KyUInt32 BitFieldBase::GetCount() const { return m_bitsCount; }
86 
87 KY_INLINE KyUInt32 BitFieldBase::Word(KyUInt32 bitIndex) const { return m_words[BitFieldUtils::GetWordIndex(bitIndex)]; }
88 KY_INLINE KyUInt32& BitFieldBase::Word(KyUInt32 bitIndex) { return m_words[BitFieldUtils::GetWordIndex(bitIndex)]; }
89 
90 } // Kaim
91 
92 #endif // Navigation_BitField_H
#define KY_NULL
Null value.
Definition: types.h:247
Definition: gamekitcrowddispersion.h:20
#define KY_DEFINE_NEW_DELETE_OPERATORS(MemStat)
This macro defines new and delete operators.
Definition: memory.h:137
unsigned int KyUInt32
Type used internally to represent an unsigned 32-bit integer.
Definition: types.h:36