19 template <
class F,
class Tuple, std::size_t... I,
class... Args>
20 inline constexpr decltype(
auto)
CallbackImpl(F&& a_func, Tuple&& a_tuple,
std::index_sequence<I...>, Args&&... a_args)
23 std::forward<F>(a_func),
24 std::forward<Args>(a_args)...,
25 std::get<I>(std::forward<Tuple>(a_tuple))...);
28 template <
class F,
class Tuple,
class... Args>
29 inline constexpr decltype(
auto)
CallBack(F&& a_func, Tuple&& a_tuple, Args&&... a_args)
32 std::forward<F>(a_func),
33 std::forward<Tuple>(a_tuple),
35 std::forward<Args>(a_args)...);
38 template <
class... Args, std::size_t... I>
41 return std::forward_as_tuple(
46 template <
class... Args>
49 return MakeTupleImpl<Args...>(a_frame, a_page, std::index_sequence_for<Args...>{});
53 template <
bool IS_LONG,
class F,
class R,
class Base,
class... Args>
71 _retType = GetRawType<result_type>();
78 return static_cast<bool>(
_stub);
91 auto page = a_frame.GetPageForFrame();
93 if constexpr (std::is_void_v<result_type>) {
94 if constexpr (IS_LONG) {
96 a_resultValue.SetNone();
99 a_resultValue.SetNone();
102 if constexpr (IS_LONG) {
103 auto result =
Impl::CallBack(
_stub, std::move(args), std::addressof(a_vm), a_stackID, std::move(base));
104 a_resultValue.Pack<
result_type>(std::move(result));
107 a_resultValue.Pack<
result_type>(std::move(result));
120 template <
class F,
class =
void>
123 template <
class R,
class Cls,
class... Args>
124 class NativeFunction<R(Cls, Args...),
std::enable_if_t<BSScript::is_valid_short_sig_v<R, Cls, Args...>>> :
138 template <
class Int,
class R,
class Cls,
class... Args>
139 class NativeFunction<R(BSScript::Internal::VirtualMachine*, Int, Cls, Args...), std::enable_if_t<BSScript::is_valid_long_sig_v<Int, R, Cls, Args...>>> :
153 template <
class Int,
class R,
class Cls,
class... Args>
154 class NativeFunction<R(BSScript::IVirtualMachine*, Int, Cls, Args...), std::enable_if_t<BSScript::is_valid_long_sig_v<Int, R, Cls, Args...>>> :
177 if (a_callableFromTasklets) {
Definition: IVirtualMachine.h:39
void SetCallableFromTasklets(const char *a_className, const char *a_stateName, const char *a_fnName, bool a_callable)
void RegisterFunction(std::string_view a_fnName, std::string_view a_className, F a_callback, bool a_callableFromTasklets=false)
Definition: NativeFunction.h:174
virtual bool BindNativeMethod(IFunction *a_fn)=0
Definition: VirtualMachine.h:46
Definition: NativeFunctionBase.h:23
TypeInfo _retType
Definition: NativeFunctionBase.h:62
NativeFunctionBase()=delete
Internal::VDescTable _descTable
Definition: NativeFunctionBase.h:63
Definition: NativeFunction.h:55
NativeFunction(NativeFunction &&)=delete
std::function< function_type > _stub
Definition: NativeFunction.h:116
Base base_type
Definition: NativeFunction.h:58
NativeFunction(const NativeFunction &)=delete
~NativeFunction() override=default
R result_type
Definition: NativeFunction.h:57
bool HasStub() const override
Definition: NativeFunction.h:76
bool MarshallAndDispatch(Variable &a_baseValue, [[maybe_unused]] Internal::VirtualMachine &a_vm, [[maybe_unused]] VMStackID a_stackID, Variable &a_resultValue, const StackFrame &a_frame) const override
Definition: NativeFunction.h:81
F function_type
Definition: NativeFunction.h:59
NativeFunction(std::string_view a_fnName, std::string_view a_className, function_type a_callback)
Definition: NativeFunction.h:65
Definition: StackFrame.h:15
Variable & GetStackFrameVariable(std::uint32_t a_index, std::uint32_t a_pageHint) const
Definition: Variable.h:15
T Unpack() const
Definition: PackUnpack.h:298
typename super::function_type function_type
Definition: NativeFunction.h:163
typename super::result_type result_type
Definition: NativeFunction.h:161
typename super::base_type base_type
Definition: NativeFunction.h:162
typename super::function_type function_type
Definition: NativeFunction.h:148
typename super::result_type result_type
Definition: NativeFunction.h:146
typename super::base_type base_type
Definition: NativeFunction.h:147
typename super::result_type result_type
Definition: NativeFunction.h:131
typename super::function_type function_type
Definition: NativeFunction.h:133
typename super::base_type base_type
Definition: NativeFunction.h:132
Definition: NativeFunction.h:121
std::invoke_result_t< F, Args... > invoke(F &&a_func, Args &&... a_args) noexcept(std::is_nothrow_invocable_v< F, Args... >) requires(std
Definition: Relocation.h:201
std::tuple< Args... > MakeTupleImpl(const StackFrame &a_frame, std::uint32_t a_page, std::index_sequence< I... >)
Definition: NativeFunction.h:39
constexpr decltype(auto) CallBack(F &&a_func, Tuple &&a_tuple, Args &&... a_args)
Definition: NativeFunction.h:29
std::tuple< Args... > MakeTuple(const StackFrame &a_frame, std::uint32_t a_page)
Definition: NativeFunction.h:47
constexpr decltype(auto) CallbackImpl(F &&a_func, Tuple &&a_tuple, std::index_sequence< I... >, Args &&... a_args)
Definition: NativeFunction.h:20
constexpr bool is_static_base_v
Definition: TypeTraits.h:139
Definition: AbsorbEffect.h:6
NativeFunction(std::string_view, std::string_view, F) -> NativeFunction< std::remove_pointer_t< F >>
std::uint32_t VMStackID
Definition: BSCoreTypes.h:8
Definition: NiBinaryStream.h:94
SimpleArray< BSTTuple< BSFixedString, TypeInfo > > entries
Definition: VDescTable.h:24
Definition: CommonTypeTraits.h:191
Definition: TypeTraits.h:136