summaryrefslogtreecommitdiff
path: root/scene/main/node.h
diff options
context:
space:
mode:
authorNathan Franke <me@nathan.sh>2022-08-02 05:47:16 -0500
committerNathan Franke <me@nathan.sh>2022-08-02 18:35:29 -0500
commitc3c59851895711f196f89af197e6d6007489b813 (patch)
tree1ef0b026a5d027e9cfbb68acb63b005593500bcd /scene/main/node.h
parent3b39f00761145a44a6c6d45320d6e26b944814a3 (diff)
move rpc and rpc_id implementations back to header
StackOverflow on why this is needed: https://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file Minor mistake in commit ca7d572908c58c587214b8f65bdd4078d0185ab2
Diffstat (limited to 'scene/main/node.h')
-rw-r--r--scene/main/node.h18
1 files changed, 18 insertions, 0 deletions
diff --git a/scene/main/node.h b/scene/main/node.h
index 0645c68eb9..ccd1d561d2 100644
--- a/scene/main/node.h
+++ b/scene/main/node.h
@@ -512,4 +512,22 @@ VARIANT_ENUM_CAST(Node::DuplicateFlags);
typedef HashSet<Node *, Node::Comparator> NodeSet;
+// Template definitions must be in the header so they are always fully initialized before their usage.
+// See this StackOverflow question for more information: https://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file
+
+template <typename... VarArgs>
+Error Node::rpc(const StringName &p_method, VarArgs... p_args) {
+ return rpc_id(0, p_method, p_args...);
+}
+
+template <typename... VarArgs>
+Error Node::rpc_id(int p_peer_id, const StringName &p_method, 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];
+ for (uint32_t i = 0; i < sizeof...(p_args); i++) {
+ argptrs[i] = &args[i];
+ }
+ return rpcp(p_peer_id, p_method, sizeof...(p_args) == 0 ? nullptr : (const Variant **)argptrs, sizeof...(p_args));
+}
+
#endif // NODE_H