66
77#include < type_traits>
88
9+ // TODO Find a better home; could be useful elsewhere
10+ #if __cplusplus >= 201703L
11+ # define ENUM_UTILS_NODISCARD [[nodiscard]]
12+ #elif defined(__clang__) || defined(__GNUC__)
13+ # define ENUM_UTILS_NODISCARD __attribute__ ((warn_unused_result))
14+ #elif defined(_MSC_VER)
15+ # define ENUM_UTILS_NODISCARD _Check_return_
16+ #else
17+ # define ENUM_UTILS_NODISCARD
18+ #endif
19+
920template <typename Enum>
1021struct IsBitset : std::false_type
1122{};
@@ -56,6 +67,34 @@ constexpr auto operator^=(Enum& lhs, Enum rhs) noexcept
5667 return lhs;
5768}
5869
70+ namespace bitset {
71+ template <typename Enum, std::enable_if_t <IsValidBitset<Enum>::value, int > = 0 >
72+ ENUM_UTILS_NODISCARD constexpr Enum clear (Enum val, Enum flag)
73+ {
74+ using T = std::underlying_type_t <Enum>;
75+ return val & Enum (~static_cast <T>(flag));
76+ }
77+
78+ template <typename Enum, std::enable_if_t <IsValidBitset<Enum>::value, int > = 0 >
79+ ENUM_UTILS_NODISCARD constexpr Enum set (Enum val, Enum flag, bool state = true )
80+ {
81+ using T = std::underlying_type_t <Enum>;
82+ return state ? (val | flag) : (val & Enum (~static_cast <T>(flag)));
83+ }
84+
85+ template <typename Enum, std::enable_if_t <IsValidBitset<Enum>::value, int > = 0 >
86+ ENUM_UTILS_NODISCARD constexpr Enum toggle (Enum val, Enum flag)
87+ {
88+ return val ^ flag;
89+ }
90+
91+ template <typename Enum, std::enable_if_t <IsValidBitset<Enum>::value, int > = 0 >
92+ constexpr bool isSet (Enum val, Enum flag)
93+ {
94+ return (val & flag) != Enum (0 );
95+ }
96+ } // namespace bitset
97+
5998// / Makes a strongly typed enum usable as a bitset
6099#define MAKE_BITSET_STRONG (Type ) \
61100 template <> \
@@ -64,3 +103,5 @@ constexpr auto operator^=(Enum& lhs, Enum rhs) noexcept
64103 /* NOLINTNEXTLINE(bugprone-macro-parentheses) */ \
65104 static_assert (std::is_unsigned<std::underlying_type_t <Type>>::value, \
66105 #Type " must use unsigned type as the underlying type" )
106+
107+ #undef ENUM_UTILS_NODISCARD
0 commit comments