Skip to content

Instantly share code, notes, and snippets.

@SirKane
Created March 14, 2018 20:14
Show Gist options
  • Save SirKane/4e888832809dc395f83f873ac9b05e08 to your computer and use it in GitHub Desktop.
Save SirKane/4e888832809dc395f83f873ac9b05e08 to your computer and use it in GitHub Desktop.
#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