sead
Loading...
Searching...
No Matches
seadBitFlag.h
Go to the documentation of this file.
1#ifndef SEAD_BIT_FLAG_H_
2#define SEAD_BIT_FLAG_H_
3
4#include <basis/seadAssert.h>
5#include <basis/seadTypes.h>
6
7namespace sead {
8
10{
11public:
12 static s32 countOnBit(u32 x);
13
15 {
16 return countOnBit((x & -x) - 1);
17 }
18
19 static s32 countRightOnBit(u32 x, s32 bit);
20 static s32 findOnBitFromRight(u32 x, s32 num);
21
22 static s32 countOnBit64(u64 x)
23 {
24 return countOnBit(static_cast<u32>(x)) + countOnBit(static_cast<u32>(x >> 32));
25 }
26
28 {
29 return countOnBit64((x & -x) - 1);
30 }
31
32 static s32 countRightOnBit64(u64 x, s32 bit);
33 static s32 findOnBitFromRight64(u64 x, s32 num);
34};
35
36template <typename T>
38{
39public:
41 : mBits(0)
42 {
43 }
44
45 explicit BitFlag(T t)
46 : mBits(t)
47 {
48 }
49
50 operator T() const { return mBits; }
51
52 void makeAllZero() { mBits = 0; }
53 void makeAllOne() { mBits = T(-1); }
54
55 void setDirect(T bits) { mBits = bits; }
56 T getDirect() const { return mBits; }
57 T* getPtr() { return &mBits; }
58 const T* getPtr() const { return &mBits; }
59 size_t getByteSize() const { return sizeof(T); }
60
61 void set(T mask) { mBits |= mask; }
62 void reset(T mask) { mBits &= ~mask; }
63 void toggle(T mask) { mBits ^= mask; }
64 void change(T mask, bool b) { b ? set(mask) : reset(mask); }
65
66 bool isZero() const { return mBits == 0; }
67 bool isOn(T mask) const { return (mBits & mask) != 0; }
68 bool isOnAll(T mask) const { return (mBits & mask) == mask; }
69 bool isOff(T mask) const { return !isOn(mask); }
70
71 T getMask(T mask) const { return mBits & mask; }
72
73 static T makeMask(s32 bit)
74 {
75 SEAD_ASSERT(static_cast<u32>(bit) < sizeof(T)*8);
76 return T(1) << bit;
77 }
78
79 void setBit(s32 bit) { set(makeMask(bit)); }
80 void resetBit(s32 bit) { reset(makeMask(bit)); }
81 void changeBit(s32 bit, bool b) { change(makeMask(bit), b); }
82 void toggleBit(s32 bit) { toggle(makeMask(bit)); }
83
84 bool isOnBit(s32 bit) const { return isOn(makeMask(bit)); }
85 bool isOffBit(s32 bit) const { return isOff(makeMask(bit)); }
86
88 {
89 if (sizeof(T) <= sizeof(u32))
90 return BitFlagUtil::countOnBit(mBits);
91 else
92 return BitFlagUtil::countOnBit64(mBits);
93 }
94
96 {
97 if (sizeof(T) <= sizeof(u32))
98 return BitFlagUtil::countContinuousOffBitFromRight(mBits);
99 else
100 return BitFlagUtil::countContinuousOffBitFromRight64(mBits);
101 }
102
103 s32 countRightOnBit(s32 bit) const
104 {
105 if (sizeof(T) <= sizeof(u32))
106 return BitFlagUtil::countRightOnBit(mBits, bit);
107 else
108 return BitFlagUtil::countRightOnBit64(mBits, bit);
109 }
110
111 s32 findOnBitFromRight(s32 num) const
112 {
113 if (sizeof(T) <= sizeof(u32))
114 return BitFlagUtil::findOnBitFromRight(mBits, num);
115 else
116 return BitFlagUtil::findOnBitFromRight64(mBits, num);
117 }
118
119protected:
121};
122
126
127#ifdef cafe
128static_assert(sizeof(BitFlag8) == 1, "sead::BitFlag8 size mismatch");
129static_assert(sizeof(BitFlag16) == 2, "sead::BitFlag16 size mismatch");
130static_assert(sizeof(BitFlag32) == 4, "sead::BitFlag32 size mismatch");
131#endif // cafe
132
133} // namespace sead
134
135#endif // SEAD_BIT_FLAG_H_
Definition seadBitFlag.h:10
static s32 countContinuousOffBitFromRight64(u64 x)
Definition seadBitFlag.h:27
static s32 countContinuousOffBitFromRight(u32 x)
Definition seadBitFlag.h:14
static s32 countRightOnBit(u32 x, s32 bit)
static s32 findOnBitFromRight64(u64 x, s32 num)
static s32 countRightOnBit64(u64 x, s32 bit)
static s32 countOnBit64(u64 x)
Definition seadBitFlag.h:22
static s32 findOnBitFromRight(u32 x, s32 num)
static s32 countOnBit(u32 x)
Definition seadBitFlag.h:38
T getMask(T mask) const
Definition seadBitFlag.h:71
T * getPtr()
Definition seadBitFlag.h:57
void makeAllZero()
Definition seadBitFlag.h:52
s32 countContinuousOffBitFromRight() const
Definition seadBitFlag.h:95
operator T() const
Definition seadBitFlag.h:50
T mBits
Definition seadBitFlag.h:120
bool isOff(T mask) const
Definition seadBitFlag.h:69
BitFlag()
Definition seadBitFlag.h:40
void toggle(T mask)
Definition seadBitFlag.h:63
s32 countOnBit() const
Definition seadBitFlag.h:87
bool isOffBit(s32 bit) const
Definition seadBitFlag.h:85
void set(T mask)
Definition seadBitFlag.h:61
s32 findOnBitFromRight(s32 num) const
Definition seadBitFlag.h:111
void setDirect(T bits)
Definition seadBitFlag.h:55
void setBit(s32 bit)
Definition seadBitFlag.h:79
const T * getPtr() const
Definition seadBitFlag.h:58
size_t getByteSize() const
Definition seadBitFlag.h:59
T getDirect() const
Definition seadBitFlag.h:56
bool isOn(T mask) const
Definition seadBitFlag.h:67
void changeBit(s32 bit, bool b)
Definition seadBitFlag.h:81
BitFlag(T t)
Definition seadBitFlag.h:45
void change(T mask, bool b)
Definition seadBitFlag.h:64
bool isOnAll(T mask) const
Definition seadBitFlag.h:68
bool isZero() const
Definition seadBitFlag.h:66
void toggleBit(s32 bit)
Definition seadBitFlag.h:82
static T makeMask(s32 bit)
Definition seadBitFlag.h:73
s32 countRightOnBit(s32 bit) const
Definition seadBitFlag.h:103
void makeAllOne()
Definition seadBitFlag.h:53
void reset(T mask)
Definition seadBitFlag.h:62
void resetBit(s32 bit)
Definition seadBitFlag.h:80
bool isOnBit(s32 bit) const
Definition seadBitFlag.h:84
Definition seadAssert.h:44
BitFlag< u16 > BitFlag16
Definition seadBitFlag.h:124
BitFlag< u32 > BitFlag32
Definition seadBitFlag.h:125
BitFlag< u8 > BitFlag8
Definition seadBitFlag.h:123
#define SEAD_ASSERT(condition)
Definition seadAssert.h:24