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)));
82 template <
typename FlagEnumClass, Traits::EnableIf<IsFlagEnumClass<FlagEnumClass>> * =
nullptr>
83 constexpr FlagEnumClass &
modFlagEnum(FlagEnumClass &flagVariable, FlagEnumClass relevantFlags,
bool value)
85 return value ? (flagVariable += relevantFlags) : (flagVariable -= relevantFlags);
constexpr bool operator&(FlagEnumClass lhs, FlagEnumClass rhs)
constexpr FlagEnumClass & operator-=(FlagEnumClass &lhs, FlagEnumClass rhs)
constexpr FlagEnumClass & operator|=(FlagEnumClass &lhs, FlagEnumClass rhs)
constexpr FlagEnumClass & operator+=(FlagEnumClass &lhs, FlagEnumClass rhs)
constexpr FlagEnumClass operator|(FlagEnumClass lhs, FlagEnumClass rhs)
Contains all utilities provides by the c++utilities library.
constexpr FlagEnumClass & modFlagEnum(FlagEnumClass &flagVariable, FlagEnumClass relevantFlags, bool value)
Sets the specified relevantFlags in the specified flagVariable to the specified value.
The IsFlagEnumClass class is used to decide whether to enable operations for flag enums for \tp T.
Wraps a static boolean constant.