Photon microGUI widgets library 0.6.0
bitmask.hpp
1#ifndef CPP_BITMASK_HPP
2#define CPP_BITMASK_HPP
3
4namespace cppbitmasks
5{
6 template<class MaskT, class FlagT, MaskT Mask = ~(MaskT())>
7 class bitmask
8 {
9 bitmask(MaskT val) :
10 _val(val)
11 {
12 }
13 public:
14 bitmask() :
15 _val(MaskT())
16 {
17 }
18
19 bitmask(const FlagT &flag) :
20 _val(flag)
21 {
22 }
23
24 bitmask(const bitmask &other) :
25 _val(other.value())
26 {
27 }
28
29 inline bool has(const FlagT &flag) const
30 {
31 return 0 != (value() & flag);
32 }
33
34 inline bool has(const bitmask &mask) const
35 {
36 return 0 != (value() & mask);
37 }
38
39 inline bitmask& set(const FlagT &flag)
40 {
41 _val |= flag;
42 return *this;
43 }
44
45 inline bitmask& set(const bitmask &mask)
46 {
47 _val |= mask.value();
48 return *this;
49 }
50
51 inline bitmask& reset(const FlagT &flag)
52 {
53 _val &= ~flag;
54 return *this;
55 }
56
57 inline bitmask& reset(const bitmask &mask)
58 {
59 _val &= ~mask.value();
60 return *this;
61 }
62
63 inline bitmask& keep(const FlagT &flag)
64 {
65 _val &= flag;
66 return *this;
67 }
68
69 inline bitmask& keep(const bitmask &mask)
70 {
71 _val &= mask.value();
72 return *this;
73 }
74
75 inline bitmask& flip(const FlagT &flag)
76 {
77 _val ^= flag;
78 return *this;
79 }
80
81 inline bitmask& flip(const bitmask &mask)
82 {
83 _val ^= mask.value();
84 return *this;
85 }
86
87 inline bitmask operator|(const FlagT &flag) const
88 {
89 return *this | bitmask(flag);
90 }
91
92 inline bitmask operator|(const bitmask &mask) const
93 {
94 return value() | mask.value();
95 }
96
97 inline bitmask operator&(const FlagT &flag) const
98 {
99 return *this & bitmask(flag);
100 }
101
102 inline bitmask operator&(const bitmask &mask) const
103 {
104 return value() & mask.value();
105 }
106
107 inline bitmask operator^(const FlagT &flag) const
108 {
109 return *this ^ bitmask(flag);
110 }
111
112 inline bitmask operator^(const bitmask &mask) const
113 {
114 return value() ^ mask.value();
115 }
116
117 inline bitmask& operator=(const FlagT &flag)
118 {
119 *this = bitmask(flag);
120 return *this;
121 }
122
123 inline bitmask& operator=(const bitmask &other)
124 {
125 _val = other.value();
126 return *this;
127 }
128
129 inline bitmask& operator|=(const FlagT &flag)
130 {
131 return set(flag);
132 }
133
134 inline bitmask& operator|=(const bitmask &other)
135 {
136 return set(other);
137 }
138
139 inline bitmask& operator&=(const FlagT &flag)
140 {
141 return keep(flag);
142 }
143
144 inline bitmask& operator&=(const bitmask &other)
145 {
146 return keep(other);
147 }
148
149 inline bitmask& operator^=(const FlagT &flag)
150 {
151 return flip(flag);
152 }
153
154 inline bitmask& operator^=(const bitmask &other)
155 {
156 return flip(other);
157 }
158
159 inline bool operator==(const FlagT &flag) const
160 {
161 return value() == flag;
162 }
163
164 inline bool operator==(const bitmask &other) const
165 {
166 return value() == other.value();
167 }
168
169 inline bool operator!=(const FlagT &flag) const
170 {
171 return value() != flag;
172 }
173
174 inline bool operator!=(const bitmask &other) const
175 {
176 return value() != other.value();
177 }
178
179 inline bool operator<(const bitmask &other) const
180 {
181 return value() < other.value();
182 }
183
184 inline bool operator>(const bitmask &other) const
185 {
186 return value() > other.value();
187 }
188
189 inline operator MaskT() const
190 {
191 return value();
192 }
193
194 private:
195 MaskT _val;
196
197 inline
198 MaskT value() const { return _val & Mask; }
199 };
200
201
202}
203
204template<class MaskT, class FlagT, MaskT Mask>
205inline cppbitmasks::bitmask<MaskT, FlagT, Mask> operator|(const FlagT &flag, const cppbitmasks::bitmask<MaskT, FlagT, Mask> &mask)
206{
207 return mask | flag;
208}
209
210template<class MaskT, class FlagT, MaskT Mask>
211inline cppbitmasks::bitmask<MaskT, FlagT, Mask> operator&(const FlagT &flag, const cppbitmasks::bitmask<MaskT, FlagT, Mask> &mask)
212{
213 return mask & flag;
214}
215
216template<class MaskT, class FlagT, MaskT Mask>
217inline cppbitmasks::bitmask<MaskT, FlagT, Mask> operator^(const FlagT &flag, const cppbitmasks::bitmask<MaskT, FlagT, Mask> &mask)
218{
219 return mask ^ flag;
220}
221
222template<class MaskT, class FlagT, MaskT Mask>
223inline cppbitmasks::bitmask<MaskT, FlagT, Mask> operator==(const FlagT &flag, const cppbitmasks::bitmask<MaskT, FlagT, Mask> &mask)
224{
225 return mask == flag;
226}
227
228template<class MaskT, class FlagT, MaskT Mask>
229inline cppbitmasks::bitmask<MaskT, FlagT, Mask> operator!=(const FlagT &flag, const cppbitmasks::bitmask<MaskT, FlagT, Mask> &mask)
230{
231 return mask != flag;
232}
233
234#endif