diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2023-08-10 21:31:03 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2023-08-10 21:31:46 -0400 |
| commit | 0a62361737652112a3dbace2c0f3f7fa025c4ca2 (patch) | |
| tree | a9f4f2ac3441834bfb889468f1c474e936ab8d56 /src | |
| parent | 61b2516b9f7bcc0f7f03360a645a430db495aeee (diff) | |
add macros
Diffstat (limited to 'src')
| -rw-r--r-- | src/macros.hpp | 55 |
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 */ |
