C++ Utilities  5.10.5
Useful C++ classes and routines such as argument parser, IO and conversion utilities
flagenumclass.h
Go to the documentation of this file.
1 #ifndef CPP_UTILITIES_FLAG_ENUM_CLASS_H
2 #define CPP_UTILITIES_FLAG_ENUM_CLASS_H
3 
4 #include "./traits.h"
5 
6 namespace CppUtilities {
7 
12 template <typename T> struct IsFlagEnumClass : public Traits::Bool<false> {
13 };
14 
15 // clang-format off
22 #define CPP_UTILITIES_MARK_FLAG_ENUM_CLASS(Namespace, EnumClassType) \
23  namespace CppUtilities { \
24  template <> struct IsFlagEnumClass<EnumClassType> : Traits::Bool<true> { \
25  }; \
26  } \
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-=; \
33  }
34 // clang-format on
35 
40 namespace FlagEnumClassOperations {
41 
42 template <typename FlagEnumClass, Traits::EnableIf<IsFlagEnumClass<FlagEnumClass>> * = nullptr>
43 constexpr FlagEnumClass operator|(FlagEnumClass lhs, FlagEnumClass rhs)
44 {
45  return static_cast<FlagEnumClass>(
46  static_cast<typename std::underlying_type<FlagEnumClass>::type>(lhs) | static_cast<typename std::underlying_type<FlagEnumClass>::type>(rhs));
47 }
48 
49 template <typename FlagEnumClass, Traits::EnableIf<IsFlagEnumClass<FlagEnumClass>> * = nullptr>
50 constexpr bool operator&(FlagEnumClass lhs, FlagEnumClass rhs)
51 {
52  return static_cast<typename std::underlying_type<FlagEnumClass>::type>(lhs)
53  & static_cast<typename std::underlying_type<FlagEnumClass>::type>(rhs);
54 }
55 
56 template <typename FlagEnumClass, Traits::EnableIf<IsFlagEnumClass<FlagEnumClass>> * = nullptr>
57 constexpr FlagEnumClass &operator|=(FlagEnumClass &lhs, FlagEnumClass rhs)
58 {
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));
61 }
62 
63 template <typename FlagEnumClass, Traits::EnableIf<IsFlagEnumClass<FlagEnumClass>> * = nullptr>
64 constexpr FlagEnumClass &operator+=(FlagEnumClass &lhs, FlagEnumClass rhs)
65 {
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));
68 }
69 
70 template <typename FlagEnumClass, Traits::EnableIf<IsFlagEnumClass<FlagEnumClass>> * = nullptr>
71 constexpr FlagEnumClass &operator-=(FlagEnumClass &lhs, FlagEnumClass rhs)
72 {
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)));
75 }
76 
77 } // namespace FlagEnumClassOperations
78 
82 template <typename FlagEnumClass, Traits::EnableIf<IsFlagEnumClass<FlagEnumClass>> * = nullptr>
83 constexpr FlagEnumClass &modFlagEnum(FlagEnumClass &flagVariable, FlagEnumClass relevantFlags, bool value)
84 {
85  return value ? (flagVariable += relevantFlags) : (flagVariable -= relevantFlags);
86 }
87 
88 } // namespace CppUtilities
89 
90 #endif // CPP_UTILITIES_FLAG_ENUM_CLASS_H
constexpr bool operator&(FlagEnumClass lhs, FlagEnumClass rhs)
Definition: flagenumclass.h:50
constexpr FlagEnumClass & operator-=(FlagEnumClass &lhs, FlagEnumClass rhs)
Definition: flagenumclass.h:71
constexpr FlagEnumClass & operator|=(FlagEnumClass &lhs, FlagEnumClass rhs)
Definition: flagenumclass.h:57
constexpr FlagEnumClass & operator+=(FlagEnumClass &lhs, FlagEnumClass rhs)
Definition: flagenumclass.h:64
constexpr FlagEnumClass operator|(FlagEnumClass lhs, FlagEnumClass rhs)
Definition: flagenumclass.h:43
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.
Definition: flagenumclass.h:83
The IsFlagEnumClass class is used to decide whether to enable operations for flag enums for \tp T.
Definition: flagenumclass.h:12
Wraps a static boolean constant.
Definition: traits.h:23