1#ifndef NW_G3D_UT_FLAG_H_
2#define NW_G3D_UT_FLAG_H_
4#include <nw/g3d/g3d_config.h>
6#define NW_G3D_FLAG_DECLARE(mbit, mname)
7 FLAG_##mname##_SHIFT = (mbit),
8 FLAG_##mname = 0x1
<< (mbit)
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))
14#define NW_G3D_GET_FLAG_VALUE(mflags, mname, mtype)
15 GetFlagValue<mtype>((mflags), (FLAG_##mname##_VALUE_SHIFT), (FLAG_##mname##_VALUE_MASK))
17#define NW_G3D_SET_FLAG_VALUE(mflags, mname, mval)
18 ((mflags) = SetFlagValue(
19 (mflags), (FLAG_##mname##_VALUE_SHIFT), (FLAG_##mname##_VALUE_MASK), (mval)))
21namespace nw {
namespace g3d {
namespace ut {
23template<
typename TFlags,
typename TMask,
typename TCheck>
25bool CheckFlag(TFlags flags, TMask mask, TCheck check)
27 return (flags &
static_cast<TFlags>(mask)) ==
static_cast<TFlags>(check);
30template<
typename TFlags,
typename TMask>
34 return CheckFlag(flags, mask, mask);
37template<
typename TFlags,
typename TMask,
typename TValue>
41 return (value << shift) &
static_cast<TFlags>(mask);
44template<
typename TResult,
typename TFlags,
typename TMask>
48 return static_cast<TResult>((flags &
static_cast<TFlags>(mask)) >> shift);
51template<
typename TFlags,
typename TMask,
typename TValue>
53TFlags
SetFlagValue(TFlags flags,
int shift, TMask mask, TValue value)
55 return (flags & ~(
static_cast<TFlags>(mask))) | ((value << shift) &
static_cast<TFlags>(mask));
58template<
typename TFlags,
typename TMask>
62 return (flags & ~(
static_cast<TFlags>(mask))) | ((~flags) &
static_cast<TFlags>(mask));
65template<
typename TValue>
70 NW_G3D_ASSERT((
static_cast<bit32>(value) & (~bit32(0x1))) == 0);
71 int numWord = ((count + 0x1F) >> 5);
74 for (
int idxWord = 0; idxWord < numWord; ++idxWord)
76 pBitArray[idxWord] = ~
bit32(0);
81 for (
int idxWord = 0; idxWord < numWord; ++idxWord)
83 pBitArray[idxWord] = 0;
88template<
typename TResult>
90TResult
IsBitOn(
const bit32* pBitArray,
int wordIndex,
int bitIndex)
93 return static_cast<TResult>((pBitArray[wordIndex] >> bitIndex) & 0x1u);
96template<
typename TResult>
100 return IsBitOn<TResult>(pBitArray, index >> 5, index & 0x1F);
103template<
typename TValue>
105void SetBit(
bit32* pBitArray,
int wordIndex,
int bitIndex, TValue value)
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;
114template<
typename TValue>
118 SetBit(pBitArray, index >> 5, index & 0x1F, value);
#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