From 80fdb9146f33daf7b5630ec0cd513e0ddae0d372 Mon Sep 17 00:00:00 2001 From: Fabio Alessandrelli Date: Mon, 27 Sep 2021 16:06:50 +0200 Subject: [PATCH] Add pointers support for virtual methods. As introduced in godot for virtual methods. Custom structs are not yet supported. --- include/godot_cpp/core/method_ptrcall.hpp | 41 +++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/include/godot_cpp/core/method_ptrcall.hpp b/include/godot_cpp/core/method_ptrcall.hpp index 28127551..dc627167 100644 --- a/include/godot_cpp/core/method_ptrcall.hpp +++ b/include/godot_cpp/core/method_ptrcall.hpp @@ -184,6 +184,47 @@ struct PtrToArg { } }; +// Pointers. +#define GDVIRTUAL_NATIVE_PTR(m_type) \ + template <> \ + struct PtrToArg { \ + _FORCE_INLINE_ static m_type *convert(const void *p_ptr) { \ + return (m_type *)(*(void **)p_ptr); \ + } \ + typedef m_type *EncodeT; \ + _FORCE_INLINE_ static void encode(m_type *p_var, void *p_ptr) { \ + *((void **)p_ptr) = p_var; \ + } \ + }; \ + \ + template <> \ + struct PtrToArg { \ + _FORCE_INLINE_ static const m_type *convert(const void *p_ptr) { \ + return (const m_type *)(*(const void **)p_ptr); \ + } \ + typedef const m_type *EncodeT; \ + _FORCE_INLINE_ static void encode(m_type *p_var, void *p_ptr) { \ + *((void **)p_ptr) = p_var; \ + } \ + } + +GDVIRTUAL_NATIVE_PTR(bool); +GDVIRTUAL_NATIVE_PTR(char); +GDVIRTUAL_NATIVE_PTR(char16_t); +GDVIRTUAL_NATIVE_PTR(char32_t); +GDVIRTUAL_NATIVE_PTR(wchar_t); +GDVIRTUAL_NATIVE_PTR(uint8_t); +GDVIRTUAL_NATIVE_PTR(uint8_t *); +GDVIRTUAL_NATIVE_PTR(int8_t); +GDVIRTUAL_NATIVE_PTR(uint16_t); +GDVIRTUAL_NATIVE_PTR(int16_t); +GDVIRTUAL_NATIVE_PTR(uint32_t); +GDVIRTUAL_NATIVE_PTR(int32_t); +GDVIRTUAL_NATIVE_PTR(int64_t); +GDVIRTUAL_NATIVE_PTR(uint64_t); +GDVIRTUAL_NATIVE_PTR(float); +GDVIRTUAL_NATIVE_PTR(double); + } // namespace godot #endif // ! GODOT_CPP_METHOD_PTRCALL_HPP