MUDA
Loading...
Searching...
No Matches
flag.h
1#pragma once
2#include <type_traits>
3#include <muda/muda_def.h>
4
5namespace muda
6{
7template <typename BitType>
8class 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
164template <typename BitType>
165MUDA_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
171template <typename BitType>
172MUDA_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
178template <typename BitType>
179MUDA_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 flag.h:9