NSUNI/NSLAR Library a250670
Loading...
Searching...
No Matches
enum_flag.hpp
Go to the documentation of this file.
1
6
7#include <type_traits> // IWYU pragma: export
8
16
25#if defined(__has_cpp_attribute) && __has_cpp_attribute(clang::flag_enum)
26#define NNL_FLAG_ENUM [[clang::flag_enum]]
27#else
28#define NNL_FLAG_ENUM
29#endif
30
36#define NNL_DEFINE_ENUM_OPERATORS(ENUMTYPE) \
37 inline ENUMTYPE operator|(ENUMTYPE a, ENUMTYPE b) { \
38 return static_cast<ENUMTYPE>(static_cast<std::underlying_type_t<ENUMTYPE>>(a) | \
39 static_cast<std::underlying_type_t<ENUMTYPE>>(b)); \
40 } \
41 inline ENUMTYPE& operator|=(ENUMTYPE& a, ENUMTYPE b) { return a = a | b; } \
42 inline ENUMTYPE operator&(ENUMTYPE a, ENUMTYPE b) { \
43 return static_cast<ENUMTYPE>(static_cast<std::underlying_type_t<ENUMTYPE>>(a) & \
44 static_cast<std::underlying_type_t<ENUMTYPE>>(b)); \
45 } \
46 inline ENUMTYPE operator&=(ENUMTYPE& a, ENUMTYPE b) { return a = a & b; } \
47 inline ENUMTYPE operator~(ENUMTYPE a) { \
48 return static_cast<ENUMTYPE>(~static_cast<std::underlying_type_t<ENUMTYPE>>(a)); \
49 } \
50 inline ENUMTYPE operator^(ENUMTYPE a, ENUMTYPE b) { \
51 return static_cast<ENUMTYPE>(static_cast<std::underlying_type_t<ENUMTYPE>>(a) ^ \
52 static_cast<std::underlying_type_t<ENUMTYPE>>(b)); \
53 } \
54 inline ENUMTYPE operator^=(ENUMTYPE& a, ENUMTYPE b) { return a = a ^ b; }
55