4#define ENABLE_ENUM_FLAGS(EnumType) \
5 static_assert(sizeof(EnumType) <= sizeof(uint32_t)); \
6 constexpr EnumType operator~(EnumType lhs) { return static_cast<EnumType>(~static_cast<uint32_t>(lhs)); } \
7 constexpr EnumType operator|(EnumType lhs, EnumType rhs) { return static_cast<EnumType>(static_cast<uint32_t>(lhs) | static_cast<uint32_t>(rhs)); } \
8 constexpr EnumType operator&(EnumType lhs, EnumType rhs) { return static_cast<EnumType>(static_cast<uint32_t>(lhs) & static_cast<uint32_t>(rhs)); } \
9 constexpr EnumType & operator|=(EnumType & lhs, EnumType rhs) { lhs = static_cast<EnumType>(static_cast<uint32_t>(lhs) | static_cast<uint32_t>(rhs)); return lhs; } \
10 constexpr EnumType & operator&=(EnumType & lhs, EnumType rhs) { lhs = static_cast<EnumType>(static_cast<uint32_t>(lhs) & static_cast<uint32_t>(rhs)); return lhs; } \
11 constexpr bool operator==(EnumType lhs, uint32_t rhs) { return static_cast<uint32_t>(lhs) == rhs; } \
12 constexpr bool operator!=(EnumType lhs, uint32_t rhs) { return static_cast<uint32_t>(lhs) != rhs; }
14#define ENABLE_DERIVED_FLAGS(EnumType, BaseType) \
15 static_assert(sizeof(EnumType) <= sizeof(uint32_t)); \
16 constexpr EnumType operator|(EnumType lhs, BaseType rhs) { return static_cast<EnumType>(static_cast<uint32_t>(lhs) | static_cast<uint32_t>(rhs)); } \
17 constexpr EnumType operator&(EnumType lhs, BaseType rhs) { return static_cast<EnumType>(static_cast<uint32_t>(lhs) & static_cast<uint32_t>(rhs)); }