1 #ifndef CPP_UTILITIES_FLAG_ENUM_CLASS_H
2 #define CPP_UTILITIES_FLAG_ENUM_CLASS_H
22 #define CPP_UTILITIES_MARK_FLAG_ENUM_CLASS(Namespace, EnumClassType) \
23 namespace CppUtilities { \
24 template <> struct IsFlagEnumClass<EnumClassType> : Traits::Bool<true> { \
27 namespace Namespace { \
28 using CppUtilities::FlagEnumClassOperations::operator|; \
29 using CppUtilities::FlagEnumClassOperations::operator&; \
30 using CppUtilities::FlagEnumClassOperations::operator|=; \
31 using CppUtilities::FlagEnumClassOperations::operator+=; \
32 using CppUtilities::FlagEnumClassOperations::operator-=; \
40 namespace FlagEnumClassOperations {
42 template <
typename FlagEnumClass, Traits::EnableIf<IsFlagEnumClass<FlagEnumClass>> * =
nullptr>
43 constexpr FlagEnumClass
operator|(FlagEnumClass lhs, FlagEnumClass rhs)
45 return static_cast<FlagEnumClass>(
46 static_cast<typename std::underlying_type<FlagEnumClass>::type
>(lhs) |
static_cast<typename std::underlying_type<FlagEnumClass>::type
>(rhs));
49 template <
typename FlagEnumClass, Traits::EnableIf<IsFlagEnumClass<FlagEnumClass>> * =
nullptr>
50 constexpr
bool operator&(FlagEnumClass lhs, FlagEnumClass rhs)
52 return static_cast<typename std::underlying_type<FlagEnumClass>::type
>(lhs)
53 &
static_cast<typename std::underlying_type<FlagEnumClass>::type
>(rhs);
56 template <
typename FlagEnumClass, Traits::EnableIf<IsFlagEnumClass<FlagEnumClass>> * =
nullptr>
57 constexpr FlagEnumClass &
operator|=(FlagEnumClass &lhs, FlagEnumClass rhs)
59 return lhs = static_cast<FlagEnumClass>(
static_cast<typename std::underlying_type<FlagEnumClass>::type
>(lhs)
60 |
static_cast<typename std::underlying_type<FlagEnumClass>::type
>(rhs));
63 template <
typename FlagEnumClass, Traits::EnableIf<IsFlagEnumClass<FlagEnumClass>> * =
nullptr>
64 constexpr FlagEnumClass &
operator+=(FlagEnumClass &lhs, FlagEnumClass rhs)
66 return lhs = static_cast<FlagEnumClass>(
static_cast<typename std::underlying_type<FlagEnumClass>::type
>(lhs)
67 |
static_cast<typename std::underlying_type<FlagEnumClass>::type
>(rhs));
70 template <
typename FlagEnumClass, Traits::EnableIf<IsFlagEnumClass<FlagEnumClass>> * =
nullptr>
71 constexpr FlagEnumClass &
operator-=(FlagEnumClass &lhs, FlagEnumClass rhs)
73 return lhs = static_cast<FlagEnumClass>(
static_cast<typename std::underlying_type<FlagEnumClass>::type
>(lhs)
74 & (~
static_cast<typename std::underlying_type<FlagEnumClass>::type
>(rhs)));
81 #endif // CPP_UTILITIES_FLAG_ENUM_CLASS_H