@@ -115,13 +115,13 @@ template <typename... Args>
115115struct GTAFuncSignature
116116{
117117 std::tuple<Args...> args;
118- GTAFuncSignature (Args... a) : args(std::forward<Args> (a)...) {}
118+ GTAFuncSignature (Args... a) : args(std::move (a)...) {}
119119};
120120
121121template <typename ... Args>
122122GTAFuncSignature<Args...> PrepareSignature (Args... args)
123123{
124- return GTAFuncSignature<Args...>(std::forward<Args> (args)...);
124+ return GTAFuncSignature<Args...>(std::move (args)...);
125125}
126126
127127template <typename ReturnType, typename Func, typename Tuple, std::size_t ... I>
@@ -131,18 +131,31 @@ ReturnType apply_helper(Func&& f, Tuple&& t, std::index_sequence<I...>)
131131}
132132
133133template <typename ReturnType, typename CallingConvention, typename Func, typename ... Args>
134- ReturnType CallGTAFunction (Func function, GTAFuncSignature<Args...>& sig)
135- {
136- if constexpr (std::is_same_v<CallingConvention, __THISCALL>)
137- return apply_helper<ReturnType>(reinterpret_cast <ReturnType (__thiscall*)(Args...)>(function), sig.args , std::index_sequence_for<Args...>{});
138- else if constexpr (std::is_same_v<CallingConvention, __CDECL>)
139- return apply_helper<ReturnType>(reinterpret_cast <ReturnType (__cdecl*)(Args...)>(function), sig.args , std::index_sequence_for<Args...>{});
140- else if constexpr (std::is_same_v<CallingConvention, __STDCALL>)
141- return apply_helper<ReturnType>(reinterpret_cast <ReturnType (__stdcall*)(Args...)>(function), sig.args , std::index_sequence_for<Args...>{});
142- else if constexpr (std::is_same_v<CallingConvention, __FASTCALL>)
143- return apply_helper<ReturnType>(reinterpret_cast <ReturnType (__fastcall*)(Args...)>(function), sig.args , std::index_sequence_for<Args...>{});
144- else if constexpr (std::is_same_v<CallingConvention, __VECTORCALL>)
145- return apply_helper<ReturnType>(reinterpret_cast <ReturnType (__vectorcall*)(Args...)>(function), sig.args , std::index_sequence_for<Args...>{});
146- else
147- static_assert (sizeof (char ) == 0 , " Invalid calling convention specified in CallGTAFunction" );
134+ typename std::enable_if<std::is_same<CallingConvention, __THISCALL>::value, ReturnType>::type CallGTAFunction (Func function, GTAFuncSignature<Args...>& sig)
135+ {
136+ return apply_helper<ReturnType>(reinterpret_cast <ReturnType (__thiscall*)(Args...)>(function), sig.args , std::index_sequence_for<Args...>{});
137+ }
138+
139+ template <typename ReturnType, typename CallingConvention, typename Func, typename ... Args>
140+ typename std::enable_if<std::is_same<CallingConvention, __CDECL>::value, ReturnType>::type CallGTAFunction (Func function, GTAFuncSignature<Args...>& sig)
141+ {
142+ return apply_helper<ReturnType>(reinterpret_cast <ReturnType (__cdecl*)(Args...)>(function), sig.args , std::index_sequence_for<Args...>{});
143+ }
144+
145+ template <typename ReturnType, typename CallingConvention, typename Func, typename ... Args>
146+ typename std::enable_if<std::is_same<CallingConvention, __STDCALL>::value, ReturnType>::type CallGTAFunction (Func function, GTAFuncSignature<Args...>& sig)
147+ {
148+ return apply_helper<ReturnType>(reinterpret_cast <ReturnType (__stdcall*)(Args...)>(function), sig.args , std::index_sequence_for<Args...>{});
149+ }
150+
151+ template <typename ReturnType, typename CallingConvention, typename Func, typename ... Args>
152+ typename std::enable_if<std::is_same<CallingConvention, __FASTCALL>::value, ReturnType>::type CallGTAFunction (Func function, GTAFuncSignature<Args...>& sig)
153+ {
154+ return apply_helper<ReturnType>(reinterpret_cast <ReturnType (__fastcall*)(Args...)>(function), sig.args , std::index_sequence_for<Args...>{});
155+ }
156+
157+ template <typename ReturnType, typename CallingConvention, typename Func, typename ... Args>
158+ typename std::enable_if<std::is_same<CallingConvention, __VECTORCALL>::value, ReturnType>::type CallGTAFunction (Func function, GTAFuncSignature<Args...>& sig)
159+ {
160+ return apply_helper<ReturnType>(reinterpret_cast <ReturnType (__vectorcall*)(Args...)>(function), sig.args , std::index_sequence_for<Args...>{});
148161}
0 commit comments