summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorkobewi <kobewi4e@gmail.com>2023-07-11 16:18:10 +0200
committerkobewi <kobewi4e@gmail.com>2023-10-05 11:35:29 +0200
commit09b30be86dd3034b46ae26c1ecde1f9ad941a5c8 (patch)
tree286927a2063b42d350257896e308dfc1ed6fb03a /core
parentc7ed5d795ef396650e1e2853cf0d76cbdb1cb45e (diff)
downloadredot-engine-09b30be86dd3034b46ae26c1ecde1f9ad941a5c8.tar.gz
Add vararg call() method to C++ Callable
Diffstat (limited to 'core')
-rw-r--r--core/object/worker_thread_pool.cpp11
-rw-r--r--core/variant/callable.h2
-rw-r--r--core/variant/variant.h14
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];