Skip to content

Commit d99cf47

Browse files
Add bitset utility functions
Implement utility functions to set, clear, toggle, and query a bitset for more concise code.
1 parent 7a57324 commit d99cf47

1 file changed

Lines changed: 41 additions & 0 deletions

File tree

libs/common/include/s25util/enumUtils.h

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,17 @@
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+
920
template<typename Enum>
1021
struct 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

Comments
 (0)