summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-08-10 21:31:03 -0400
committerJonathan Bradley <jcb@pikum.xyz>2023-08-10 21:31:46 -0400
commit0a62361737652112a3dbace2c0f3f7fa025c4ca2 (patch)
treea9f4f2ac3441834bfb889468f1c474e936ab8d56 /src
parent61b2516b9f7bcc0f7f03360a645a430db495aeee (diff)
add macros
Diffstat (limited to 'src')
-rw-r--r--src/macros.hpp55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/macros.hpp b/src/macros.hpp
new file mode 100644
index 0000000..2a6b0a3
--- /dev/null
+++ b/src/macros.hpp
@@ -0,0 +1,55 @@
+#ifndef PKE_MACROS_HPP
+#define PKE_MACROS_HPP
+
+#define Q(x) #x
+#define QUOTE(x) Q(x)
+#define CONCAT2(x, y) x##y
+#define CONCAT(x, y) CONCAT2(x, y)
+
+#define TypeSafeInt2_H(TypeName, Type, Max, TypeName_T, TypeName_MAX, TypeName_T_MAX)\
+ using TypeName_T = Type; \
+ enum class TypeName : TypeName_T; \
+ constexpr TypeName_T TypeName_T_MAX = TypeName_T{Max}; \
+ constexpr TypeName TypeName_MAX = TypeName{TypeName_T_MAX}; \
+ TypeName operator+(TypeName a, TypeName_T i); \
+ TypeName operator-(TypeName a, const TypeName_T i); \
+ TypeName operator+(TypeName a, const TypeName &b); \
+ TypeName operator-(TypeName a, const TypeName &b); \
+ TypeName operator&(TypeName a, const TypeName &b); \
+ TypeName operator|(TypeName a, const TypeName &b); \
+ TypeName &operator++(TypeName &a); \
+ TypeName &operator--(TypeName &a);
+#define TypeSafeInt2_B(TypeName, TypeName_T) \
+ inline TypeName operator+(TypeName a, TypeName_T i) { \
+ return TypeName(static_cast<TypeName_T>(a) + i); \
+ } \
+ inline TypeName operator-(TypeName a, const TypeName_T i) { \
+ return TypeName(static_cast<TypeName_T>(a) - i); \
+ } \
+ inline TypeName operator+(TypeName a, const TypeName &b) { \
+ return TypeName(static_cast<TypeName_T>(a) + static_cast<TypeName_T>(b)); \
+ } \
+ inline TypeName operator-(TypeName a, const TypeName &b) { \
+ return TypeName(static_cast<TypeName_T>(a) - static_cast<TypeName_T>(b)); \
+ } \
+ inline TypeName operator&(TypeName a, const TypeName &b) { \
+ return TypeName(static_cast<TypeName_T>(a) & static_cast<TypeName_T>(b)); \
+ } \
+ inline TypeName operator|(TypeName a, const TypeName &b) { \
+ return TypeName(static_cast<TypeName_T>(a) | static_cast<TypeName_T>(b)); \
+ } \
+ inline TypeName &operator++(TypeName &a) { \
+ a = a + 1; \
+ return a; \
+ } \
+ inline TypeName &operator--(TypeName &a) { \
+ a = a - 1; \
+ return a; \
+ };
+#define TypeSafeInt_H(TypeName, Type, Max) \
+ TypeSafeInt2_H(TypeName, Type, Max, CONCAT(TypeName, _T), CONCAT(TypeName, _MAX), CONCAT(TypeName, _T_MAX))
+#define TypeSafeInt_B(TypeName) \
+ TypeSafeInt2_B(TypeName, CONCAT(TypeName, _T))
+
+
+#endif /* PKE_MACROS_HPP */