Created
September 3, 2019 23:21
-
-
Save WheretIB/2db7b0cfd04a7826012a2b6ffe08143d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define SHORT(X) typedef NullcCallBaseType<X>::type X##u; const unsigned X##s = NullcCallBaseType<X>::size | |
#define SHORTS_0 (void)argBuf | |
#define SHORTS_1 SHORT(A1) | |
#define SHORTS_2 SHORTS_1; SHORT(A2) | |
#define SHORTS_3 SHORTS_2; SHORT(A3) | |
#define SHORTS_4 SHORTS_3; SHORT(A4) | |
#define SHORTS_5 SHORTS_4; SHORT(A5) | |
#define SHORTS_6 SHORTS_5; SHORT(A6) | |
#define SHORTS_7 SHORTS_6; SHORT(A7) | |
#define SHORTS_8 SHORTS_7; SHORT(A8) | |
#define SHORTS_9 SHORTS_8; SHORT(A9) | |
#define SHORTS_10 SHORTS_9; SHORT(A10) | |
#define SHORTS_11 SHORTS_10; SHORT(A11) | |
#define SHORTS_12 SHORTS_11; SHORT(A12) | |
#define SHORTS_13 SHORTS_12; SHORT(A13) | |
#define SHORTS_14 SHORTS_13; SHORT(A14) | |
#define SHORTS_15 SHORTS_14; SHORT(A15) | |
#define OFF_1 0 | |
#define OFF_2 A1s | |
#define OFF_3 OFF_2 + A2s | |
#define OFF_4 OFF_3 + A3s | |
#define OFF_5 OFF_4 + A4s | |
#define OFF_6 OFF_5 + A5s | |
#define OFF_7 OFF_6 + A6s | |
#define OFF_8 OFF_7 + A7s | |
#define OFF_9 OFF_8 + A8s | |
#define OFF_10 OFF_9 + A9s | |
#define OFF_11 OFF_10 + A10s | |
#define OFF_12 OFF_11 + A11s | |
#define OFF_13 OFF_12 + A12s | |
#define OFF_14 OFF_13 + A13s | |
#define OFF_15 OFF_14 + A14s | |
#define ARG(X) (A##X)*(A##X##u*)(argBuf + OFF_##X) | |
#define ARGS_0 | |
#define ARGS_1 ARG(1) | |
#define ARGS_2 ARGS_1, ARG(2) | |
#define ARGS_3 ARGS_2, ARG(3) | |
#define ARGS_4 ARGS_3, ARG(4) | |
#define ARGS_5 ARGS_4, ARG(5) | |
#define ARGS_6 ARGS_5, ARG(6) | |
#define ARGS_7 ARGS_6, ARG(7) | |
#define ARGS_8 ARGS_7, ARG(8) | |
#define ARGS_9 ARGS_8, ARG(9) | |
#define ARGS_10 ARGS_9, ARG(10) | |
#define ARGS_11 ARGS_10, ARG(11) | |
#define ARGS_12 ARGS_11, ARG(12) | |
#define ARGS_13 ARGS_12, ARG(13) | |
#define ARGS_14 ARGS_13, ARG(14) | |
#define ARGS_15 ARGS_14, ARG(15) | |
#define ATYPE_0 | |
#define ATYPE_1 A1 | |
#define ATYPE_2 ATYPE_1, A2 | |
#define ATYPE_3 ATYPE_2, A3 | |
#define ATYPE_4 ATYPE_3, A4 | |
#define ATYPE_5 ATYPE_4, A5 | |
#define ATYPE_6 ATYPE_5, A6 | |
#define ATYPE_7 ATYPE_6, A7 | |
#define ATYPE_8 ATYPE_7, A8 | |
#define ATYPE_9 ATYPE_8, A9 | |
#define ATYPE_10 ATYPE_9, A10 | |
#define ATYPE_11 ATYPE_10, A11 | |
#define ATYPE_12 ATYPE_11, A12 | |
#define ATYPE_13 ATYPE_12, A13 | |
#define ATYPE_14 ATYPE_13, A14 | |
#define ATYPE_15 ATYPE_14, A15 | |
#define TTYPE_0 | |
#define TTYPE_1 , typename A1 | |
#define TTYPE_2 TTYPE_1, typename A2 | |
#define TTYPE_3 TTYPE_2, typename A3 | |
#define TTYPE_4 TTYPE_3, typename A4 | |
#define TTYPE_5 TTYPE_4, typename A5 | |
#define TTYPE_6 TTYPE_5, typename A6 | |
#define TTYPE_7 TTYPE_6, typename A7 | |
#define TTYPE_8 TTYPE_7, typename A8 | |
#define TTYPE_9 TTYPE_8, typename A9 | |
#define TTYPE_10 TTYPE_9, typename A10 | |
#define TTYPE_11 TTYPE_10, typename A11 | |
#define TTYPE_12 TTYPE_11, typename A12 | |
#define TTYPE_13 TTYPE_12, typename A13 | |
#define TTYPE_14 TTYPE_13, typename A14 | |
#define TTYPE_15 TTYPE_14, typename A15 | |
#define VOID_RET typename nullc_enable_if<nullc_is_void<R>::value, void>::type | |
#define NON_VOID_RET typename nullc_enable_if<!nullc_is_void<R>::value, void>::type | |
// Raw function wrappers | |
template<typename R TTYPE_0> | |
VOID_RET nullcWrapCall0(void *context, char* retBuf, char* argBuf) | |
{ | |
(void)retBuf; | |
SHORTS_0; | |
((R(*)(ATYPE_0))context)(ARGS_0); | |
} | |
template<typename R TTYPE_0> | |
NON_VOID_RET nullcWrapCall0(void *context, char* retBuf, char* argBuf) | |
{ | |
typedef NullcCallBaseType<R, true>::type Ru; | |
SHORTS_0; | |
*(Ru*)retBuf = (Ru)((R(*)(ATYPE_0))context)(ARGS_0); | |
} | |
template<typename R TTYPE_1> | |
VOID_RET nullcWrapCall1(void *context, char* retBuf, char* argBuf) | |
{ | |
(void)retBuf; | |
SHORTS_1; | |
((R(*)(ATYPE_1))context)(ARGS_1); | |
} | |
template<typename R TTYPE_1> | |
NON_VOID_RET nullcWrapCall1(void *context, char* retBuf, char* argBuf) | |
{ | |
typedef NullcCallBaseType<R, true>::type Ru; | |
SHORTS_1; | |
*(Ru*)retBuf = (Ru)((R(*)(ATYPE_1))context)(ARGS_1); | |
} | |
template<typename R TTYPE_2> | |
VOID_RET nullcWrapCall2(void *context, char* retBuf, char* argBuf) | |
{ | |
(void)retBuf; | |
SHORTS_2; | |
((R(*)(ATYPE_2))context)(ARGS_2); | |
} | |
template<typename R TTYPE_2> | |
NON_VOID_RET nullcWrapCall2(void *context, char* retBuf, char* argBuf) | |
{ | |
typedef NullcCallBaseType<R, true>::type Ru; | |
SHORTS_2; | |
*(Ru*)retBuf = (Ru)((R(*)(ATYPE_2))context)(ARGS_2); | |
} | |
template<typename R TTYPE_3> | |
VOID_RET nullcWrapCall3(void *context, char* retBuf, char* argBuf) | |
{ | |
(void)retBuf; | |
SHORTS_3; | |
((R(*)(ATYPE_3))context)(ARGS_3); | |
} | |
template<typename R TTYPE_3> | |
NON_VOID_RET nullcWrapCall3(void *context, char* retBuf, char* argBuf) | |
{ | |
typedef NullcCallBaseType<R, true>::type Ru; | |
SHORTS_3; | |
*(Ru*)retBuf = (Ru)((R(*)(ATYPE_3))context)(ARGS_3); | |
} | |
template<typename R TTYPE_4> | |
VOID_RET nullcWrapCall4(void *context, char* retBuf, char* argBuf) | |
{ | |
(void)retBuf; | |
SHORTS_4; | |
((R(*)(ATYPE_4))context)(ARGS_4); | |
} | |
template<typename R TTYPE_4> | |
NON_VOID_RET nullcWrapCall4(void *context, char* retBuf, char* argBuf) | |
{ | |
typedef NullcCallBaseType<R, true>::type Ru; | |
SHORTS_4; | |
*(Ru*)retBuf = (Ru)((R(*)(ATYPE_4))context)(ARGS_4); | |
} | |
template<typename R TTYPE_5> | |
VOID_RET nullcWrapCall5(void *context, char* retBuf, char* argBuf) | |
{ | |
(void)retBuf; | |
SHORTS_5; | |
((R(*)(ATYPE_5))context)(ARGS_5); | |
} | |
template<typename R TTYPE_5> | |
NON_VOID_RET nullcWrapCall5(void *context, char* retBuf, char* argBuf) | |
{ | |
typedef NullcCallBaseType<R, true>::type Ru; | |
SHORTS_5; | |
*(Ru*)retBuf = (Ru)((R(*)(ATYPE_5))context)(ARGS_5); | |
} | |
template<typename R TTYPE_6> | |
VOID_RET nullcWrapCall6(void *context, char* retBuf, char* argBuf) | |
{ | |
(void)retBuf; | |
SHORTS_6; | |
((R(*)(ATYPE_6))context)(ARGS_6); | |
} | |
template<typename R TTYPE_6> | |
NON_VOID_RET nullcWrapCall6(void *context, char* retBuf, char* argBuf) | |
{ | |
typedef NullcCallBaseType<R, true>::type Ru; | |
SHORTS_6; | |
*(Ru*)retBuf = (Ru)((R(*)(ATYPE_6))context)(ARGS_6); | |
} | |
template<typename R TTYPE_7> | |
VOID_RET nullcWrapCall7(void *context, char* retBuf, char* argBuf) | |
{ | |
(void)retBuf; | |
SHORTS_7; | |
((R(*)(ATYPE_7))context)(ARGS_7); | |
} | |
template<typename R TTYPE_7> | |
NON_VOID_RET nullcWrapCall7(void *context, char* retBuf, char* argBuf) | |
{ | |
typedef NullcCallBaseType<R, true>::type Ru; | |
SHORTS_7; | |
*(Ru*)retBuf = (Ru)((R(*)(ATYPE_7))context)(ARGS_7); | |
} | |
template<typename R TTYPE_8> | |
VOID_RET nullcWrapCall8(void *context, char* retBuf, char* argBuf) | |
{ | |
(void)retBuf; | |
SHORTS_8; | |
((R(*)(ATYPE_8))context)(ARGS_8); | |
} | |
template<typename R TTYPE_8> | |
NON_VOID_RET nullcWrapCall8(void *context, char* retBuf, char* argBuf) | |
{ | |
typedef NullcCallBaseType<R, true>::type Ru; | |
SHORTS_8; | |
*(Ru*)retBuf = (Ru)((R(*)(ATYPE_8))context)(ARGS_8); | |
} | |
template<typename R TTYPE_9> | |
VOID_RET nullcWrapCall9(void *context, char* retBuf, char* argBuf) | |
{ | |
(void)retBuf; | |
SHORTS_9; | |
((R(*)(ATYPE_9))context)(ARGS_9); | |
} | |
template<typename R TTYPE_9> | |
NON_VOID_RET nullcWrapCall9(void *context, char* retBuf, char* argBuf) | |
{ | |
typedef NullcCallBaseType<R, true>::type Ru; | |
SHORTS_9; | |
*(Ru*)retBuf = (Ru)((R(*)(ATYPE_9))context)(ARGS_9); | |
} | |
template<typename R TTYPE_10> | |
VOID_RET nullcWrapCall10(void *context, char* retBuf, char* argBuf) | |
{ | |
(void)retBuf; | |
SHORTS_10; | |
((R(*)(ATYPE_10))context)(ARGS_10); | |
} | |
template<typename R TTYPE_10> | |
NON_VOID_RET nullcWrapCall10(void *context, char* retBuf, char* argBuf) | |
{ | |
typedef NullcCallBaseType<R, true>::type Ru; | |
SHORTS_10; | |
*(Ru*)retBuf = (Ru)((R(*)(ATYPE_10))context)(ARGS_10); | |
} | |
template<typename R TTYPE_11> | |
VOID_RET nullcWrapCall11(void *context, char* retBuf, char* argBuf) | |
{ | |
(void)retBuf; | |
SHORTS_11; | |
((R(*)(ATYPE_11))context)(ARGS_11); | |
} | |
template<typename R TTYPE_11> | |
NON_VOID_RET nullcWrapCall11(void *context, char* retBuf, char* argBuf) | |
{ | |
typedef NullcCallBaseType<R, true>::type Ru; | |
SHORTS_11; | |
*(Ru*)retBuf = (Ru)((R(*)(ATYPE_11))context)(ARGS_11); | |
} | |
template<typename R TTYPE_12> | |
VOID_RET nullcWrapCall12(void *context, char* retBuf, char* argBuf) | |
{ | |
(void)retBuf; | |
SHORTS_12; | |
((R(*)(ATYPE_12))context)(ARGS_12); | |
} | |
template<typename R TTYPE_12> | |
NON_VOID_RET nullcWrapCall12(void *context, char* retBuf, char* argBuf) | |
{ | |
typedef NullcCallBaseType<R, true>::type Ru; | |
SHORTS_12; | |
*(Ru*)retBuf = (Ru)((R(*)(ATYPE_12))context)(ARGS_12); | |
} | |
template<typename R TTYPE_13> | |
VOID_RET nullcWrapCall13(void *context, char* retBuf, char* argBuf) | |
{ | |
(void)retBuf; | |
SHORTS_13; | |
((R(*)(ATYPE_13))context)(ARGS_13); | |
} | |
template<typename R TTYPE_13> | |
NON_VOID_RET nullcWrapCall13(void *context, char* retBuf, char* argBuf) | |
{ | |
typedef NullcCallBaseType<R, true>::type Ru; | |
SHORTS_13; | |
*(Ru*)retBuf = (Ru)((R(*)(ATYPE_13))context)(ARGS_13); | |
} | |
template<typename R TTYPE_14> | |
VOID_RET nullcWrapCall14(void *context, char* retBuf, char* argBuf) | |
{ | |
(void)retBuf; | |
SHORTS_14; | |
((R(*)(ATYPE_14))context)(ARGS_14); | |
} | |
template<typename R TTYPE_14> | |
NON_VOID_RET nullcWrapCall14(void *context, char* retBuf, char* argBuf) | |
{ | |
typedef NullcCallBaseType<R, true>::type Ru; | |
SHORTS_14; | |
*(Ru*)retBuf = (Ru)((R(*)(ATYPE_14))context)(ARGS_14); | |
} | |
template<typename R TTYPE_15> | |
VOID_RET nullcWrapCall15(void *context, char* retBuf, char* argBuf) | |
{ | |
(void)retBuf; | |
SHORTS_15; | |
((R(*)(ATYPE_15))context)(ARGS_15); | |
} | |
template<typename R TTYPE_15> | |
NON_VOID_RET nullcWrapCall15(void *context, char* retBuf, char* argBuf) | |
{ | |
typedef NullcCallBaseType<R, true>::type Ru; | |
SHORTS_15; | |
*(Ru*)retBuf = (Ru)((R(*)(ATYPE_15))context)(ARGS_15); | |
} | |
// Function wrapper creation | |
typedef void (*nullcFunc)(void*, char*, char*); | |
#define COMMA_0 | |
#define COMMA_1 , | |
#define COMMA(cond) COMMA_##cond | |
#define DEFINE_CALL_WRAPPER(X, Y) template<typename R TTYPE_##X> nullcFunc nullcGetCallWrapper(R(*)(ATYPE_##X)){ return nullcWrapCall##X<R COMMA(Y) ATYPE_##X>; } | |
DEFINE_CALL_WRAPPER(0, 0) | |
DEFINE_CALL_WRAPPER(1, 1) | |
DEFINE_CALL_WRAPPER(2, 1) | |
DEFINE_CALL_WRAPPER(3, 1) | |
DEFINE_CALL_WRAPPER(4, 1) | |
DEFINE_CALL_WRAPPER(5, 1) | |
DEFINE_CALL_WRAPPER(6, 1) | |
DEFINE_CALL_WRAPPER(7, 1) | |
DEFINE_CALL_WRAPPER(8, 1) | |
DEFINE_CALL_WRAPPER(9, 1) | |
DEFINE_CALL_WRAPPER(10, 1) | |
DEFINE_CALL_WRAPPER(11, 1) | |
DEFINE_CALL_WRAPPER(12, 1) | |
DEFINE_CALL_WRAPPER(13, 1) | |
DEFINE_CALL_WRAPPER(14, 1) | |
DEFINE_CALL_WRAPPER(15, 1) | |
// Bind functions directly | |
#define DEFINE_HELPER_WRAPPER(X) template<typename R TTYPE_##X> nullres nullcBindModuleFunctionHelper(const char* module, R(*f)(ATYPE_##X), const char* name, int index){ return nullcBindModuleFunctionWrapper(module, (void*)f, nullcGetCallWrapper(f), name, index); } | |
DEFINE_HELPER_WRAPPER(0) | |
DEFINE_HELPER_WRAPPER(1) | |
DEFINE_HELPER_WRAPPER(2) | |
DEFINE_HELPER_WRAPPER(3) | |
DEFINE_HELPER_WRAPPER(4) | |
DEFINE_HELPER_WRAPPER(5) | |
DEFINE_HELPER_WRAPPER(6) | |
DEFINE_HELPER_WRAPPER(7) | |
DEFINE_HELPER_WRAPPER(8) | |
DEFINE_HELPER_WRAPPER(9) | |
DEFINE_HELPER_WRAPPER(10) | |
DEFINE_HELPER_WRAPPER(11) | |
DEFINE_HELPER_WRAPPER(12) | |
DEFINE_HELPER_WRAPPER(13) | |
DEFINE_HELPER_WRAPPER(14) | |
DEFINE_HELPER_WRAPPER(15) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment