NW4F G3d
Loading...
Searching...
No Matches
g3d_Flag.h
Go to the documentation of this file.
1#ifndef NW_G3D_UT_FLAG_H_
2#define NW_G3D_UT_FLAG_H_
3
4#include <nw/g3d/g3d_config.h>
5
6#define NW_G3D_FLAG_DECLARE(mbit, mname)
7 FLAG_##mname##_SHIFT = (mbit),
8 FLAG_##mname = 0x1 << (mbit)
9
10#define NW_G3D_FLAG_VALUE_DECLARE(mbit, msize, mname)
11 FLAG_##mname##_VALUE_SHIFT = (mbit),
12 FLAG_##mname##_VALUE_MASK = (((0x1ul << (msize)) - 1) << (mbit))
13
14#define NW_G3D_GET_FLAG_VALUE(mflags, mname, mtype)
15 GetFlagValue<mtype>((mflags), (FLAG_##mname##_VALUE_SHIFT), (FLAG_##mname##_VALUE_MASK))
16
17#define NW_G3D_SET_FLAG_VALUE(mflags, mname, mval)
18 ((mflags) = SetFlagValue(
19 (mflags), (FLAG_##mname##_VALUE_SHIFT), (FLAG_##mname##_VALUE_MASK), (mval)))
20
21namespace nw { namespace g3d { namespace ut {
22
23template<typename TFlags, typename TMask, typename TCheck>
25bool CheckFlag(TFlags flags, TMask mask, TCheck check)
26{
27 return (flags & static_cast<TFlags>(mask)) == static_cast<TFlags>(check);
28}
29
30template<typename TFlags, typename TMask>
32bool CheckFlag(TFlags flags, TMask mask)
33{
34 return CheckFlag(flags, mask, mask);
35}
36
37template<typename TFlags, typename TMask, typename TValue>
39TFlags CreateFlagValue(TValue value, int shift, TMask mask)
40{
41 return (value << shift) & static_cast<TFlags>(mask);
42}
43
44template<typename TResult, typename TFlags, typename TMask>
46TResult GetFlagValue(TFlags flags, int shift, TMask mask)
47{
48 return static_cast<TResult>((flags & static_cast<TFlags>(mask)) >> shift);
49}
50
51template<typename TFlags, typename TMask, typename TValue>
53TFlags SetFlagValue(TFlags flags, int shift, TMask mask, TValue value)
54{
55 return (flags & ~(static_cast<TFlags>(mask))) | ((value << shift) & static_cast<TFlags>(mask));
56}
57
58template<typename TFlags, typename TMask>
60TFlags InvertFlag(TFlags flags, TMask mask)
61{
62 return (flags & ~(static_cast<TFlags>(mask))) | ((~flags) & static_cast<TFlags>(mask));
63}
64
65template<typename TValue>
67void FillBits(bit32* pBitArray, int count, TValue value)
68{
69 NW_G3D_ASSERT(count == 0 || pBitArray);
70 NW_G3D_ASSERT((static_cast<bit32>(value) & (~bit32(0x1))) == 0);
71 int numWord = ((count + 0x1F) >> 5);
72 if (value)
73 {
74 for (int idxWord = 0; idxWord < numWord; ++idxWord)
75 {
76 pBitArray[idxWord] = ~bit32(0);
77 }
78 }
79 else
80 {
81 for (int idxWord = 0; idxWord < numWord; ++idxWord)
82 {
83 pBitArray[idxWord] = 0;
84 }
85 }
86}
87
88template<typename TResult>
90TResult IsBitOn(const bit32* pBitArray, int wordIndex, int bitIndex)
91{
92 NW_G3D_ASSERT((bitIndex & ~0x1F) == 0);
93 return static_cast<TResult>((pBitArray[wordIndex] >> bitIndex) & 0x1u);
94}
95
96template<typename TResult>
98TResult IsBitOn(const bit32* pBitArray, int index)
99{
100 return IsBitOn<TResult>(pBitArray, index >> 5, index & 0x1F);
101}
102
103template<typename TValue>
105void SetBit(bit32* pBitArray, int wordIndex, int bitIndex, TValue value)
106{
107 NW_G3D_ASSERT((bitIndex & ~0x1F) == 0);
108 NW_G3D_ASSERT((static_cast<bit32>(value) & (~bit32(0x1))) == 0);
109 bit32& word = pBitArray[wordIndex];
110 word &= ~(0x1u << bitIndex);
111 word |= static_cast<bit32>(value) << bitIndex;
112}
113
114template<typename TValue>
116void SetBit(bit32* pBitArray, int index, TValue value)
117{
118 SetBit(pBitArray, index >> 5, index & 0x1F, value);
119}
120
121} } } // namespace nw::g3d::ut
122
123#endif // NW_G3D_UT_FLAG_H_
#define NW_G3D_ASSERT(exp)
Definition g3d_assert.h:17
#define NW_G3D_INLINE
Definition g3d_defs.h:68
u32 bit32
Definition g3d_defs.h:131
Definition g3d_Inlines.h:8
NW_G3D_INLINE void SetBit(bit32 *pBitArray, int wordIndex, int bitIndex, TValue value)
Definition g3d_Flag.h:105
NW_G3D_INLINE TFlags InvertFlag(TFlags flags, TMask mask)
Definition g3d_Flag.h:60
NW_G3D_INLINE TFlags SetFlagValue(TFlags flags, int shift, TMask mask, TValue value)
Definition g3d_Flag.h:53
NW_G3D_INLINE TFlags CreateFlagValue(TValue value, int shift, TMask mask)
Definition g3d_Flag.h:39
NW_G3D_INLINE void FillBits(bit32 *pBitArray, int count, TValue value)
Definition g3d_Flag.h:67
NW_G3D_INLINE void SetBit(bit32 *pBitArray, int index, TValue value)
Definition g3d_Flag.h:116
NW_G3D_INLINE bool CheckFlag(TFlags flags, TMask mask, TCheck check)
Definition g3d_Flag.h:25
NW_G3D_INLINE bool CheckFlag(TFlags flags, TMask mask)
Definition g3d_Flag.h:32
NW_G3D_INLINE TResult IsBitOn(const bit32 *pBitArray, int index)
Definition g3d_Flag.h:98
NW_G3D_INLINE TResult IsBitOn(const bit32 *pBitArray, int wordIndex, int bitIndex)
Definition g3d_Flag.h:90
NW_G3D_INLINE TResult GetFlagValue(TFlags flags, int shift, TMask mask)
Definition g3d_Flag.h:46
Definition g3d_GfxManage.cpp:10