diff options
| author | David Snopek <dsnopek@gmail.com> | 2023-06-28 21:55:04 -0500 |
|---|---|---|
| committer | David Snopek <dsnopek@gmail.com> | 2023-09-21 15:17:50 -0500 |
| commit | c18c1916c3f465d00800921d527902f18308fbf4 (patch) | |
| tree | 5ca066cd3e84799c40defebe7923d7785bc20fe6 /include/godot_cpp/core | |
| parent | 4314f91b7dc23d930506f52d3a3c88fae0f5d57d (diff) | |
| download | redot-cpp-c18c1916c3f465d00800921d527902f18308fbf4.tar.gz | |
Implement `callable_mp()` and `callable_mp_static()`
Diffstat (limited to 'include/godot_cpp/core')
| -rw-r--r-- | include/godot_cpp/core/binder_common.hpp | 90 | ||||
| -rw-r--r-- | include/godot_cpp/core/class_db.hpp | 4 |
2 files changed, 94 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; diff --git a/include/godot_cpp/core/class_db.hpp b/include/godot_cpp/core/class_db.hpp index af81037..c974fa4 100644 --- a/include/godot_cpp/core/class_db.hpp +++ b/include/godot_cpp/core/class_db.hpp @@ -40,6 +40,10 @@ #include <godot_cpp/classes/class_db_singleton.hpp> +// Makes callable_mp readily available in all classes connecting signals. +// Needs to come after method_bind and object have been included. +#include <godot_cpp/variant/callable_method_pointer.hpp> + #include <list> #include <set> #include <string> |
