6#include <initializer_list>
18 template<
typename TEnum>
19 requires std::is_enum_v<TEnum>
31 constexpr Flags(std::initializer_list<TEnum> flags)
33 for (TEnum flag : flags) {
40 return !
static_cast<bool>(*this);
43 explicit constexpr operator bool ()
const
69 const auto unsigned_val =
static_cast<std::make_unsigned_t<underlying_type>
>(value_);
70 return static_cast<TEnum
>(
underlying_type{1} << std::countr_zero(unsigned_val));
85 constexpr bool get(TEnum flag)
const
87 return static_cast<bool>(*
this & flag);
90 constexpr void set(TEnum flag,
bool v)
98 copy = (*
this & flag0) ? copy.
with(flag1) : copy.
without(flag1);
99 copy = (*
this & flag1) ? copy.
with(flag0) : copy.
without(flag0);
114 template<
class TEnum>
115 requires std::is_enum_v<TEnum>
118 return e.underlying_value();
123struct std::hash<
osc::Flags<T>> final {
126 return inner_hasher_(flags.underlying_value());
129 std::hash<typename osc::Flags<T>::underlying_type> inner_hasher_{};
constexpr Flags with(TEnum flag) const
Definition flags.h:75
constexpr bool operator!() const
Definition flags.h:38
constexpr Flags & operator|=(const Flags &rhs)
Definition flags.h:60
std::underlying_type_t< TEnum > underlying_type
Definition flags.h:22
static constexpr Flags from_underlying(underlying_type v)
Definition flags.h:24
constexpr bool get(TEnum flag) const
Definition flags.h:85
constexpr Flags(TEnum flag)
Definition flags.h:30
constexpr TEnum lowest_set() const
Definition flags.h:66
constexpr Flags(std::initializer_list< TEnum > flags)
Definition flags.h:31
constexpr underlying_type underlying_value() const
Definition flags.h:103
constexpr Flags with_flag_values_swapped(TEnum flag0, TEnum flag1) const
Definition flags.h:95
constexpr void set(TEnum flag, bool v)
Definition flags.h:90
constexpr Flags()=default
constexpr Flags without(TEnum flag) const
Definition flags.h:80
friend constexpr Flags operator&(const Flags &lhs, const Flags &rhs)
Definition flags.h:50
friend constexpr Flags operator|(const Flags &lhs, const Flags &rhs)
Definition flags.h:55
friend constexpr bool operator==(const Flags &, const Flags &)=default
Definition custom_decoration_generator.h:5
constexpr auto to_underlying(const Flags< TEnum > &e) noexcept
Definition flags.h:116
size_t operator()(const osc::Flags< T > &flags) const noexcept
Definition flags.h:124