11requires std::is_enum_v<T>
and
12 requires (std::underlying_type_t<T> x) {
13 { x | x } -> std::same_as<std::underlying_type_t<T>>;
18 using U = std::underlying_type_t<T>;
19 return T(
U(left) |
U(right) );
23requires std::is_enum_v<T>
and
24 requires (std::underlying_type_t<T> x) {
25 { x | x } -> std::same_as<std::underlying_type_t<T>>;
30 using U = std::underlying_type_t<T>;
31 return T(
U(left) &
U(right) );
35requires std::is_enum_v<T>
and
36 requires (std::underlying_type_t<T> x) {
37 { ~x } -> std::same_as<std::underlying_type_t<T>>;
38 { x & x } -> std::same_as<std::underlying_type_t<T>>;
43 using U = std::underlying_type_t<T>;
44 return T(
U(left) & ~
U(right) );
48requires std::is_enum_v<T>
and
49 requires (std::underlying_type_t<T> x) {
50 { ~x } -> std::same_as<std::underlying_type_t<T>>;
55 using U = std::underlying_type_t<T>;
60requires std::is_enum_v<T>
and requires (T x) { { x | x } -> std::same_as<T>; }
63 return left = left | right;
67requires std::is_enum_v<T>
and requires (T x) { { x & x } -> std::same_as<T>; }
70 return left = left & right;
74requires std::is_enum_v<T>
and requires (T x) { { x - x } -> std::same_as<T>; }
77 return left = left - right;
constexpr T & operator|=(T &left, T right)
Schema operator&(const Schema &left, const Schema &right)
Computes the set intersection of two Schemas.
constexpr T & operator-=(T &left, T right)
Schema operator|(const Schema &left, const Schema &right)
constexpr T & operator&=(T &left, T right)
constexpr T operator~(T t)
constexpr T operator-(T left, T right)
and arithmetic< U > and same_signedness< T, U > U