Просмотр исходного кода

common: common_funcs: Add a macro for defining enum flag operators.

bunnei 6 лет назад
Родитель
Сommit
b11b424a2d
1 измененных файлов с 32 добавлено и 0 удалено
  1. 32 0
      src/common/common_funcs.h

+ 32 - 0
src/common/common_funcs.h

@@ -55,6 +55,38 @@ __declspec(dllimport) void __stdcall DebugBreak(void);
 // Defined in Misc.cpp.
 std::string GetLastErrorMsg();
 
+#define DECLARE_ENUM_FLAG_OPERATORS(type)                                                          \
+    constexpr type operator|(type a, type b) noexcept {                                            \
+        using T = std::underlying_type_t<type>;                                                    \
+        return static_cast<type>(static_cast<T>(a) | static_cast<T>(b));                           \
+    }                                                                                              \
+    constexpr type operator&(type a, type b) noexcept {                                            \
+        using T = std::underlying_type_t<type>;                                                    \
+        return static_cast<type>(static_cast<T>(a) & static_cast<T>(b));                           \
+    }                                                                                              \
+    constexpr type& operator|=(type& a, type b) noexcept {                                         \
+        using T = std::underlying_type_t<type>;                                                    \
+        a = static_cast<type>(static_cast<T>(a) | static_cast<T>(b));                              \
+        return a;                                                                                  \
+    }                                                                                              \
+    constexpr type& operator&=(type& a, type b) noexcept {                                         \
+        using T = std::underlying_type_t<type>;                                                    \
+        a = static_cast<type>(static_cast<T>(a) & static_cast<T>(b));                              \
+        return a;                                                                                  \
+    }                                                                                              \
+    constexpr type operator~(type key) noexcept {                                                  \
+        using T = std::underlying_type_t<type>;                                                    \
+        return static_cast<type>(~static_cast<T>(key));                                            \
+    }                                                                                              \
+    constexpr bool True(type key) noexcept {                                                       \
+        using T = std::underlying_type_t<type>;                                                    \
+        return static_cast<T>(key) != 0;                                                           \
+    }                                                                                              \
+    constexpr bool False(type key) noexcept {                                                      \
+        using T = std::underlying_type_t<type>;                                                    \
+        return static_cast<T>(key) == 0;                                                           \
+    }
+
 namespace Common {
 
 constexpr u32 MakeMagic(char a, char b, char c, char d) {