Created
March 14, 2018 20:14
-
-
Save SirKane/4e888832809dc395f83f873ac9b05e08 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
#ifndef DISPATCH_H | |
#define DISPATCH_H | |
#include <stdarg.h> | |
template<typename T>struct TVaListTypeMap{ | |
typedef T Type; | |
}; | |
template<> struct TVaListTypeMap<float>{ | |
typedef double Type; | |
}; | |
template<> struct TVaListTypeMap<const float>{ | |
typedef const double Type; | |
}; | |
template<typename TReturnType, typename TArg0> | |
inline TReturnType VaListDispatch(TReturnType(*pfnFunction)(TArg0), | |
va_list vaList){ | |
TArg0 arg0 = TArg0(va_arg(vaList, TVaListTypeMap<TArg0>::Type)); | |
return pfnFunction(arg0); | |
} | |
template<typename TReturnType, typename TArg0, typename TArg1> | |
inline TReturnType VaListDispatch(TReturnType(*pfnFunction)(TArg0, TArg1), | |
va_list vaList){ | |
TArg0 arg0 = TArg0(va_arg(vaList, TVaListTypeMap<TArg0>::Type)); | |
TArg1 arg1 = TArg1(va_arg(vaList, TVaListTypeMap<TArg1>::Type)); | |
return pfnFunction(arg0, arg1); | |
} | |
template<typename TReturnType, typename TArg0, typename TArg1, typename TArg2> | |
inline TReturnType VaListDispatch(TReturnType(*pfnFunction)(TArg0, TArg1, TArg2), | |
va_list vaList){ | |
TArg0 arg0 = TArg0(va_arg(vaList, TVaListTypeMap<TArg0>::Type)); | |
TArg1 arg1 = TArg1(va_arg(vaList, TVaListTypeMap<TArg1>::Type)); | |
TArg2 arg2 = TArg2(va_arg(vaList, TVaListTypeMap<TArg2>::Type)); | |
return pfnFunction(arg0, arg1, arg2); | |
} | |
template<typename TReturnType, typename TArg0, typename TArg1, typename TArg2, | |
typename TArg3> | |
inline TReturnType VaListDispatch(TReturnType(*pfnFunction)(TArg0, TArg1, | |
TArg2, TArg3), | |
va_list vaList){ | |
TArg0 arg0 = TArg0(va_arg(vaList, TVaListTypeMap<TArg0>::Type)); | |
TArg1 arg1 = TArg1(va_arg(vaList, TVaListTypeMap<TArg1>::Type)); | |
TArg2 arg2 = TArg2(va_arg(vaList, TVaListTypeMap<TArg2>::Type)); | |
TArg3 arg3 = TArg3(va_arg(vaList, TVaListTypeMap<TArg3>::Type)); | |
return pfnFunction(arg0, arg1, arg2, arg3); | |
} | |
template<typename TReturnType, typename TArg0, typename TArg1, typename TArg2, | |
typename TArg3, typename TArg4> | |
inline TReturnType VaListDispatch(TReturnType(*pfnFunction)(TArg0, TArg1, | |
TArg2, TArg3, TArg4), | |
va_list vaList){ | |
TArg0 arg0 = TArg0(va_arg(vaList, TVaListTypeMap<TArg0>::Type)); | |
TArg1 arg1 = TArg1(va_arg(vaList, TVaListTypeMap<TArg1>::Type)); | |
TArg2 arg2 = TArg2(va_arg(vaList, TVaListTypeMap<TArg2>::Type)); | |
TArg3 arg3 = TArg3(va_arg(vaList, TVaListTypeMap<TArg3>::Type)); | |
TArg4 arg4 = TArg4(va_arg(vaList, TVaListTypeMap<TArg4>::Type)); | |
return pfnFunction(arg0, arg1, arg2, arg3, arg4); | |
} | |
template<typename TReturnType, typename TArg0, typename TArg1, typename TArg2, | |
typename TArg3, typename TArg4, typename TArg5> | |
inline TReturnType VaListDispatch(TReturnType(*pfnFunction)(TArg0, TArg1, | |
TArg2, TArg3, TArg4, TArg5), | |
va_list vaList){ | |
TArg0 arg0 = TArg0(va_arg(vaList, TVaListTypeMap<TArg0>::Type)); | |
TArg1 arg1 = TArg1(va_arg(vaList, TVaListTypeMap<TArg1>::Type)); | |
TArg2 arg2 = TArg2(va_arg(vaList, TVaListTypeMap<TArg2>::Type)); | |
TArg3 arg3 = TArg3(va_arg(vaList, TVaListTypeMap<TArg3>::Type)); | |
TArg4 arg4 = TArg4(va_arg(vaList, TVaListTypeMap<TArg4>::Type)); | |
TArg5 arg5 = TArg5(va_arg(vaList, TVaListTypeMap<TArg5>::Type)); | |
return pfnFunction(arg0, arg1, arg2, arg3, arg4, arg5); | |
} | |
template<typename TReturnType, typename TArg0, typename TArg1, typename TArg2, | |
typename TArg3, typename TArg4, typename TArg5, typename TArg6> | |
inline TReturnType VaListDispatch(TReturnType(*pfnFunction)(TArg0, TArg1, | |
TArg2, TArg3, TArg4, TArg5, TArg6), | |
va_list vaList){ | |
TArg0 arg0 = TArg0(va_arg(vaList, TVaListTypeMap<TArg0>::Type)); | |
TArg1 arg1 = TArg1(va_arg(vaList, TVaListTypeMap<TArg1>::Type)); | |
TArg2 arg2 = TArg2(va_arg(vaList, TVaListTypeMap<TArg2>::Type)); | |
TArg3 arg3 = TArg3(va_arg(vaList, TVaListTypeMap<TArg3>::Type)); | |
TArg4 arg4 = TArg4(va_arg(vaList, TVaListTypeMap<TArg4>::Type)); | |
TArg5 arg5 = TArg5(va_arg(vaList, TVaListTypeMap<TArg5>::Type)); | |
TArg6 arg6 = TArg6(va_arg(vaList, TVaListTypeMap<TArg6>::Type)); | |
return pfnFunction(arg0, arg1, arg2, arg3, arg4, arg5, arg6); | |
} | |
template<typename TReturnType, typename TArg0, typename TArg1, typename TArg2, | |
typename TArg3, typename TArg4, typename TArg5, typename TArg6, | |
typename TArg7> | |
inline TReturnType VaListDispatch(TReturnType(*pfnFunction)(TArg0, TArg1, | |
TArg2, TArg3, TArg4, TArg5, TArg6, TArg7), | |
va_list vaList){ | |
TArg0 arg0 = TArg0(va_arg(vaList, TVaListTypeMap<TArg0>::Type)); | |
TArg1 arg1 = TArg1(va_arg(vaList, TVaListTypeMap<TArg1>::Type)); | |
TArg2 arg2 = TArg2(va_arg(vaList, TVaListTypeMap<TArg2>::Type)); | |
TArg3 arg3 = TArg3(va_arg(vaList, TVaListTypeMap<TArg3>::Type)); | |
TArg4 arg4 = TArg4(va_arg(vaList, TVaListTypeMap<TArg4>::Type)); | |
TArg5 arg5 = TArg5(va_arg(vaList, TVaListTypeMap<TArg5>::Type)); | |
TArg6 arg6 = TArg6(va_arg(vaList, TVaListTypeMap<TArg6>::Type)); | |
TArg7 arg7 = TArg7(va_arg(vaList, TVaListTypeMap<TArg7>::Type)); | |
return pfnFunction(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); | |
} | |
template<typename TReturnType, typename TArg0, typename TArg1, typename TArg2, | |
typename TArg3, typename TArg4, typename TArg5, typename TArg6, | |
typename TArg7, typename TArg8> | |
inline TReturnType VaListDispatch(TReturnType(*pfnFunction)(TArg0, TArg1, | |
TArg2, TArg3, TArg4, TArg5, TArg6, TArg7, TArg8), | |
va_list vaList){ | |
TArg0 arg0 = TArg0(va_arg(vaList, TVaListTypeMap<TArg0>::Type)); | |
TArg1 arg1 = TArg1(va_arg(vaList, TVaListTypeMap<TArg1>::Type)); | |
TArg2 arg2 = TArg2(va_arg(vaList, TVaListTypeMap<TArg2>::Type)); | |
TArg3 arg3 = TArg3(va_arg(vaList, TVaListTypeMap<TArg3>::Type)); | |
TArg4 arg4 = TArg4(va_arg(vaList, TVaListTypeMap<TArg4>::Type)); | |
TArg5 arg5 = TArg5(va_arg(vaList, TVaListTypeMap<TArg5>::Type)); | |
TArg6 arg6 = TArg6(va_arg(vaList, TVaListTypeMap<TArg6>::Type)); | |
TArg7 arg7 = TArg7(va_arg(vaList, TVaListTypeMap<TArg7>::Type)); | |
TArg8 arg8 = TArg8(va_arg(vaList, TVaListTypeMap<TArg8>::Type)); | |
return pfnFunction(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); | |
} | |
#endif //!DISPATCH_H |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment