muda
flag.h
1 #pragma once
2 #include <type_traits>
3 #include <muda/muda_def.h>
4 
5 namespace muda
6 {
7 template <typename BitType>
8 class Flags
9 {
10  public:
11  using bit_type = BitType;
12  using mask_type = typename ::std::underlying_type<bit_type>::type;
13 
14  // constructors
15  MUDA_GENERIC MUDA_CONSTEXPR Flags() MUDA_NOEXCEPT : m_mask(0) {}
16 
17  MUDA_GENERIC MUDA_CONSTEXPR Flags(BitType bit) MUDA_NOEXCEPT
18  : m_mask(static_cast<mask_type>(bit))
19  {
20  }
21 
22  MUDA_GENERIC MUDA_CONSTEXPR Flags(Flags<BitType> const& rhs) MUDA_NOEXCEPT = default;
23 
24  MUDA_GENERIC MUDA_CONSTEXPR explicit Flags(mask_type flags) MUDA_NOEXCEPT : m_mask(flags)
25  {
26  }
27 
28  // relational operators
29  // auto operator<=>(Flags<BitType> const&) const = default;
30 
31  MUDA_GENERIC MUDA_CONSTEXPR bool operator<(Flags<BitType> const& rhs) const MUDA_NOEXCEPT
32  {
33  return m_mask < rhs.m_mask;
34  }
35 
36  MUDA_GENERIC MUDA_CONSTEXPR bool operator<=(Flags<BitType> const& rhs) const MUDA_NOEXCEPT
37  {
38  return m_mask <= rhs.m_mask;
39  }
40 
41  MUDA_GENERIC MUDA_CONSTEXPR bool operator>(Flags<BitType> const& rhs) const MUDA_NOEXCEPT
42  {
43  return m_mask > rhs.m_mask;
44  }
45 
46  MUDA_GENERIC MUDA_CONSTEXPR bool operator>=(Flags<BitType> const& rhs) const MUDA_NOEXCEPT
47  {
48  return m_mask >= rhs.m_mask;
49  }
50 
51  MUDA_GENERIC MUDA_CONSTEXPR bool operator==(Flags<BitType> const& rhs) const MUDA_NOEXCEPT
52  {
53  return m_mask == rhs.m_mask;
54  }
55 
56  MUDA_GENERIC MUDA_CONSTEXPR bool operator!=(Flags<BitType> const& rhs) const MUDA_NOEXCEPT
57  {
58  return m_mask != rhs.m_mask;
59  }
60 
61 
62  // logical operator
63  MUDA_GENERIC MUDA_CONSTEXPR bool operator!() const MUDA_NOEXCEPT
64  {
65  return !m_mask;
66  }
67 
68  // bitwise operators
69  MUDA_GENERIC MUDA_CONSTEXPR Flags<BitType> operator&(Flags<BitType> const& rhs) const MUDA_NOEXCEPT
70  {
71  return Flags<BitType>(m_mask & rhs.m_mask);
72  }
73 
74  MUDA_GENERIC MUDA_CONSTEXPR Flags<BitType> operator|(Flags<BitType> const& rhs) const MUDA_NOEXCEPT
75  {
76  return Flags<BitType>(m_mask | rhs.m_mask);
77  }
78 
79  MUDA_GENERIC MUDA_CONSTEXPR Flags<BitType> operator^(Flags<BitType> const& rhs) const MUDA_NOEXCEPT
80  {
81  return Flags<BitType>(m_mask ^ rhs.m_mask);
82  }
83 
84  // assignment operators
85  MUDA_GENERIC MUDA_CONSTEXPR Flags<BitType>& operator=(Flags<BitType> const& rhs) MUDA_NOEXCEPT = default;
86 
87  MUDA_GENERIC MUDA_CONSTEXPR Flags<BitType>& operator|=(Flags<BitType> const& rhs) MUDA_NOEXCEPT
88  {
89  m_mask |= rhs.m_mask;
90  return *this;
91  }
92 
93  MUDA_GENERIC MUDA_CONSTEXPR Flags<BitType>& operator&=(Flags<BitType> const& rhs) MUDA_NOEXCEPT
94  {
95  m_mask &= rhs.m_mask;
96  return *this;
97  }
98 
99  MUDA_GENERIC MUDA_CONSTEXPR Flags<BitType>& operator^=(Flags<BitType> const& rhs) MUDA_NOEXCEPT
100  {
101  m_mask ^= rhs.m_mask;
102  return *this;
103  }
104 
105  // cast operators
106  explicit MUDA_GENERIC MUDA_CONSTEXPR operator bool() const MUDA_NOEXCEPT
107  {
108  return !!m_mask;
109  }
110 
111  explicit MUDA_GENERIC MUDA_CONSTEXPR operator mask_type() const MUDA_NOEXCEPT
112  {
113  return m_mask;
114  }
115 
116  MUDA_GENERIC MUDA_CONSTEXPR bool has(BitType bit) const MUDA_NOEXCEPT
117  {
118  return (m_mask & static_cast<mask_type>(bit)) == static_cast<mask_type>(bit);
119  }
120 
121  private:
122  mask_type m_mask;
123 };
124 
126 //template <typename BitType>
127 //MUDA_GENERIC MUDA_CONSTEXPR bool operator<(BitType bit, Flags<BitType> const& flags) MUDA_NOEXCEPT
128 //{
129 // return flags.operator>(bit);
130 //}
131 //
132 //template <typename BitType>
133 //MUDA_GENERIC MUDA_CONSTEXPR bool operator<=(BitType bit, Flags<BitType> const& flags) MUDA_NOEXCEPT
134 //{
135 // return flags.operator>=(bit);
136 //}
137 //
138 //template <typename BitType>
139 //MUDA_GENERIC MUDA_CONSTEXPR bool operator>(BitType bit, Flags<BitType> const& flags) MUDA_NOEXCEPT
140 //{
141 // return flags.operator<(bit);
142 //}
143 //
144 //template <typename BitType>
145 //MUDA_GENERIC MUDA_CONSTEXPR bool operator>=(BitType bit, Flags<BitType> const& flags) MUDA_NOEXCEPT
146 //{
147 // return flags.operator<=(bit);
148 //}
149 //
150 //template <typename BitType>
151 //MUDA_GENERIC MUDA_CONSTEXPR bool operator==(BitType bit, Flags<BitType> const& flags) MUDA_NOEXCEPT
152 //{
153 // return flags.operator==(bit);
154 //}
155 //
156 //template <typename BitType>
157 //MUDA_GENERIC MUDA_CONSTEXPR bool operator!=(BitType bit, Flags<BitType> const& flags) MUDA_NOEXCEPT
158 //{
159 // return flags.operator!=(bit);
160 //}
161 
162 
163 // bitwise operators
164 template <typename BitType>
165 MUDA_INLINE MUDA_GENERIC MUDA_CONSTEXPR Flags<BitType> operator&(BitType bit,
166  Flags<BitType> const& flags) MUDA_NOEXCEPT
167 {
168  return flags.operator&(bit);
169 }
170 
171 template <typename BitType>
172 MUDA_INLINE MUDA_GENERIC MUDA_CONSTEXPR Flags<BitType> operator|(BitType bit,
173  Flags<BitType> const& flags) MUDA_NOEXCEPT
174 {
175  return flags.operator|(bit);
176 }
177 
178 template <typename BitType>
179 MUDA_INLINE MUDA_GENERIC MUDA_CONSTEXPR Flags<BitType> operator^(BitType bit,
180  Flags<BitType> const& flags) MUDA_NOEXCEPT
181 {
182  return flags.operator^(bit);
183 }
184 
186 //template <typename BitType, typename ::std::enable_if<is_flag_type<BitType>::isBitmask, bool>::type = true>
187 //MUDA_INLINE MUDA_GENERIC MUDA_CONSTEXPR Flags<BitType> operator&(BitType lhs, BitType rhs) MUDA_NOEXCEPT
188 //{
189 // return Flags<BitType>(lhs) & rhs;
190 //}
191 //
192 //template <typename BitType, typename ::std::enable_if<is_flag_type<BitType>::isBitmask, bool>::type = true>
193 //MUDA_INLINE MUDA_GENERIC MUDA_CONSTEXPR Flags<BitType> operator|(BitType lhs, BitType rhs) MUDA_NOEXCEPT
194 //{
195 // return Flags<BitType>(lhs) | rhs;
196 //}
197 //
198 //template <typename BitType, typename ::std::enable_if<is_flag_type<BitType>::isBitmask, bool>::type = true>
199 //MUDA_INLINE MUDA_GENERIC MUDA_CONSTEXPR Flags<BitType> operator^(BitType lhs, BitType rhs) MUDA_NOEXCEPT
200 //{
201 // return Flags<BitType>(lhs) ^ rhs;
202 //}
203 //
204 //template <typename BitType, typename ::std::enable_if<is_flag_type<BitType>::isBitmask, bool>::type = true>
205 //MUDA_INLINE MUDA_GENERIC MUDA_CONSTEXPR Flags<BitType> operator~(BitType bit) MUDA_NOEXCEPT
206 //{
207 // return ~(Flags<BitType>(bit));
208 //}
209 } // namespace muda
Definition: assert.h:13
Definition: flag.h:8