summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt1
-rw-r--r--src/macros.hpp55
2 files changed, 56 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0a3f4f7..f832232 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -13,6 +13,7 @@ set(CMAKE_CXX_FLAGS_RELEASE "-O3 -s DNDEBUG")
set(PKE_SOURCE_FILES
src/main.cpp
+ src/macros.hpp
src/memory.hpp
src/memory.cpp
src/window.hpp
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 */