Foundation
Loading...
Searching...
No Matches
Enums.hpp
Go to the documentation of this file.
1#pragma once
2#include <cstddef>
3#include <bit>
7namespace Foundation::Bits
8{
14 template <typename T, typename Ty> struct BitmaskEnumWrapper {
19 BitmaskEnumWrapper operator=(auto v) { value = static_cast<Ty>(v); return *this; }
20 BitmaskEnumWrapper operator|(auto v) const { return { value | static_cast<Ty>(v) }; }
21 BitmaskEnumWrapper operator&(auto v) const { return { value & static_cast<Ty>(v) }; }
22 BitmaskEnumWrapper operator^(auto v) const { return { value ^ static_cast<Ty>(v) }; }
23 BitmaskEnumWrapper operator~() const { return { ~value }; }
24 BitmaskEnumWrapper& operator|=(auto v) { value |= static_cast<Ty>(v); return *this; }
25 BitmaskEnumWrapper& operator&=(auto v) { value &= static_cast<Ty>(v); return *this; }
26 BitmaskEnumWrapper& operator^=(auto v) { value ^= static_cast<Ty>(v); return *this; }
27 constexpr bool operator ==(auto v) const { return value == static_cast<Ty>(v); }
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; }
31 [[nodiscard]] constexpr bool is_pow2() const { return (value & (value - 1)) == 0; }
32 [[nodiscard]] constexpr bool is_bitmask() const { return is_pow2(); }
33 [[nodiscard]] constexpr int bit() const {
34 constexpr size_t bits = sizeof(Ty) * 8;
35 return std::countr_zero(value) & (bits - 1);
36 }
37 };
38} // namespace Foundation::Bits
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 {
61
62#define BITMASK_ENUM_END() };
63
84#define ENUM_NAME_CONV_BEGIN(T) \
85inline constexpr const char* format_as(T elem) { \
86 using enum T; \
87 switch (elem) {
88
89#define ENUM_NAME_CONV_END() \
90 default: \
91 return "Unknown"; \
92 } \
93}
94// Shorthand for @ref ENUM_NAME_CONV_BEGIN case statements
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