77
88#pragma once
99
10- #include < assert.h>
1110#include < concepts>
1211#include < cstdint>
1312
13+ #include " Utils/Assert.h"
1414#include " Utils/Misc.h"
1515
1616namespace ADT {
@@ -21,72 +21,72 @@ namespace ADT {
2121
2222 template <typename E>
2323 constexpr auto addMask (const E Mask) noexcept {
24- Flags |= static_cast <T>(Mask);
24+ this -> Flags |= static_cast <T>(Mask);
2525 }
2626
2727 template <typename E>
2828 constexpr auto removeMask (const E Mask) noexcept {
29- Flags &= ~static_cast <T>(Mask);
29+ this -> Flags &= ~static_cast <T>(Mask);
3030 }
3131
3232 template <typename E, typename S, typename V>
3333 constexpr void
3434 setValueForMask (const E Mask, const S Shift, const V Value) noexcept {
35- removeMask (Mask);
36- addMask (static_cast <T>(Value) << static_cast <T>(Shift));
35+ this -> removeMask (Mask);
36+ this -> addMask (static_cast <T>(Value) << static_cast <T>(Shift));
3737 }
3838
3939 template <typename E>
4040 [[nodiscard]] constexpr auto valueForMask (const E Mask) const noexcept {
41- return Flags & static_cast <T>(Mask);
41+ return this -> Flags & static_cast <T>(Mask);
4242 }
4343
4444 template <typename E>
4545 [[nodiscard]] constexpr auto has (const E Mask) const noexcept {
46- return valueForMask (Mask) != 0 ;
46+ return this -> valueForMask (Mask) != 0 ;
4747 }
4848 public:
4949 constexpr FlagsBase () noexcept = default;
5050 constexpr FlagsBase (const T Flags) noexcept : Flags(Flags) {}
5151
5252 [[nodiscard]]
5353 constexpr auto operator |(const FlagsBase<T> Mask) const noexcept {
54- return Flags | Mask;
54+ return this -> Flags | Mask;
5555 }
5656
5757 [[nodiscard]]
5858 constexpr auto operator &(const FlagsBase<T> Mask) const noexcept {
59- return Flags & Mask;
59+ return this -> Flags & Mask;
6060 }
6161
6262 constexpr auto operator |=(const FlagsBase<T> Mask) const noexcept
6363 -> decltype (*this )
6464 {
65- Flags |= Mask;
65+ this -> Flags |= Mask;
6666 return *this ;
6767 }
6868
6969 constexpr auto operator &=(const FlagsBase<T> Mask) const noexcept
7070 -> decltype (*this )
7171 {
72- Flags &= Mask;
72+ this -> Flags &= Mask;
7373 return *this ;
7474 }
7575
7676 [[nodiscard]] constexpr auto operator ~() const noexcept {
77- return FlagsBase (~Flags);
77+ return FlagsBase (~this -> Flags );
7878 }
7979
8080 [[nodiscard]] constexpr auto empty () const noexcept {
81- return Flags == 0 ;
81+ return this -> Flags == 0 ;
8282 }
8383
8484 [[nodiscard]] constexpr auto value () const noexcept {
85- return Flags;
85+ return this -> Flags ;
8686 }
8787
8888 constexpr auto clear () noexcept -> decltype(*this ) {
89- Flags = 0 ;
89+ this -> Flags = 0 ;
9090 return *this ;
9191 }
9292
@@ -116,6 +116,7 @@ namespace ADT {
116116 {
117117 assert (!Utils::IndexOutOfBounds (Index, bit_sizeof (T)));
118118
119+ auto Flags = this ->Flags ;
119120 if constexpr (sizeof (T) == sizeof (long long )) {
120121 return __builtin_popcountll (Flags >> Index);
121122 } else if constexpr (sizeof (T) == sizeof (long )) {
@@ -131,15 +132,15 @@ namespace ADT {
131132 {
132133 assert (BitCount <= bit_sizeof (T));
133134
134- Flags >>= BitCount;
135+ this -> Flags >>= BitCount;
135136 return *this ;
136137 }
137138
138139 [[nodiscard]] constexpr
139140 auto operator <=>(const FlagsBase<T> &Rhs) const noexcept = default ;
140141
141142 [[nodiscard]] constexpr auto operator <=>(const T Rhs) const noexcept {
142- return Flags <=> Rhs;
143+ return this -> Flags <=> Rhs;
143144 }
144145 };
145146}
@@ -181,17 +182,17 @@ namespace ADT {
181182 } \
182183\
183184 [[maybe_unused]] [[nodiscard]] \
184- constexpr static auto operator == (std::underlying_type_t <ENUM> Num,\
185- const ENUM Mask) noexcept \
185+ constexpr static auto operator <=> (std::underlying_type_t <ENUM> Num,\
186+ const ENUM Mask) noexcept \
186187 { \
187- return Num == static_cast <std::underlying_type_t <ENUM>>(Mask); \
188+ return Num <=> static_cast <std::underlying_type_t <ENUM>>(Mask); \
188189 } \
189190\
190191 [[maybe_unused]] [[nodiscard]] \
191- constexpr static auto operator == (const ENUM Mask,\
192- std::underlying_type_t <ENUM> Num) noexcept \
192+ constexpr static auto operator <=> (const ENUM Mask,\
193+ std::underlying_type_t <ENUM> Num) noexcept \
193194 { \
194- return Num == static_cast <std::underlying_type_t <ENUM>>(Mask); \
195+ return Num <=> static_cast <std::underlying_type_t <ENUM>>(Mask); \
195196 } \
196197\
197198 [[maybe_unused]] [[nodiscard]] \
0 commit comments