C++ Utilities 5.14.0
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
6namespace CppUtilities {
7
12template <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
40namespace FlagEnumClassOperations {
41
42template <typename FlagEnumClass, Traits::EnableIf<IsFlagEnumClass<FlagEnumClass>> * = nullptr>
43constexpr 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
49template <typename FlagEnumClass, Traits::EnableIf<IsFlagEnumClass<FlagEnumClass>> * = nullptr>
50constexpr 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
56template <typename FlagEnumClass, Traits::EnableIf<IsFlagEnumClass<FlagEnumClass>> * = nullptr>
57constexpr 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
63template <typename FlagEnumClass, Traits::EnableIf<IsFlagEnumClass<FlagEnumClass>> * = nullptr>
64constexpr 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
70template <typename FlagEnumClass, Traits::EnableIf<IsFlagEnumClass<FlagEnumClass>> * = nullptr>
71constexpr 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
82template <typename FlagEnumClass, Traits::EnableIf<IsFlagEnumClass<FlagEnumClass>> * = nullptr>
83constexpr 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 FlagEnumClass & operator-=(FlagEnumClass &lhs, FlagEnumClass rhs)
Definition: flagenumclass.h:71
constexpr FlagEnumClass & operator+=(FlagEnumClass &lhs, FlagEnumClass rhs)
Definition: flagenumclass.h:64
constexpr bool operator&(FlagEnumClass lhs, FlagEnumClass rhs)
Definition: flagenumclass.h:50
constexpr FlagEnumClass operator|(FlagEnumClass lhs, FlagEnumClass rhs)
Definition: flagenumclass.h:43
constexpr FlagEnumClass & operator|=(FlagEnumClass &lhs, FlagEnumClass rhs)
Definition: flagenumclass.h:57
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