16 #include <type_traits>
24 #define QX_FLAGS_ENUM_CLASS(enumName) \
25 inline qx::flags<enumName> operator|(enumName left, enumName right) \
27 return qx::flags(left) | right; \
29 inline qx::flags<enumName> operator&(enumName left, enumName right) \
31 return qx::flags(left) & right; \
33 inline qx::flags<enumName> operator^(enumName left, enumName right) \
35 return qx::flags(left) ^ right; \
62 template<enumeration_c enum_t>
65 QX_COPYMOVABLE(
flags);
68 using underlying_type = std::underlying_type_t<enum_t>;
72 constexpr
flags() noexcept =
default;
77 constexpr
void reverse() noexcept;
84 constexpr
void shift_left(
size_t nShift) noexcept;
93 constexpr
flags operator~()
const noexcept;
95 constexpr
flags& operator<<=(
size_t nShift) noexcept;
96 constexpr
flags& operator>>=(
size_t nShift) noexcept;
98 constexpr
flags operator<<(
size_t nShift)
const noexcept;
99 constexpr
flags operator>>(
size_t nShift)
const noexcept;
108 constexpr
flags(enum_t eFlag) noexcept;
115 template<
class... args_t>
116 requires(
sizeof...(args_t) >= 2 && specific_variadic_args_v<enum_t, args_t...>)
124 template<
class... args_t>
125 requires(
sizeof...(args_t) >= 1 && specific_variadic_args_v<enum_t, args_t...>)
126 constexpr
void add(args_t...
flags) noexcept;
133 template<
class... args_t>
134 requires(
sizeof...(args_t) >= 1 && specific_variadic_args_v<enum_t, args_t...>)
142 template<
class... args_t>
143 requires(
sizeof...(args_t) >= 1 && specific_variadic_args_v<enum_t, args_t...>)
144 constexpr
void xor_(args_t...
flags) noexcept;
146 constexpr
auto operator<=>(enum_t eFlag)
const noexcept;
147 constexpr
flags& operator=(enum_t eFlag) noexcept;
149 constexpr
flags& operator|=(enum_t eFlag) noexcept;
150 constexpr
flags& operator&=(enum_t eFlag) noexcept;
151 constexpr
flags& operator^=(enum_t eFlag) noexcept;
153 constexpr
flags operator|(enum_t eFlag)
const noexcept;
154 constexpr
flags operator&(enum_t eFlag)
const noexcept;
155 constexpr
flags operator^(enum_t eFlag)
const noexcept;
177 constexpr
auto operator<=>(
const flags&)
const noexcept =
default;
179 constexpr
flags& operator|=(
flags flags_) noexcept;
180 constexpr
flags& operator&=(
flags flags_) noexcept;
181 constexpr
flags& operator^=(
flags flags_) noexcept;
183 constexpr
flags operator|(
flags flags_)
const noexcept;
184 constexpr
flags operator&(
flags flags_)
const noexcept;
185 constexpr
flags operator^(
flags flags_)
const noexcept;
194 constexpr
bool contains(enum_t eFlag)
const noexcept;
202 template<
class... args_t>
203 requires(
sizeof...(args_t) >= 2 && specific_variadic_args_v<enum_t, args_t...>)
219 template<
class... args_t>
220 requires(
sizeof...(args_t) >= 2 && specific_variadic_args_v<enum_t, args_t...>)
243 underlying_type m_nEnumFlags = 0;
248 template<qx::enumeration_c enum_t>
249 struct std::hash<qx::flags<enum_t>>
253 return std::hash<typename qx::flags<enum_t>::underlying_type>()(eFlags.
to_integer());
Wrapper for enumerations to be used as a list of flags.
requires(sizeof...(args_t) >=1 &&specific_variadic_args_v< enum_t, args_t... >) const expr void xor_(args_t... flags) noexcept
Apply a bitwise XOR to a flags value.
constexpr bool contains_all(flags other) const noexcept
Check if all the specified flags are present.
constexpr void remove(flags flags_) noexcept
Remove all the flags specified.
constexpr void shift_left(size_t nShift) noexcept
Shift bits to the left.
constexpr bool contains(enum_t eFlag) const noexcept
Check if flag is present.
requires(sizeof...(args_t) >=2 &&specific_variadic_args_v< enum_t, args_t... >) const expr flags(args_t... flags) noexcept
flags object constructor
constexpr void xor_(flags flags_) noexcept
Apply a bitwise XOR to a flags value.
requires(sizeof...(args_t) >=1 &&specific_variadic_args_v< enum_t, args_t... >) const expr void add(args_t... flags) noexcept
Add all the flags specified.
constexpr bool contains_any(flags other) const noexcept
Check if any of the specified flags is present.
constexpr void add(flags flags_) noexcept
Add all the flags specified.
static constexpr flags all_flags() noexcept
Get a flags with all bits equal 1.
constexpr void reverse() noexcept
Reverse (or logically negotiate) all bits.
requires(sizeof...(args_t) >=2 &&specific_variadic_args_v< enum_t, args_t... >) const expr bool contains_any(args_t... flags) const noexcept
Check if any of the specified flags is present.
requires(sizeof...(args_t) >=2 &&specific_variadic_args_v< enum_t, args_t... >) const expr bool contains_all(args_t... flags) const noexcept
Check if all the specified flags are present.
requires(sizeof...(args_t) >=1 &&specific_variadic_args_v< enum_t, args_t... >) const expr void remove(args_t... flags) noexcept
Remove all the flags specified.
constexpr void shift_right(size_t nShift) noexcept
Shift bits to the right.
constexpr underlying_type to_integer() const noexcept
Convert to the corresponding integer value.