55 #include <type_traits> 57 #if !defined(NX_KIT_API) 64 namespace flags_detail {
66 template <
typename Enum>
67 constexpr
typename std::underlying_type<Enum>::type toUnderlyingType(Enum value)
69 return static_cast<typename std::underlying_type<Enum>::type
>(value);
78 #define NX_KIT_ENABLE_FLAGS(ENUM) \ 79 static_assert(std::is_enum<ENUM>::value, "Flag type must be an enum"); \ 82 constexpr bool operator!(ENUM x) \ 84 return ::nx::kit::flags_detail::toUnderlyingType(x) == 0; \ 89 constexpr ENUM operator~(ENUM x) \ 91 return static_cast<ENUM>(~::nx::kit::flags_detail::toUnderlyingType(x)); \ 95 constexpr ENUM operator&(ENUM x, ENUM y) \ 97 return static_cast<ENUM>( \ 98 ::nx::kit::flags_detail::toUnderlyingType(x) \ 99 & ::nx::kit::flags_detail::toUnderlyingType(y)); \ 103 inline ENUM& operator&=(ENUM& x, ENUM y) \ 109 constexpr ENUM operator|(ENUM x, ENUM y) \ 111 return static_cast<ENUM>( \ 112 ::nx::kit::flags_detail::toUnderlyingType(x) \ 113 | ::nx::kit::flags_detail::toUnderlyingType(y)); \ 117 inline ENUM& operator|=(ENUM& x, ENUM y) \ 123 constexpr ENUM operator^(ENUM x, ENUM y) \ 125 return static_cast<ENUM>( \ 126 ::nx::kit::flags_detail::toUnderlyingType(x) \ 127 ^ ::nx::kit::flags_detail::toUnderlyingType(y)); \ 131 inline ENUM& operator^=(ENUM& x, ENUM y) \ Definition: apple_utils.h:6