OpenTwin 0.1
OpenTwin
 
Loading...
Searching...
No Matches
Flags.h
Go to the documentation of this file.
1#pragma once
2
3// OpenTwin header
6
7// std header
8#include <type_traits>
9
12#define OT_ADD_FLAG_FUNCTIONS_IMPL(___prefix, ___castType, ___enumName) ___prefix constexpr ___enumName operator | (___enumName _lhv, ___enumName _rhv) { return static_cast<___enumName>(static_cast<___castType>(_lhv) | static_cast<___castType>(_rhv)); }; \
13___prefix constexpr ___enumName operator & (___enumName _lhv, ___enumName _rhv) { return static_cast<___enumName>(static_cast<___castType>(_lhv) & static_cast<___castType>(_rhv)); }; \
14___prefix constexpr ___enumName operator ~ (___enumName _lhv) { return static_cast<___enumName>(~(static_cast<___castType>(_lhv))); };
15
16#ifdef OT_OS_64Bit
17
31#define OT_ADD_FLAG_FUNCTIONS(___enumName) OT_ADD_FLAG_FUNCTIONS_IMPL(, long long, ___enumName)
32
45#define OT_ADD_PRIVATE_FLAG_FUNCTIONS(___enumName) OT_ADD_FLAG_FUNCTIONS_IMPL(friend , long long, ___enumName)
46#else
60#define OT_ADD_FLAG_FUNCTIONS(___enumName) OT_ADD_FLAG_FUNCTIONS_IMPL(, long, ___enumName)
61
74#define OT_ADD_PRIVATE_FLAG_FUNCTIONS(___enumName) OT_ADD_FLAG_FUNCTIONS_IMPL(friend , long, ___enumName)
75#endif
76
77namespace ot {
78
91 template<typename T> class OT_CORE_API_EXPORTONLY Flags {
92 private:
93#ifdef OT_OS_64Bit
96 typedef long long FlagCastType;
97#else
100 typedef long FlagCastType;
101#endif // _WIN64
102
103 static_assert((sizeof(T) <= sizeof(FlagCastType)), "Flags type may overflow.");
104 static_assert((std::is_enum<T>::value), "Flags accepts only enumeration types.");
105
106 T m_data;
107
108 public:
111 inline Flags() : m_data{ static_cast<T>(0) } {};
112
115 inline Flags(T _initialData) : m_data{ _initialData } {}
116
119 inline Flags(const Flags<T>& _other) : m_data{ _other.data() } {};
120
122 inline T data(void) const { return m_data; };
123
126 inline void set(T _data) { m_data = _data; };
127
130 inline void setFlag(T _flag) { m_data = m_data | _flag; };
131
135 inline void setFlag(T _flag, bool _flagIsSet) {
136 if (_flagIsSet) { m_data = m_data | _flag; }
137 else { m_data = m_data & (~_flag); }
138 };
139
142 inline void removeFlag(T _flag) { m_data = m_data & (~_flag); };
143
146 inline bool flagIsSet(T _flag) const { return (m_data & _flag); };
147
149 inline operator T(void) const { return m_data; };
150
152 inline operator bool(void) const { return (bool)m_data; };
153
154 inline Flags<T>& operator = (T _flag) { m_data = _flag; return *this; };
155 inline Flags<T>& operator = (const Flags<T>& _other) { m_data = _other.m_data; return *this; };
156
157 inline Flags<T> operator | (T _flag) const { return Flags<T>{ m_data | _flag }; };
158 inline Flags<T> operator | (const Flags<T>& _other) const { return Flags<T>{ _other.m_data | m_data }; };
159
160 inline Flags<T> operator & (T _flag) const { return Flags<T>{ m_data & _flag }; };
161 inline Flags<T> operator & (const Flags<T>& _other) const { return Flags<T>{ _other.m_data & m_data }; };
162
163 inline Flags<T>& operator |= (T _flag) { m_data = m_data | _flag; return *this; };
164 inline Flags<T>& operator |= (const Flags<T>& _other) { m_data = m_data | _other.m_data; return *this; };
165
166 inline Flags<T>& operator &= (T _flag) { m_data = m_data & _flag; return *this; };
167 inline Flags<T>& operator &= (const Flags<T>& _other) { m_data = m_data & _other.m_data; return *this; };
168
169 inline Flags<T> operator ~(void) const { return Flags<T>{ ~m_data }; };
170
171 inline bool operator == (T _flag) const { return m_data == _flag; };
172 inline bool operator == (const Flags<T>& _other) const { return m_data == _other.m_data; };
173
174 inline bool operator != (T _flag) const { return m_data != _flag; };
175 inline bool operator != (const Flags<T>& _other) const { return m_data != _other.m_data; };
176 };
177
178}
The ArchitectureInfo contains multiple definitions that specify the current OS architecture.
#define OT_CORE_API_EXPORTONLY
Definition CoreAPIExport.h:11
bool operator==(const FaceSelection &left, const FaceSelection &right)
Definition Model.cpp:45
This class is used to manage flags. Don't forget to add OT_ADD_FLAG_FUNCTIONS and the bottom of your ...
Definition Flags.h:91
Flags()
Data.
Definition Flags.h:111
Flags(const Flags< T > &_other)
Copy constructor.
Definition Flags.h:119
T data(void) const
Returns a copy of the data.
Definition Flags.h:122
void removeFlag(T _flag)
Remove the provided flag.
Definition Flags.h:142
void setFlag(T _flag, bool _flagIsSet)
Set or remove the provided flag.
Definition Flags.h:135
Flags(T _initialData)
Assignment constructor.
Definition Flags.h:115
bool flagIsSet(T _flag) const
Returns true if the provided flag is set.
Definition Flags.h:146
void set(T _data)
Replace the current data.
Definition Flags.h:126
void setFlag(T _flag)
Set the provided flag.
Definition Flags.h:130
Definition Connector.h:8