27template <
typename _Tp>
34 using T = std::underlying_type_t<E>;
35 return static_cast<E
>(
static_cast<T
>(lhs) |
static_cast<T
>(rhs));
41 using T = std::underlying_type_t<E>;
42 return static_cast<E
>(
static_cast<T
>(lhs) &
static_cast<T
>(rhs));
48 using T = std::underlying_type_t<E>;
49 return static_cast<E
>(
static_cast<T
>(lhs) ^
static_cast<T
>(rhs));
55 using T = std::underlying_type_t<E>;
56 return static_cast<E
>(~static_cast<T>(val));
80template <
typename E, std::
integral U>
83 using T = std::underlying_type_t<E>;
84 return static_cast<E
>(
static_cast<T
>(lhs) << shift);
87template <
typename E, std::
integral U>
90 using T = std::underlying_type_t<E>;
91 return static_cast<E
>(
static_cast<T
>(lhs) >> shift);
94template <
typename BitmaskEnum>
95 requires std::is_enum_v<BitmaskEnum>
103template <
typename BitmaskEnum>
104 requires std::is_enum_v<BitmaskEnum>
107 constexpr explicit FlagsView(BitmaskEnum& flags) : flags_ref_(flags) {}
125 flags_ref_ =
static_cast<BitmaskEnum
>(0);
129 constexpr bool has(BitmaskEnum mask)
const {
130 return (flags_ref_ & mask) !=
static_cast<BitmaskEnum
>(0);
133 constexpr bool has_all(BitmaskEnum mask)
const {
134 return (flags_ref_ & mask) == mask;
137 constexpr auto value() const -> BitmaskEnum {
return flags_ref_; }
138 constexpr operator BitmaskEnum()
const {
return flags_ref_; }
145 BitmaskEnum& flags_ref_;
153template <
typename BitmaskEnum>
154 requires std::is_enum_v<BitmaskEnum>
158 : flags_ref_(flags) {}
160 constexpr bool has(BitmaskEnum mask)
const {
161 return (flags_ref_ & mask) !=
static_cast<BitmaskEnum
>(0);
164 constexpr bool has_all(BitmaskEnum mask)
const {
165 return (flags_ref_ & mask) == mask;
168 constexpr auto value() const -> BitmaskEnum {
return flags_ref_; }
169 constexpr operator BitmaskEnum()
const {
return flags_ref_; }
172 const BitmaskEnum& flags_ref_;
A zero-copy const view for a bitmask enum.
Definition flags_view.hxx:155
constexpr auto value() const -> BitmaskEnum
Definition flags_view.hxx:168
constexpr ConstFlagsView(const BitmaskEnum &flags)
Definition flags_view.hxx:157
constexpr bool has(BitmaskEnum mask) const
Definition flags_view.hxx:160
constexpr bool has_all(BitmaskEnum mask) const
Definition flags_view.hxx:164
constexpr auto toggle(BitmaskEnum mask) -> FlagsView &
Definition flags_view.hxx:119
constexpr FlagsView(BitmaskEnum &flags)
Definition flags_view.hxx:107
constexpr auto reset() -> FlagsView &
Definition flags_view.hxx:124
constexpr bool has_all(BitmaskEnum mask) const
Definition flags_view.hxx:133
constexpr auto clear(BitmaskEnum mask) -> FlagsView &
Definition flags_view.hxx:114
constexpr auto set(BitmaskEnum mask) -> FlagsView &
Definition flags_view.hxx:109
constexpr auto value() const -> BitmaskEnum
Definition flags_view.hxx:137
constexpr bool has(BitmaskEnum mask) const
Definition flags_view.hxx:129
constexpr E & operator&=(E &lhs, E rhs)
Definition flags_view.hxx:68
constexpr E operator|(E lhs, E rhs)
Definition flags_view.hxx:33
constexpr E operator~(E val)
Definition flags_view.hxx:54
constexpr E & operator|=(E &lhs, E rhs)
Definition flags_view.hxx:61
constexpr E operator<<(E lhs, U shift)
Definition flags_view.hxx:82
constexpr E operator>>(E lhs, U shift)
Definition flags_view.hxx:89
constexpr E operator^(E lhs, E rhs)
Definition flags_view.hxx:47
constexpr bool enable_bitmask_operators_v
Definition flags_view.hxx:28
constexpr E operator&(E lhs, E rhs)
Definition flags_view.hxx:40
constexpr E & operator^=(E &lhs, E rhs)
Definition flags_view.hxx:75
Enable bitwise operators for an enum class.
Definition flags_view.hxx:25