28 constexpr operator Ty()
const {
return static_cast<Ty>(
value); }
29 constexpr operator T()
const {
return static_cast<T>(
value); }
30 constexpr operator bool()
const {
return value != 0; }
34 constexpr size_t bits =
sizeof(
Ty) * 8;
35 return std::countr_zero(
value) & (
bits - 1);
49#define BITMASK_ENUM_BEGIN(T,INT_T) \
50enum class T##Bits : INT_T; \
51inline constexpr INT_T to_integer(T##Bits e) { return static_cast<INT_T>(e); } \
52using T = Foundation::Bits::BitmaskEnumWrapper<T##Bits, INT_T>; \
53inline T##Bits operator & (T##Bits x, T##Bits y) { return static_cast<T##Bits>(static_cast<INT_T>(x) & static_cast<INT_T>(y)); }; \
54inline T##Bits operator | (T##Bits x, T##Bits y) { return static_cast<T##Bits>(static_cast<INT_T>(x) | static_cast<INT_T>(y)); }; \
55inline T##Bits operator ^ (T##Bits x, T##Bits y) { return static_cast<T##Bits>(static_cast<INT_T>(x) ^ static_cast<INT_T>(y)); }; \
56inline T##Bits operator ~ (T##Bits x) { return static_cast<T##Bits>(~static_cast<INT_T>(x)); }; \
57inline T##Bits& operator &= (T##Bits& x, T##Bits y) { x = static_cast<T##Bits>(x & y); return x; }; \
58inline T##Bits& operator |= (T##Bits& x, T##Bits y) { x = static_cast<T##Bits>(x | y); return x; }; \
59inline T##Bits& operator ^= (T##Bits& x, T##Bits y) { x = static_cast<T##Bits>(x ^ y); return x; }; \
60enum class T##Bits : INT_T {
62#define BITMASK_ENUM_END() };
84#define ENUM_NAME_CONV_BEGIN(T) \
85inline constexpr const char* format_as(T elem) { \
89#define ENUM_NAME_CONV_END() \
95#define ENUM_NAME(E) case E: return #E;
Header-only convenience utilities.
Definition Chrono.hpp:3
std::unique_ptr< T, StlDeleter< T > > UniquePtr
std::unique_ptr with custom deleter that uses a Foundation::Core::Allocator to deallocate memory.
Definition Allocator.hpp:161
Wrapper for bitmask enum types that provides bitwise operators.
Definition Enums.hpp:14
BitmaskEnumWrapper & operator^=(auto v)
Definition Enums.hpp:26
BitmaskEnumWrapper operator&(auto v) const
Definition Enums.hpp:21
constexpr bool is_pow2() const
Definition Enums.hpp:31
BitmaskEnumWrapper operator=(auto v)
Definition Enums.hpp:19
BitmaskEnumWrapper operator^(auto v) const
Definition Enums.hpp:22
BitmaskEnumWrapper & operator&=(auto v)
Definition Enums.hpp:25
BitmaskEnumWrapper()
Definition Enums.hpp:16
BitmaskEnumWrapper operator|(auto v) const
Definition Enums.hpp:20
BitmaskEnumWrapper(T v)
Definition Enums.hpp:17
Ty value
Definition Enums.hpp:15
BitmaskEnumWrapper operator~() const
Definition Enums.hpp:23
constexpr bool is_bitmask() const
Definition Enums.hpp:32
BitmaskEnumWrapper(Ty v)
Definition Enums.hpp:18
BitmaskEnumWrapper & operator|=(auto v)
Definition Enums.hpp:24
constexpr bool operator==(auto v) const
Definition Enums.hpp:27
constexpr int bit() const
Definition Enums.hpp:33