44 constexpr flags() noexcept : value_{} {}
46 constexpr flags(T value) noexcept : value_{
static_cast<std::underlying_type_t<T>
>(value)} {}
48 constexpr operator T()
const noexcept {
52 constexpr bool operator!()
const noexcept {
56 constexpr explicit operator bool()
const noexcept {
60#if __cpp_lib_three_way_comparison >= 201907L
61 constexpr bool operator==(
const flags&)
const noexcept =
default;
62 constexpr auto operator<=>(
const flags&)
const noexcept =
default;
64 constexpr bool operator==(
const flags& right)
const noexcept {
65 return value_ == right.value_;
68 constexpr bool operator!=(
const flags& right)
const noexcept {
69 return value_ != right.value_;
72 constexpr bool operator<(
const flags& right)
const noexcept {
73 return value_ < right.value_;
76 constexpr bool operator>(
const flags& right)
const noexcept {
77 return value_ > right.value_;
80 constexpr bool operator<=(
const flags& right)
const noexcept {
81 return value_ <= right.value_;
84 constexpr bool operator>=(
const flags& right)
const noexcept {
85 return value_ >= right.value_;
89 constexpr flags& operator&=(
const flags& right)
noexcept {
90 value_ &= right.value_;
95 constexpr flags& operator|=(
const flags& right)
noexcept {
96 value_ |= right.value_;
101 friend constexpr flags operator&(
const flags& left,
const flags& right)
noexcept {
102 return T{left.value_ & right.value_};
105 friend constexpr flags operator|(
const flags& left,
const flags& right)
noexcept {
106 return T{left.value_ | right.value_};
110 std::underlying_type_t<T> value_;