New Super Mario Bros. U Headers
Loading...
Searching...
No Matches
Bitfield.h
Go to the documentation of this file.
1#pragma once
2
3#include <prim/seadMemUtil.h>
4#include <concepts>
5
6// TODO: Investigate if this is a sead type
7
8template <u32 BitNum>
10{
11public:
13 {
14 reset();
15 }
16
17 void copy(const Bitfield<BitNum>& rhs)
18 {
19 sead::MemUtil::copy(mBitArray, rhs.mBitArray, BitNum / 8);
20 }
21
22 void reset()
23 {
24 sead::MemUtil::fillZero(mBitArray, BitNum / 8);
25 }
26
27 static s32 bitToIndex(s32 bit)
28 {
29 return bit >> 5;
30 }
31
32 static u32 makeMask(u32 bit)
33 {
34 return 1 << (bit % 32);
35 }
36
37 bool isOnBit(u32 bit) const
38 {
39 return (mBitArray[bitToIndex(static_cast<s32>(bit))] & makeMask(bit)) != 0;
40 }
41
42 void setBit(std::convertible_to<u32> auto... bits)
43 {
44 (setBit_(bits), ...);
45 }
46
47 void resetBit(u32 bit)
48 {
49 mBitArray[bitToIndex(bit)] &= ~makeMask(bit);
50 }
51
52 void changeBit(u32 bit, bool b)
53 {
54 if (b)
55 setBit(bit);
56 else
57 resetBit(bit);
58 }
59
60 void toggleBit(u32 bit)
61 {
62 mBitArray[bitToIndex(bit)] ^= makeMask(bit);
63 }
64
65private:
66 void setBit_(u32 bit)
67 {
68 mBitArray[bitToIndex(static_cast<s32>(bit))] |= makeMask(bit);
69 }
70
71private:
72 static_assert(BitNum % 32 == 0);
73 u32 mBitArray[BitNum / 32];
74};
75static_assert(sizeof(Bitfield<32>) == 4);
Definition Bitfield.h:10
bool isOnBit(u32 bit) const
Definition Bitfield.h:37
void setBit_(u32 bit)
Definition Bitfield.h:66
void resetBit(u32 bit)
Definition Bitfield.h:47
static s32 bitToIndex(s32 bit)
Definition Bitfield.h:27
static u32 makeMask(u32 bit)
Definition Bitfield.h:32
u32 mBitArray[BitNum/32]
Definition Bitfield.h:73
void toggleBit(u32 bit)
Definition Bitfield.h:60
void copy(const Bitfield< BitNum > &rhs)
Definition Bitfield.h:17
void changeBit(u32 bit, bool b)
Definition Bitfield.h:52
void reset()
Definition Bitfield.h:22
void setBit(std::convertible_to< u32 > auto... bits)
Definition Bitfield.h:42
Bitfield()
Definition Bitfield.h:12