OGLplus  (0.59.0) a C++ wrapper for rendering APIs

enum_bitfield.hpp
Go to the documentation of this file.
1 
9 #ifndef EAGINE_ENUM_BITFIELD_HPP
10 #define EAGINE_ENUM_BITFIELD_HPP
11 
12 #include "enum_class.hpp"
13 
14 namespace eagine {
15 //------------------------------------------------------------------------------
16 template <typename T, typename ClassList>
17 struct enum_bits;
18 
19 template <typename T, typename... Classes>
20 struct enum_bits<T, mp_list<Classes...>> {
21  T _bits{0};
22 
23  explicit constexpr enum_bits(T bits) noexcept
24  : _bits(bits) {}
25 };
26 
27 template <
28  typename T,
29  typename TL1,
30  typename TL2,
31  typename = std::enable_if_t<!mp_is_empty_v<mp_union_t<TL1, TL2>>>>
32 static constexpr auto
33 operator|(enum_value<T, TL1> a, enum_value<T, TL2> b) noexcept {
34  // NOLINTNEXTLINE(hicpp-signed-bitwise)
35  return enum_bits<T, mp_union_t<TL1, TL2>>{a.value | b.value};
36 }
37 
38 template <
39  typename T,
40  typename TL1,
41  typename TL2,
42  typename = std::enable_if_t<!mp_is_empty_v<mp_union_t<TL1, TL2>>>>
43 static constexpr auto
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};
46 }
47 //------------------------------------------------------------------------------
48 template <typename EnumClass>
49 struct enum_bitfield {
50  using value_type = typename EnumClass::value_type;
51 
52  value_type _value{0};
53 
54  constexpr enum_bitfield() noexcept = default;
55 
56  explicit constexpr enum_bitfield(value_type value) noexcept
57  : _value{value} {}
58 
59  constexpr enum_bitfield(EnumClass e) noexcept
60  : _value{e._value} {}
61 
62  template <
63  typename Classes,
64  typename = std::enable_if_t<mp_contains_v<Classes, EnumClass>>>
65  constexpr enum_bitfield(enum_value<value_type, Classes> ev) noexcept
66  : _value{ev.value} {}
67 
68  template <
69  typename Classes,
70  typename = std::enable_if_t<mp_contains_v<Classes, EnumClass>>>
71  constexpr enum_bitfield(enum_bits<value_type, Classes> eb) noexcept
72  : _value{eb._bits} {}
73 
74  explicit constexpr operator value_type() const noexcept {
75  return _value;
76  }
77 
78  auto add(EnumClass ev) noexcept -> auto& {
79  _value |= ev._value; // NOLINT(hicpp-signed-bitwise)
80  return *this;
81  }
82 
83  auto clear(EnumClass ev) noexcept -> auto& {
84  _value &= ~ev._value; // NOLINT(hicpp-signed-bitwise)
85  return *this;
86  }
87 
88  constexpr auto has(EnumClass ev) const noexcept -> bool {
89  // NOLINTNEXTLINE(hicpp-signed-bitwise)
90  return (_value & ev._value) == ev._value;
91  }
92 
93  friend constexpr auto operator==(enum_bitfield a, enum_bitfield b) noexcept {
94  return a._value == b._value;
95  }
96 
97  friend constexpr auto operator!=(enum_bitfield a, enum_bitfield b) noexcept {
98  return a._value != b._value;
99  }
100 
101  friend constexpr auto operator|(enum_bitfield a, enum_bitfield b) noexcept {
102  return enum_bitfield{value_type(a._value) | value_type(b._value)};
103  }
104 
105  friend constexpr auto operator&(enum_bitfield a, enum_bitfield b) noexcept {
106  return enum_bitfield{value_type(a._value) & value_type(b._value)};
107  }
108 };
109 
110 } // namespace eagine
111 
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

Copyright © 2015-2021 Matúš Chochlík.
<chochlik -at -gmail.com>
Documentation generated on Tue Apr 13 2021 by Doxygen (version 1.8.17).