From 09b30be86dd3034b46ae26c1ecde1f9ad941a5c8 Mon Sep 17 00:00:00 2001 From: kobewi Date: Tue, 11 Jul 2023 16:18:10 +0200 Subject: Add vararg call() method to C++ Callable --- core/variant/callable.h | 2 ++ core/variant/variant.h | 14 ++++++++++++++ 2 files changed, 16 insertions(+) (limited to 'core/variant') diff --git a/core/variant/callable.h b/core/variant/callable.h index 086e5d2a00..3ae424e9bf 100644 --- a/core/variant/callable.h +++ b/core/variant/callable.h @@ -69,6 +69,8 @@ public: int expected = 0; }; + template + Variant call(VarArgs... p_args) const; void callp(const Variant **p_arguments, int p_argcount, Variant &r_return_value, CallError &r_call_error) const; void call_deferredp(const Variant **p_arguments, int p_argcount) const; Variant callv(const Array &p_arguments) const; diff --git a/core/variant/variant.h b/core/variant/variant.h index d698f85754..21342ae6ef 100644 --- a/core/variant/variant.h +++ b/core/variant/variant.h @@ -833,6 +833,20 @@ String vformat(const String &p_text, const VarArgs... p_args) { return fmt; } +template +Variant Callable::call(VarArgs... p_args) const { + Variant args[sizeof...(p_args) + 1] = { p_args..., 0 }; // +1 makes sure zero sized arrays are also supported. + const Variant *argptrs[sizeof...(p_args) + 1]; + for (uint32_t i = 0; i < sizeof...(p_args); i++) { + argptrs[i] = &args[i]; + } + + Variant ret; + CallError ce; + callp(sizeof...(p_args) == 0 ? nullptr : (const Variant **)argptrs, sizeof...(p_args), ret, ce); + return ret; +} + template Callable Callable::bind(VarArgs... p_args) { Variant args[sizeof...(p_args) + 1] = { p_args..., Variant() }; // +1 makes sure zero sized arrays are also supported. -- cgit v1.2.3