Templa 0.0.1-alpha
C++ Metaprogramming Utilities
Loading...
Searching...
No Matches
flagnum.hpp
Go to the documentation of this file.
1#pragma once
5
10namespace templa
11{
22 template <typename ENUM>
23 struct FlagEnum
24 {
25 static_assert(std::is_enum<ENUM>::value, "ENUM must be an enum type");
26
28 using underlying_t = typename std::underlying_type<ENUM>::type;
29
32
34 FlagEnum() : mask{0} {}
35
37 FlagEnum(ENUM single_flag) : mask(static_cast<underlying_t>(single_flag)) {}
38
40 FlagEnum(const FlagEnum &o) : mask(o.mask) {}
41
43 ~FlagEnum() = default;
44
50 constexpr FlagEnum &operator|=(ENUM addValue)
51 {
52 mask |= static_cast<underlying_t>(addValue);
53 return *this;
54 }
55
61 constexpr FlagEnum &operator&=(ENUM maskValue)
62 {
63 mask &= static_cast<underlying_t>(maskValue);
64 return *this;
65 }
66
72 constexpr bool operator==(ENUM maskValue) const noexcept
73 {
74 return ((this->mask & static_cast<underlying_t>(maskValue)) == static_cast<underlying_t>(maskValue));
75 }
76
81 explicit operator bool() const noexcept
82 {
83 return mask != 0;
84 }
85 };
86
90 template <typename E>
91 requires std::is_enum_v<E>
92 constexpr FlagEnum<E> operator|(E lhs, E rhs)
93 {
94 return FlagEnum<E>(lhs) | rhs;
95 }
96
100 template <typename E>
101 requires std::is_enum_v<E>
102 constexpr FlagEnum<E> operator&(E lhs, E rhs)
103 {
104 return FlagEnum<E>(lhs) & rhs;
105 }
106
110 template <typename E>
111 requires std::is_enum_v<E>
112 constexpr FlagEnum<E> operator~(E val)
113 {
114 return ~FlagEnum<E>(val);
115 }
116};
constexpr FlagEnum< E > operator~(E val)
Enables bitwise NOT for enum flags.
Definition flagnum.hpp:112
constexpr FlagEnum< E > operator|(E lhs, E rhs)
Enables bitwise OR for enum flags.
Definition flagnum.hpp:92
constexpr FlagEnum< E > operator&(E lhs, E rhs)
Enables bitwise AND for enum flags.
Definition flagnum.hpp:102
A utility wrapper for using scoped or unscoped enum types as bit flags.
Definition flagnum.hpp:24
typename std::underlying_type< ENUM >::type underlying_t
The underlying integral type used for bitwise operations.
Definition flagnum.hpp:28
FlagEnum()
Default constructor. Initializes with no flags set.
Definition flagnum.hpp:34
~FlagEnum()=default
Default destructor.
underlying_t mask
Bitmask storing the combined flag state.
Definition flagnum.hpp:31
FlagEnum(ENUM single_flag)
Constructs from a single enum flag.
Definition flagnum.hpp:37
FlagEnum(const FlagEnum &o)
Copy constructor.
Definition flagnum.hpp:40
constexpr bool operator==(ENUM maskValue) const noexcept
Equality comparison with an enum value.
Definition flagnum.hpp:72
constexpr FlagEnum & operator&=(ENUM maskValue)
Bitwise AND assignment with an enum value.
Definition flagnum.hpp:61
constexpr FlagEnum & operator|=(ENUM addValue)
Bitwise OR assignment with an enum value.
Definition flagnum.hpp:50