|
4 | 4 |
|
5 | 5 | #pragma once |
6 | 6 |
|
| 7 | +#include <boost/config.hpp> |
7 | 8 | #include <type_traits> |
8 | 9 |
|
9 | 10 | template<typename Enum> |
@@ -31,17 +32,45 @@ constexpr auto operator|(Enum lhs, Enum rhs) noexcept |
31 | 32 | } |
32 | 33 |
|
33 | 34 | template<typename Enum, typename = require_validBitset<Enum>> |
34 | | -constexpr auto operator&=(Enum& lhs, Enum rhs) noexcept |
| 35 | +constexpr Enum& operator&=(Enum& lhs, Enum rhs) noexcept |
35 | 36 | { |
36 | 37 | return lhs = lhs & rhs; |
37 | 38 | } |
38 | 39 |
|
39 | 40 | template<typename Enum, typename = require_validBitset<Enum>> |
40 | | -constexpr auto operator|=(Enum& lhs, Enum rhs) noexcept |
| 41 | +constexpr Enum& operator|=(Enum& lhs, Enum rhs) noexcept |
41 | 42 | { |
42 | 43 | return lhs = lhs | rhs; |
43 | 44 | } |
44 | 45 |
|
| 46 | +namespace bitset { |
| 47 | +template<typename Enum, typename = require_validBitset<Enum>> |
| 48 | +BOOST_ATTRIBUTE_NODISCARD constexpr Enum clear(const Enum val, const Enum flag) |
| 49 | +{ |
| 50 | + using Int = std::underlying_type_t<Enum>; |
| 51 | + return val & Enum(~static_cast<const Int>(flag)); |
| 52 | +} |
| 53 | + |
| 54 | +template<typename Enum, typename = require_validBitset<Enum>> |
| 55 | +BOOST_ATTRIBUTE_NODISCARD constexpr Enum set(const Enum val, const Enum flag, const bool state = true) |
| 56 | +{ |
| 57 | + return state ? (val | flag) : clear(val, flag); |
| 58 | +} |
| 59 | + |
| 60 | +template<typename Enum, typename = require_validBitset<Enum>> |
| 61 | +BOOST_ATTRIBUTE_NODISCARD constexpr Enum toggle(const Enum val, const Enum flag) |
| 62 | +{ |
| 63 | + using Int = std::underlying_type_t<Enum>; |
| 64 | + return Enum(static_cast<const Int>(val) ^ static_cast<const Int>(flag)); |
| 65 | +} |
| 66 | + |
| 67 | +template<typename Enum, typename = require_validBitset<Enum>> |
| 68 | +BOOST_ATTRIBUTE_NODISCARD constexpr bool isSet(const Enum val, const Enum flag) |
| 69 | +{ |
| 70 | + return (val & flag) == flag; |
| 71 | +} |
| 72 | +} // namespace bitset |
| 73 | + |
45 | 74 | /// Makes a strongly typed enum usable as a bitset |
46 | 75 | #define MAKE_BITSET_STRONG(Type) \ |
47 | 76 | template<> \ |
|
0 commit comments