C++ Utilities 5.22.0
Useful C++ classes and routines such as argument parser, IO and conversion utilities
Loading...
Searching...
No Matches
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// clang-format off
21#define CPP_UTILITIES_MARK_FLAG_ENUM_CLASS(Namespace, EnumClassType) \
22 namespace CppUtilities { \
23 template <> struct IsFlagEnumClass<EnumClassType> : Traits::Bool<true> { \
24 }; \
25 } \
26 namespace Namespace { \
27 using CppUtilities::FlagEnumClassOperations::operator|; \
28 using CppUtilities::FlagEnumClassOperations::operator&; \
29 using CppUtilities::FlagEnumClassOperations::operator|=; \
30 using CppUtilities::FlagEnumClassOperations::operator+=; \
31 using CppUtilities::FlagEnumClassOperations::operator-=; \
32 }
33// clang-format on
34
39namespace FlagEnumClassOperations {
40
41template <typename FlagEnumClass, Traits::EnableIf<IsFlagEnumClass<FlagEnumClass>> * = nullptr>
42constexpr FlagEnumClass operator|(FlagEnumClass lhs, FlagEnumClass rhs)
43{
44 return static_cast<FlagEnumClass>(
45 static_cast<typename std::underlying_type<FlagEnumClass>::type>(lhs) | static_cast<typename std::underlying_type<FlagEnumClass>::type>(rhs));
46}
47
48template <typename FlagEnumClass, Traits::EnableIf<IsFlagEnumClass<FlagEnumClass>> * = nullptr>
49constexpr bool operator&(FlagEnumClass lhs, FlagEnumClass rhs)
50{
51 return static_cast<typename std::underlying_type<FlagEnumClass>::type>(lhs)
52 & static_cast<typename std::underlying_type<FlagEnumClass>::type>(rhs);
53}
54
55template <typename FlagEnumClass, Traits::EnableIf<IsFlagEnumClass<FlagEnumClass>> * = nullptr>
56constexpr FlagEnumClass &operator|=(FlagEnumClass &lhs, FlagEnumClass rhs)
57{
58 return lhs = static_cast<FlagEnumClass>(static_cast<typename std::underlying_type<FlagEnumClass>::type>(lhs)
59 | static_cast<typename std::underlying_type<FlagEnumClass>::type>(rhs));
60}
61
62template <typename FlagEnumClass, Traits::EnableIf<IsFlagEnumClass<FlagEnumClass>> * = nullptr>
63constexpr FlagEnumClass &operator+=(FlagEnumClass &lhs, FlagEnumClass rhs)
64{
65 return lhs = static_cast<FlagEnumClass>(static_cast<typename std::underlying_type<FlagEnumClass>::type>(lhs)
66 | static_cast<typename std::underlying_type<FlagEnumClass>::type>(rhs));
67}
68
69template <typename FlagEnumClass, Traits::EnableIf<IsFlagEnumClass<FlagEnumClass>> * = nullptr>
70constexpr FlagEnumClass &operator-=(FlagEnumClass &lhs, FlagEnumClass rhs)
71{
72 return lhs = static_cast<FlagEnumClass>(static_cast<typename std::underlying_type<FlagEnumClass>::type>(lhs)
73 & (~static_cast<typename std::underlying_type<FlagEnumClass>::type>(rhs)));
74}
75
76} // namespace FlagEnumClassOperations
77
81template <typename FlagEnumClass, Traits::EnableIf<IsFlagEnumClass<FlagEnumClass>> * = nullptr>
82constexpr FlagEnumClass &modFlagEnum(FlagEnumClass &flagVariable, FlagEnumClass relevantFlags, bool value)
83{
84 return value ? (flagVariable += relevantFlags) : (flagVariable -= relevantFlags);
85}
86
90template <typename FlagEnumClass, Traits::EnableIf<IsFlagEnumClass<FlagEnumClass>> * = nullptr>
91constexpr bool checkFlagEnum(FlagEnumClass flagVariable, FlagEnumClass flagsToCheck)
92{
93 return (static_cast<typename std::underlying_type<FlagEnumClass>::type>(flagVariable)
94 & static_cast<typename std::underlying_type<FlagEnumClass>::type>(flagsToCheck))
95 == static_cast<typename std::underlying_type<FlagEnumClass>::type>(flagsToCheck);
96}
97
98} // namespace CppUtilities
99
100#endif // CPP_UTILITIES_FLAG_ENUM_CLASS_H
constexpr FlagEnumClass & operator-=(FlagEnumClass &lhs, FlagEnumClass rhs)
Definition: flagenumclass.h:70
constexpr FlagEnumClass & operator+=(FlagEnumClass &lhs, FlagEnumClass rhs)
Definition: flagenumclass.h:63
constexpr bool operator&(FlagEnumClass lhs, FlagEnumClass rhs)
Definition: flagenumclass.h:49
constexpr FlagEnumClass operator|(FlagEnumClass lhs, FlagEnumClass rhs)
Definition: flagenumclass.h:42
constexpr FlagEnumClass & operator|=(FlagEnumClass &lhs, FlagEnumClass rhs)
Definition: flagenumclass.h:56
Contains all utilities provides by the c++utilities library.
constexpr bool checkFlagEnum(FlagEnumClass flagVariable, FlagEnumClass flagsToCheck)
Returns whether the specified flagVariable has set all flags specified via flagsToCheck to true.
Definition: flagenumclass.h:91
constexpr FlagEnumClass & modFlagEnum(FlagEnumClass &flagVariable, FlagEnumClass relevantFlags, bool value)
Sets the specified relevantFlags in the specified flagVariable to the specified value.
Definition: flagenumclass.h:82
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