StormByte 2.0.0
C++26 foundation of the StormByte suite
 
Loading...
Searching...
No Matches
bitmask.hxx
Go to the documentation of this file.
1/*
2 * Copyright (C) 2024-2026 David C. Manuelda (StormBytePP)
3 *
4 * This file is part of StormByte.
5 *
6 * StormByte original source is dual-licensed:
7 *
8 * 1. GNU Lesser General Public License v3.0 (or later)
9 * You may redistribute and/or modify this file under the terms of the
10 * GNU Lesser General Public License as published by the Free Software
11 * Foundation, either version 3 of the License, or (at your option)
12 * any later version.
13 *
14 * 2. Commercial license
15 * Alternatively, this file may be used under the terms of a commercial
16 * license agreement with the copyright holder
17 * (David C. Manuelda <StormByte@gmail.com>).
18 *
19 * Both licenses apply only to original StormByte source in this repository.
20 * They do not cover other StormByte modules or any third-party material
21 * shipped with this repository (including everything under thirdparty/),
22 * which remains under its own license.
23 *
24 * Neither license grants any patent rights. Any patent licenses required
25 * to use this software or third-party components must be obtained separately
26 * from the patent holders.
27 *
28 * StormByte is distributed in the hope that it will be useful,
29 * but WITHOUT ANY WARRANTY; without even the implied warranty of
30 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
31 * GNU Lesser General Public License for more details.
32 *
33 * You should have received a copy of the GNU Lesser General Public License
34 * version 3 along with StormByte. If not, see
35 * <https://www.gnu.org/licenses/lgpl-3.0.html>.
36 *
37 * SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-StormByte-Commercial
38 */
39
40#pragma once
41
43
44using namespace StormByte;
45
53template <Type::UnsignedEnum E>
54constexpr E operator|(E a, E b) noexcept {
55 return static_cast<E>(Type::ToUnderlying(a) | Type::ToUnderlying(b));
56}
57
65template <Type::UnsignedEnum E>
66constexpr E operator&(E a, E b) noexcept {
67 return static_cast<E>(Type::ToUnderlying(a) & Type::ToUnderlying(b));
68}
69
77template <Type::UnsignedEnum E>
78constexpr E operator^(E a, E b) noexcept {
79 return static_cast<E>(Type::ToUnderlying(a) ^ Type::ToUnderlying(b));
80}
81
88template <Type::UnsignedEnum E>
89constexpr E operator~(E a) noexcept {
90 return static_cast<E>(~Type::ToUnderlying(a));
91}
92
97namespace StormByte {
114 template<typename Derived, Type::UnsignedEnum E>
115 class Bitmask {
116 public:
120 constexpr Bitmask() noexcept: m_value(static_cast<E>(0)) {}
121
126 constexpr Bitmask(E value) noexcept: m_value(value) {}
127
132 constexpr Bitmask(const Bitmask& other) noexcept = default;
133
138 constexpr Bitmask(Bitmask&& other) noexcept = default;
139
143 constexpr virtual ~Bitmask() noexcept = default;
144
150 constexpr Bitmask& operator=(const Bitmask& other) noexcept = default;
151
157 constexpr Bitmask& operator=(Bitmask&& other) noexcept = default;
158
164 constexpr bool operator==(const Bitmask& other) const noexcept;
165
171 constexpr bool operator!=(const Bitmask& other) const noexcept;
172
178 constexpr Derived operator|(const Bitmask& other) const noexcept;
179
185 constexpr Derived operator&(const Bitmask& other) const noexcept;
186
192 constexpr Derived operator^(const Bitmask& other) const noexcept;
193
198 constexpr Derived operator~() const noexcept;
199
205 constexpr Bitmask& operator|=(const Bitmask& other) noexcept;
206
212 constexpr Bitmask& operator&=(const Bitmask& other) noexcept;
213
219 constexpr Bitmask& operator^=(const Bitmask& other) noexcept;
220
225 constexpr void Add(E value) noexcept;
226
231 constexpr void Remove(E value) noexcept;
232
237 constexpr E Value() const noexcept;
238
243 constexpr bool Has(E value) const noexcept;
244
249 constexpr bool Has(const Bitmask& other) const noexcept;
250
255 constexpr bool HasAny(E value) const noexcept;
256
261 constexpr bool HasAny(const Bitmask& other) const noexcept;
262
267 constexpr bool HasNone(E value) const noexcept;
268
273 constexpr bool HasNone(const Bitmask& other) const noexcept;
274
275 protected:
277 };
278}
279
280#include <StormByte/bitmask.txx>
constexpr E operator~(E a) noexcept
Bitwise NOT for unsigned scoped enumerations.
Definition bitmask.hxx:89
constexpr E operator&(E a, E b) noexcept
Bitwise AND for unsigned scoped enumerations.
Definition bitmask.hxx:66
constexpr E operator|(E a, E b) noexcept
Bitwise OR for unsigned scoped enumerations.
Definition bitmask.hxx:54
constexpr E operator^(E a, E b) noexcept
Bitwise XOR for unsigned scoped enumerations.
Definition bitmask.hxx:78
CRTP wrapper that stores an unsigned enum as a flag set.
Definition bitmask.hxx:115
constexpr Bitmask(E value) noexcept
Mask from a single enumerator (or already combined value).
Definition bitmask.hxx:126
constexpr void Remove(E value) noexcept
Clears every bit in value.
constexpr bool HasNone(E value) const noexcept
true when no bit in value is set.
constexpr bool HasAny(E value) const noexcept
true when any bit in value is set.
constexpr bool Has(E value) const noexcept
true when every bit in value is set.
constexpr Bitmask(Bitmask &&other) noexcept=default
Move constructor.
E m_value
Packed flags.
Definition bitmask.hxx:276
constexpr E Value() const noexcept
Stored enumerators.
constexpr Bitmask() noexcept
Empty mask (static_cast<E>(0)).
Definition bitmask.hxx:120
constexpr Bitmask(const Bitmask &other) noexcept=default
Copy constructor.
virtual constexpr ~Bitmask() noexcept=default
Destructor.
constexpr void Add(E value) noexcept
Sets every bit in value.
Root namespace of the StormByte suite.
Octet count. Defined in byte_size.hxx. Forwarded so Type::Numeral can name it.