summaryrefslogtreecommitdiffstats
path: root/include/godot_cpp/core/binder_common.hpp
diff options
context:
space:
mode:
authorDavid Snopek <dsnopek@gmail.com>2023-09-21 16:20:21 -0500
committerGitHub <noreply@github.com>2023-09-21 16:20:21 -0500
commitc44c3d5ebf9826214efc971f0cbe047789af2575 (patch)
tree5ca066cd3e84799c40defebe7923d7785bc20fe6 /include/godot_cpp/core/binder_common.hpp
parent4314f91b7dc23d930506f52d3a3c88fae0f5d57d (diff)
parentc18c1916c3f465d00800921d527902f18308fbf4 (diff)
downloadredot-cpp-c44c3d5ebf9826214efc971f0cbe047789af2575.tar.gz
Merge pull request #1155 from dsnopek/callable-mp
Implement `callable_mp()` and `callable_mp_static()`
Diffstat (limited to 'include/godot_cpp/core/binder_common.hpp')
-rw-r--r--include/godot_cpp/core/binder_common.hpp90
1 files changed, 90 insertions, 0 deletions
diff --git a/include/godot_cpp/core/binder_common.hpp b/include/godot_cpp/core/binder_common.hpp
index 09da62b..a51e15e 100644
--- a/include/godot_cpp/core/binder_common.hpp
+++ b/include/godot_cpp/core/binder_common.hpp
@@ -277,6 +277,60 @@ void call_with_variant_args_retc_helper(T *p_instance, R (T::*p_method)(P...) co
}
template <class T, class... P>
+void call_with_variant_args(T *p_instance, void (T::*p_method)(P...), const Variant **p_args, int p_argcount, GDExtensionCallError &r_error) {
+#ifdef DEBUG_ENABLED
+ if ((size_t)p_argcount > sizeof...(P)) {
+ r_error.error = GDEXTENSION_CALL_ERROR_TOO_MANY_ARGUMENTS;
+ r_error.argument = (int32_t)sizeof...(P);
+ return;
+ }
+
+ if ((size_t)p_argcount < sizeof...(P)) {
+ r_error.error = GDEXTENSION_CALL_ERROR_TOO_FEW_ARGUMENTS;
+ r_error.argument = (int32_t)sizeof...(P);
+ return;
+ }
+#endif
+ call_with_variant_args_helper<T, P...>(p_instance, p_method, p_args, r_error, BuildIndexSequence<sizeof...(P)>{});
+}
+
+template <class T, class R, class... P>
+void call_with_variant_args_ret(T *p_instance, R (T::*p_method)(P...), const Variant **p_args, int p_argcount, Variant &r_ret, GDExtensionCallError &r_error) {
+#ifdef DEBUG_ENABLED
+ if ((size_t)p_argcount > sizeof...(P)) {
+ r_error.error = GDEXTENSION_CALL_ERROR_TOO_MANY_ARGUMENTS;
+ r_error.argument = (int32_t)sizeof...(P);
+ return;
+ }
+
+ if ((size_t)p_argcount < sizeof...(P)) {
+ r_error.error = GDEXTENSION_CALL_ERROR_TOO_FEW_ARGUMENTS;
+ r_error.argument = (int32_t)sizeof...(P);
+ return;
+ }
+#endif
+ call_with_variant_args_ret_helper<T, R, P...>(p_instance, p_method, p_args, r_ret, r_error, BuildIndexSequence<sizeof...(P)>{});
+}
+
+template <class T, class R, class... P>
+void call_with_variant_args_retc(T *p_instance, R (T::*p_method)(P...) const, const Variant **p_args, int p_argcount, Variant &r_ret, GDExtensionCallError &r_error) {
+#ifdef DEBUG_ENABLED
+ if ((size_t)p_argcount > sizeof...(P)) {
+ r_error.error = GDEXTENSION_CALL_ERROR_TOO_MANY_ARGUMENTS;
+ r_error.argument = (int32_t)sizeof...(P);
+ return;
+ }
+
+ if ((size_t)p_argcount < sizeof...(P)) {
+ r_error.error = GDEXTENSION_CALL_ERROR_TOO_FEW_ARGUMENTS;
+ r_error.argument = (int32_t)sizeof...(P);
+ return;
+ }
+#endif
+ call_with_variant_args_retc_helper<T, R, P...>(p_instance, p_method, p_args, r_ret, r_error, BuildIndexSequence<sizeof...(P)>{});
+}
+
+template <class T, class... P>
void call_with_variant_args_dv(T *p_instance, void (T::*p_method)(P...), const GDExtensionConstVariantPtr *p_args, int p_argcount, GDExtensionCallError &r_error, const std::vector<Variant> &default_values) {
#ifdef DEBUG_ENABLED
if ((size_t)p_argcount > sizeof...(P)) {
@@ -538,6 +592,42 @@ void call_with_ptr_args_static_method(void (*p_method)(P...), const GDExtensionC
call_with_ptr_args_static_method_helper<P...>(p_method, p_args, BuildIndexSequence<sizeof...(P)>{});
}
+template <class R, class... P>
+void call_with_variant_args_static_ret(R (*p_method)(P...), const Variant **p_args, int p_argcount, Variant &r_ret, GDExtensionCallError &r_error) {
+#ifdef DEBUG_ENABLED
+ if ((size_t)p_argcount > sizeof...(P)) {
+ r_error.error = GDEXTENSION_CALL_ERROR_TOO_MANY_ARGUMENTS;
+ r_error.argument = (int32_t)sizeof...(P);
+ return;
+ }
+
+ if ((size_t)p_argcount < sizeof...(P)) {
+ r_error.error = GDEXTENSION_CALL_ERROR_TOO_FEW_ARGUMENTS;
+ r_error.argument = (int32_t)sizeof...(P);
+ return;
+ }
+#endif
+ call_with_variant_args_static_ret<R, P...>(p_method, p_args, r_ret, r_error, BuildIndexSequence<sizeof...(P)>{});
+}
+
+template <class... P>
+void call_with_variant_args_static_ret(void (*p_method)(P...), const Variant **p_args, int p_argcount, Variant &r_ret, GDExtensionCallError &r_error) {
+#ifdef DEBUG_ENABLED
+ if ((size_t)p_argcount > sizeof...(P)) {
+ r_error.error = GDEXTENSION_CALL_ERROR_TOO_MANY_ARGUMENTS;
+ r_error.argument = (int32_t)sizeof...(P);
+ return;
+ }
+
+ if ((size_t)p_argcount < sizeof...(P)) {
+ r_error.error = GDEXTENSION_CALL_ERROR_TOO_FEW_ARGUMENTS;
+ r_error.argument = (int32_t)sizeof...(P);
+ return;
+ }
+#endif
+ call_with_variant_args_static<P...>(p_method, p_args, r_error, BuildIndexSequence<sizeof...(P)>{});
+}
+
template <class R, class... P, size_t... Is>
void call_with_variant_args_static_ret(R (*p_method)(P...), const Variant **p_args, Variant &r_ret, GDExtensionCallError &r_error, IndexSequence<Is...>) {
r_error.error = GDEXTENSION_CALL_OK;