Embedded Template Library 1.0
Loading...
Searching...
No Matches
flags.h
Go to the documentation of this file.
1
2
3/******************************************************************************
4The MIT License(MIT)
5
6Embedded Template Library.
7https://github.com/ETLCPP/etl
8https://www.etlcpp.com
9
10Copyright(c) 2020 John Wellbelove
11
12Permission is hereby granted, free of charge, to any person obtaining a copy
13of this software and associated documentation files(the "Software"), to deal
14in the Software without restriction, including without limitation the rights
15to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
16copies of the Software, and to permit persons to whom the Software is
17furnished to do so, subject to the following conditions :
18
19The above copyright notice and this permission notice shall be included in all
20copies or substantial portions of the Software.
21
22THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
25AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28SOFTWARE.
29******************************************************************************/
30
31#ifndef ETL_FLAGS_INCLUDED
32#define ETL_FLAGS_INCLUDED
33
34#include "platform.h"
35#include "algorithm.h"
36#include "initializer_list.h"
37#include "integral_limits.h"
38#include "static_assert.h"
39#include "type_traits.h"
40
41#include <stddef.h>
42#include <stdint.h>
43#include <string.h>
44
45namespace etl
46{
47 //*************************************************************************
50 //*************************************************************************
51 template <typename T, T MASK = etl::integral_limits<T>::max>
52 class flags
53 {
54 public:
55
56 ETL_STATIC_ASSERT(etl::is_integral<T>::value&& etl::is_unsigned<T>::value, "Unsigned integral values only");
57
58 typedef T value_type;
59
60 static ETL_CONSTANT value_type ALL_SET = etl::integral_limits<value_type>::max & MASK;
61 static ETL_CONSTANT value_type ALL_CLEAR = 0;
62
63 static ETL_CONSTANT size_t NBITS = etl::integral_limits<value_type>::bits;
64
65 //*************************************************************************
67 //*************************************************************************
68 ETL_CONSTEXPR flags() ETL_NOEXCEPT
69 : data(value_type(0))
70 {
71 }
72
73 ETL_CONSTEXPR flags(value_type pattern) ETL_NOEXCEPT
74 : data(pattern & MASK)
75 {
76 }
77
78 ETL_CONSTEXPR flags(const flags<T, MASK>& pattern) ETL_NOEXCEPT
79 : data(pattern.value())
80 {
81 }
82
83 //*************************************************************************
85 //*************************************************************************
86 template <value_type pattern>
87 ETL_CONSTEXPR bool test() const ETL_NOEXCEPT
88 {
89 return (data & pattern) != value_type(0);
90 }
91
92 //*******************************************
93 ETL_CONSTEXPR bool test(value_type pattern) const ETL_NOEXCEPT
94 {
95 return (data & pattern) != value_type(0);
96 }
97
98 //*************************************************************************
100 //*************************************************************************
101 template <value_type pattern, bool value>
102 ETL_CONSTEXPR14 flags<T, MASK>& set() ETL_NOEXCEPT
103 {
104 value ? data |= (pattern & MASK) : data &= static_cast<value_type>(~pattern & MASK);
105
106 return *this;
107 }
108
109 //*******************************************
110 template <value_type pattern>
111 ETL_CONSTEXPR14 flags<T, MASK>& set(bool value) ETL_NOEXCEPT
112 {
113 value ? data |= (pattern & MASK) : data &= static_cast<value_type>(~pattern & MASK);
114
115 return *this;
116 }
117
118 //*******************************************
119 template <value_type pattern>
120 ETL_CONSTEXPR14 flags<T, MASK>& set() ETL_NOEXCEPT
121 {
122 data |= (pattern & MASK);
123
124 return *this;
125 }
126
127 //*******************************************
128 ETL_CONSTEXPR14 flags<T, MASK>& set(value_type pattern) ETL_NOEXCEPT
129 {
130 data |= (pattern & MASK);
131
132 return *this;
133 }
134
135 //*******************************************
136 ETL_CONSTEXPR14 flags<T, MASK>& set(value_type pattern, bool value) ETL_NOEXCEPT
137 {
138 value ? data |= (pattern & MASK) : data &= static_cast<value_type>(~pattern & MASK);
139
140 return *this;
141 }
142
143 //*************************************************************************
144 ETL_CONSTEXPR14 flags<T, MASK>& clear() ETL_NOEXCEPT
145 {
146 data = ALL_CLEAR;
147
148 return *this;
149 }
150
151 //*************************************************************************
153 //*************************************************************************
154 template <value_type pattern>
155 ETL_CONSTEXPR14 flags<T, MASK>& reset() ETL_NOEXCEPT
156 {
157 data &= static_cast<value_type>(~pattern);
158
159 return *this;
160 }
161
162 //*******************************************
163 ETL_CONSTEXPR14 flags<T, MASK>& reset(value_type pattern) ETL_NOEXCEPT
164 {
165 data &= static_cast<value_type>(~pattern);
166
167 return *this;
168 }
169
170 //*************************************************************************
172 //*************************************************************************
173 ETL_CONSTEXPR14 flags<T, MASK>& flip() ETL_NOEXCEPT
174 {
175 data = static_cast<value_type>(~data & MASK);
176
177 return *this;
178 }
179
180 //*******************************************
181 template <value_type pattern>
182 ETL_CONSTEXPR14 flags<T, MASK>& flip() ETL_NOEXCEPT
183 {
184 data ^= pattern & MASK;
185
186 return *this;
187 }
188
189 //*******************************************
190 ETL_CONSTEXPR14 flags<T, MASK>& flip(value_type pattern) ETL_NOEXCEPT
191 {
192 data ^= pattern & MASK;
193
194 return *this;
195 }
196
197 //*************************************************************************
198 // Are all the bits sets?
199 //*************************************************************************
200 ETL_CONSTEXPR bool all() const ETL_NOEXCEPT
201 {
202 return data == MASK;
203 }
204
205 //*******************************************
206 template <value_type pattern>
207 ETL_CONSTEXPR bool all_of() const ETL_NOEXCEPT
208 {
209 return (data & (pattern & MASK)) == (pattern & MASK);
210 }
211
212 //*******************************************
213 ETL_CONSTEXPR bool all_of(value_type pattern) const ETL_NOEXCEPT
214 {
215 return (data & (pattern & MASK)) == (pattern & MASK);
216 }
217
218 //*************************************************************************
220 //*************************************************************************
221 ETL_CONSTEXPR bool none() const ETL_NOEXCEPT
222 {
223 return (data & MASK) == ALL_CLEAR;
224 }
225
226 //*******************************************
227 template <value_type pattern>
228 ETL_CONSTEXPR bool none_of() const ETL_NOEXCEPT
229 {
230 return !any_of(pattern);
231 }
232
233 //*******************************************
234 ETL_CONSTEXPR bool none_of(value_type pattern) const ETL_NOEXCEPT
235 {
236 return !any_of(pattern);
237 }
238
239 //*************************************************************************
241 //*************************************************************************
242 ETL_CONSTEXPR bool any() const ETL_NOEXCEPT
243 {
244 return (data & MASK) != value_type(0);
245 }
246
247 //*******************************************
248 template <value_type pattern>
249 ETL_CONSTEXPR bool any_of() const ETL_NOEXCEPT
250 {
251 return (data & (pattern & MASK)) != value_type(0);
252 }
253
254 //*******************************************
255 ETL_CONSTEXPR bool any_of(value_type pattern) const
256 {
257 return (data & (pattern & MASK)) != value_type(0);
258 }
259
260 //*************************************************************************
262 //*************************************************************************
263 ETL_CONSTEXPR value_type value() const ETL_NOEXCEPT
264 {
265 return data;
266 }
267
268 //*************************************************************************
270 //*************************************************************************
271 ETL_CONSTEXPR14 flags<T, MASK>& value(value_type pattern) ETL_NOEXCEPT
272 {
273 data = pattern & MASK;
274
275 return *this;
276 }
277
278 //*************************************************************************
280 //*************************************************************************
281 ETL_CONSTEXPR operator value_type() const ETL_NOEXCEPT
282 {
283 return data;
284 }
285
286 //*************************************************************************
288 //*************************************************************************
289 ETL_CONSTEXPR14 flags<T, MASK>& operator&=(value_type pattern) ETL_NOEXCEPT
290 {
291 data &= pattern;
292
293 return *this;
294 }
295
296 //*************************************************************************
298 //*************************************************************************
299 ETL_CONSTEXPR14 flags<T, MASK>& operator|=(value_type pattern) ETL_NOEXCEPT
300 {
301 data |= (pattern & MASK);
302
303 return *this;
304 }
305
306 //*************************************************************************
308 //*************************************************************************
309 ETL_CONSTEXPR14 flags<T, MASK>& operator^=(value_type pattern) ETL_NOEXCEPT
310 {
311 data ^= (pattern & MASK);
312
313 return *this;
314 }
315
316 //*************************************************************************
318 //*************************************************************************
319 ETL_CONSTEXPR14 flags<T, MASK>& operator=(flags<T, MASK> other) ETL_NOEXCEPT
320 {
321 data = other.data;
322
323 return *this;
324 }
325
326 //*************************************************************************
328 //*************************************************************************
329 ETL_CONSTEXPR14 flags<T, MASK>& operator=(value_type pattern) ETL_NOEXCEPT
330 {
331 data = (pattern & MASK);
332
333 return *this;
334 }
335
336 //*************************************************************************
338 //*************************************************************************
339 void swap(flags<T, MASK>& other) ETL_NOEXCEPT
340 {
341 using ETL_OR_STD::swap;
342 swap(data, other.data);
343 }
344
345 private:
346
348 };
349
350 template <typename T, T MASK>
351 ETL_CONSTANT typename flags<T, MASK>::value_type flags<T, MASK>::ALL_SET;
352
353 template <typename T, T MASK>
354 ETL_CONSTANT typename flags<T, MASK>::value_type flags<T, MASK>::ALL_CLEAR;
355
356 template <typename T, T MASK>
357 ETL_CONSTANT size_t flags<T, MASK>::NBITS;
358
359 //***************************************************************************
361 //***************************************************************************
362 template <typename T, T MASK>
363 ETL_CONSTEXPR bool operator==(flags<T, MASK> lhs, flags<T, MASK> rhs) ETL_NOEXCEPT
364 {
365 return lhs.value() == rhs.value();
366 }
367
368 //***************************************************************************
370 //***************************************************************************
371 template <typename T, T MASK>
372 ETL_CONSTEXPR bool operator!=(flags<T, MASK> lhs, flags<T, MASK> rhs) ETL_NOEXCEPT
373 {
374 return !(lhs == rhs);
375 }
376
377 //*************************************************************************
379 //*************************************************************************
380 template <typename T, T MASK>
381 void swap(etl::flags<T, MASK>& lhs, etl::flags<T, MASK>& rhs) ETL_NOEXCEPT
382 {
383 lhs.swap(rhs);
384 }
385} // namespace etl
386
387#endif
Definition flags.h:53
ETL_CONSTEXPR14 flags< T, MASK > & operator=(value_type pattern) ETL_NOEXCEPT
operator =
Definition flags.h:329
ETL_CONSTEXPR14 flags< T, MASK > & set() ETL_NOEXCEPT
Set the bits.
Definition flags.h:102
ETL_CONSTEXPR14 flags< T, MASK > & operator^=(value_type pattern) ETL_NOEXCEPT
operator ^=
Definition flags.h:309
ETL_CONSTEXPR14 flags< T, MASK > & operator|=(value_type pattern) ETL_NOEXCEPT
operator |=
Definition flags.h:299
ETL_CONSTEXPR flags() ETL_NOEXCEPT
Constructor.
Definition flags.h:68
ETL_CONSTEXPR14 flags< T, MASK > & flip() ETL_NOEXCEPT
Flip bits.
Definition flags.h:173
ETL_CONSTEXPR14 flags< T, MASK > & reset() ETL_NOEXCEPT
Reset the bit at the pattern.
Definition flags.h:155
ETL_CONSTEXPR14 flags< T, MASK > & value(value_type pattern) ETL_NOEXCEPT
Set the value of the flags.
Definition flags.h:271
ETL_CONSTEXPR14 flags< T, MASK > & operator&=(value_type pattern) ETL_NOEXCEPT
operator &=
Definition flags.h:289
ETL_CONSTEXPR bool none() const ETL_NOEXCEPT
Are none of the bits set?
Definition flags.h:221
ETL_CONSTEXPR bool any() const ETL_NOEXCEPT
Are any of the bits set?
Definition flags.h:242
void swap(flags< T, MASK > &other) ETL_NOEXCEPT
swap
Definition flags.h:339
ETL_CONSTEXPR bool test() const ETL_NOEXCEPT
Tests bits.
Definition flags.h:87
ETL_CONSTEXPR value_type value() const ETL_NOEXCEPT
Return the value of the flags.
Definition flags.h:263
ETL_CONSTEXPR14 flags< T, MASK > & operator=(flags< T, MASK > other) ETL_NOEXCEPT
operator =
Definition flags.h:319
ETL_NODISCARD ETL_CONSTEXPR14 bool any_of(TIterator begin, TIterator end, TUnaryPredicate predicate)
Definition algorithm.h:2173
ETL_NODISCARD ETL_CONSTEXPR14 bool none_of(TIterator begin, TIterator end, TUnaryPredicate predicate)
Definition algorithm.h:2184
Definition integral_limits.h:518
bitset_ext
Definition absolute.h:40
ETL_CONSTEXPR14 void swap(etl::typed_storage_ext< T > &lhs, etl::typed_storage_ext< T > &rhs) ETL_NOEXCEPT
Swap two etl::typed_storage_ext.
Definition alignment.h:856
ETL_CONSTEXPR14 bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1081
ETL_CONSTEXPR TContainer::pointer data(TContainer &container)
Definition iterator.h:1228
ETL_CONSTEXPR14 bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1093