Go to the documentation of this file.
9 #ifndef EAGINE_ENUM_BITFIELD_HPP
10 #define EAGINE_ENUM_BITFIELD_HPP
16 template <
typename T,
typename ClassList>
19 template <
typename T,
typename... Classes>
20 struct enum_bits<T, mp_list<Classes...>> {
23 explicit constexpr enum_bits(T bits) noexcept
31 typename = std::enable_if_t<!mp_is_empty_v<mp_union_t<TL1, TL2>>>>
33 operator|(enum_value<T, TL1> a, enum_value<T, TL2> b) noexcept {
35 return enum_bits<T, mp_union_t<TL1, TL2>>{a.value | b.value};
42 typename = std::enable_if_t<!mp_is_empty_v<mp_union_t<TL1, TL2>>>>
44 operator|(enum_bits<T, TL1> eb, enum_value<T, TL2> ev) noexcept {
45 return enum_bits<T, mp_union_t<TL1, TL2>>{eb._bits | ev.value};
48 template <
typename EnumClass>
49 struct enum_bitfield {
54 constexpr enum_bitfield() noexcept = default;
56 explicit constexpr enum_bitfield(
value_type value) noexcept
59 constexpr enum_bitfield(EnumClass e) noexcept
64 typename = std::enable_if_t<mp_contains_v<Classes, EnumClass>>>
65 constexpr enum_bitfield(enum_value<value_type, Classes> ev) noexcept
70 typename = std::enable_if_t<mp_contains_v<Classes, EnumClass>>>
71 constexpr enum_bitfield(enum_bits<value_type, Classes> eb) noexcept
74 explicit constexpr
operator value_type() const noexcept {
78 auto add(EnumClass ev) noexcept ->
auto& {
83 auto clear(EnumClass ev) noexcept ->
auto& {
88 constexpr
auto has(EnumClass ev)
const noexcept ->
bool {
90 return (_value & ev._value) == ev._value;
93 friend constexpr
auto operator==(enum_bitfield a, enum_bitfield b) noexcept {
94 return a._value == b._value;
97 friend constexpr
auto operator!=(enum_bitfield a, enum_bitfield b) noexcept {
98 return a._value != b._value;
101 friend constexpr
auto operator|(enum_bitfield a, enum_bitfield b) noexcept {
105 friend constexpr
auto operator&(enum_bitfield a, enum_bitfield b) noexcept {
112 #endif // EAGINE_ENUM_BITFIELD_HPP
value_type
Value tree value element data type enumeration.
Definition: interface.hpp:27
Common code is placed in this namespace.
Definition: eagine.hpp:21
static constexpr auto operator!=(const valid_if< T, P1 > &v1, const valid_if< T, P2 > &v2) noexcept -> tribool
Non-equality comparison of two conditionally valid values.
Definition: decl.hpp:169
auto operator==(message_id l, static_message_id< ClassId, MethodId > r) noexcept
Equality comparison between message_id and static_message_id.
Definition: message_id.hpp:131