summaryrefslogtreecommitdiffhomepage
path: root/compat
diff options
context:
space:
mode:
Diffstat (limited to 'compat')
-rw-r--r--compat/enum-operators.hpp28
1 files changed, 28 insertions, 0 deletions
diff --git a/compat/enum-operators.hpp b/compat/enum-operators.hpp
new file mode 100644
index 00000000..e956c461
--- /dev/null
+++ b/compat/enum-operators.hpp
@@ -0,0 +1,28 @@
+#pragma once
+
+#include <type_traits>
+
+#define OTR_FLAGS_OP2(type, op) \
+ inline type operator op (type a, type b) \
+ { \
+ using t__ = std::underlying_type_t<type>; \
+ return static_cast<type>(t__((a)) op t__((b))); \
+ } // end
+
+#define OTR_FLAGS_SHIFT(type, op) \
+ type operator op (type, unsigned) = delete;
+
+#define OTR_FLAGS_OP1(type, op) \
+ inline type operator op (type x) \
+ { \
+ using t__ = std::underlying_type_t<type>; \
+ return static_cast<type>(t__((x))); \
+ } // end
+
+#define DEFINE_ENUM_OPERATORS(type) \
+ OTR_FLAGS_OP2(type, |) \
+ OTR_FLAGS_OP2(type, &) \
+ OTR_FLAGS_OP2(type, ^) \
+ OTR_FLAGS_OP1(type, ~) \
+ OTR_FLAGS_SHIFT(type, <<); \
+ OTR_FLAGS_SHIFT(type, >>); // end