19 #include <type_traits>
43 static constexpr
bool enable =
false;
47 typename std::enable_if_t<EnableBitmaskOps<T>::enable,
T>
operator&(
T lhs,
T rhs) {
48 using type =
typename std::underlying_type_t<T>;
49 return static_cast<T>(
static_cast<type>(lhs) & static_cast<type>(rhs));
52 typename std::enable_if_t<EnableBitmaskOps<T>::enable,
T>
operator|(
T lhs,
T rhs) {
53 using type =
typename std::underlying_type_t<T>;
54 return static_cast<T>(
static_cast<type>(lhs) | static_cast<type>(rhs));
57 typename std::enable_if_t<EnableBitmaskOps<T>::enable,
T>
operator~(
T t) {
58 return static_cast<T>(~static_cast<std::underlying_type_t<T>>(t));
61 typename std::enable_if_t<EnableBitmaskOps<T>::enable,
T>
operator|=(
T& lhs,
T rhs) {
66 typename std::enable_if_t<EnableBitmaskOps<T>::enable,
T>
operator&=(
T& lhs,
T rhs) {
72 typename std::enable_if_t<EnableBitmaskOps<T>::enable,
bool>
any_bits_set(
T t) {
73 using type =
typename std::underlying_type_t<T>;
74 constexpr
type zero{};
75 return static_cast<type>(t) != zero;
78 #define ENABLE_BITMASK_OPS(x) \
80 struct EnableBitmaskOps<x> { \
81 static const bool enable = true; \
std::enable_if_t< EnableBitmaskOps< T >::enable, T > operator~(T t)
std::enable_if_t< EnableBitmaskOps< T >::enable, T > operator&=(T &lhs, T rhs)
std::enable_if_t< EnableBitmaskOps< T >::enable, T > operator&(T lhs, T rhs)
std::enable_if_t< EnableBitmaskOps< T >::enable, T > operator|(T lhs, T rhs)
std::enable_if_t< EnableBitmaskOps< T >::enable, bool > any_bits_set(T t)
std::enable_if_t< EnableBitmaskOps< T >::enable, T > operator|=(T &lhs, T rhs)
static constexpr bool enable