16#ifdef EXPOSE_SEQUOIA_BITMASK
17#define NAMESPACE_SEQUOIA_AS_BITMASK inline namespace sequoia_bitmask
19#define NAMESPACE_SEQUOIA_AS_BITMASK namespace sequoia
22NAMESPACE_SEQUOIA_AS_BITMASK
54 requires std::is_enum_v<T>
55 struct as_bitmask : std::false_type
59 requires std::is_enum_v<T>
60 using as_bitmask_t =
typename as_bitmask<T>::type;
63 requires std::is_enum_v<T>
64 constexpr bool as_bitmask_v{as_bitmask<T>::value};
67 requires as_bitmask_v<T>
69 constexpr T operator|(T lhs, T rhs)
noexcept
71 using underlying = std::underlying_type_t<T>;
72 return static_cast<T
>(
static_cast<underlying
>(lhs) |
static_cast<underlying
>(rhs));
76 requires as_bitmask_v<T>
77 constexpr T& operator|=(T& lhs, T rhs)
noexcept
84 requires as_bitmask_v<T>
86 constexpr T operator&(T lhs, T rhs)
noexcept
88 using underlying = std::underlying_type_t<T>;
89 return static_cast<T
>(
static_cast<underlying
>(lhs) &
static_cast<underlying
>(rhs));
93 requires as_bitmask_v<T>
94 constexpr T& operator&=(T& lhs, T rhs)
noexcept
101 requires as_bitmask_v<T>
103 constexpr T operator^(T lhs, T rhs)
noexcept
105 using underlying = std::underlying_type_t<T>;
106 return static_cast<T
>(
static_cast<underlying
>(lhs) ^
static_cast<underlying
>(rhs));
110 requires as_bitmask_v<T>
111 constexpr T& operator^=(T& lhs, T rhs)
noexcept
118 requires as_bitmask_v<T>
120 constexpr T operator~(T om)
122 using underlying = std::underlying_type_t<T>;
123 return static_cast<T
>(~static_cast<underlying>(om));