diff options
author | kobewi <kobewi4e@gmail.com> | 2023-07-11 16:18:10 +0200 |
---|---|---|
committer | kobewi <kobewi4e@gmail.com> | 2023-10-05 11:35:29 +0200 |
commit | 09b30be86dd3034b46ae26c1ecde1f9ad941a5c8 (patch) | |
tree | 286927a2063b42d350257896e308dfc1ed6fb03a /core | |
parent | c7ed5d795ef396650e1e2853cf0d76cbdb1cb45e (diff) | |
download | redot-engine-09b30be86dd3034b46ae26c1ecde1f9ad941a5c8.tar.gz |
Add vararg call() method to C++ Callable
Diffstat (limited to 'core')
-rw-r--r-- | core/object/worker_thread_pool.cpp | 11 | ||||
-rw-r--r-- | core/variant/callable.h | 2 | ||||
-rw-r--r-- | core/variant/variant.h | 14 |
3 files changed, 18 insertions, 9 deletions
diff --git a/core/object/worker_thread_pool.cpp b/core/object/worker_thread_pool.cpp index cfc3ac3bcf..2fcd0867e6 100644 --- a/core/object/worker_thread_pool.cpp +++ b/core/object/worker_thread_pool.cpp @@ -75,10 +75,6 @@ void WorkerThreadPool::_process_task(Task *p_task) { if (p_task->group) { // Handling a group bool do_post = false; - Callable::CallError ce; - Variant ret; - Variant arg; - Variant *argptr = &arg; while (true) { uint32_t work_index = p_task->group->index.postincrement(); @@ -91,8 +87,7 @@ void WorkerThreadPool::_process_task(Task *p_task) { } else if (p_task->template_userdata) { p_task->template_userdata->callback_indexed(work_index); } else { - arg = work_index; - p_task->callable.callp((const Variant **)&argptr, 1, ret, ce); + p_task->callable.call(work_index); } // This is the only way to ensure posting is done when all tasks are really complete. @@ -141,9 +136,7 @@ void WorkerThreadPool::_process_task(Task *p_task) { p_task->template_userdata->callback(); memdelete(p_task->template_userdata); } else { - Callable::CallError ce; - Variant ret; - p_task->callable.callp(nullptr, 0, ret, ce); + p_task->callable.call(); } task_mutex.lock(); 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 <typename... VarArgs> + 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 @@ -834,6 +834,20 @@ String vformat(const String &p_text, const VarArgs... p_args) { } template <typename... VarArgs> +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 <typename... VarArgs> Callable Callable::bind(VarArgs... p_args) { Variant args[sizeof...(p_args) + 1] = { p_args..., Variant() }; // +1 makes sure zero sized arrays are also supported. const Variant *argptrs[sizeof...(p_args) + 1]; |