diff options
| author | Rémi Verschelde <remi@verschelde.fr> | 2021-09-28 16:14:45 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-09-28 16:14:45 +0200 |
| commit | 6a720e5c7c684fd2b68fea435865c553b233d269 (patch) | |
| tree | 6a9070cf1ae774d315feb229c4d7b9ace30885cf /include/godot_cpp | |
| parent | 3cebc33414f5a05d57a5bd910edc74ad7136e635 (diff) | |
| parent | b28853aff1a917c3a9ad47915856ea0fd2373254 (diff) | |
| download | redot-cpp-6a720e5c7c684fd2b68fea435865c553b233d269.tar.gz | |
Merge pull request #631 from Faless/ext/ref_casting_2
Diffstat (limited to 'include/godot_cpp')
| -rw-r--r-- | include/godot_cpp/classes/ref.hpp | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/include/godot_cpp/classes/ref.hpp b/include/godot_cpp/classes/ref.hpp index b5fec34..71c8d88 100644 --- a/include/godot_cpp/classes/ref.hpp +++ b/include/godot_cpp/classes/ref.hpp @@ -35,6 +35,7 @@ #include <godot_cpp/classes/object.hpp> #include <godot_cpp/classes/ref_counted.hpp> +#include <godot_cpp/core/binder_common.hpp> #include <godot_cpp/core/memory.hpp> #include <godot_cpp/variant/variant.hpp> @@ -236,6 +237,48 @@ public: } }; +template <class T> +struct PtrToArg<Ref<T>> { + _FORCE_INLINE_ static Ref<T> convert(const void *p_ptr) { + return Ref<T>(godot::internal::interface->object_get_instance_binding((void *)p_ptr, godot::internal::token, &T::___binding_callbacks)); + } + + typedef Ref<T> EncodeT; + + _FORCE_INLINE_ static void encode(Ref<T> p_val, const void *p_ptr) { + *(void **)p_ptr = p_val->_owner; + } +}; + +template <class T> +struct PtrToArg<const Ref<T> &> { + typedef Ref<T> EncodeT; + + _FORCE_INLINE_ static Ref<T> convert(const void *p_ptr) { + return Ref<T>(godot::internal::interface->object_get_instance_binding((void *)p_ptr, godot::internal::token, &T::___binding_callbacks)); + } +}; + +template <class T> +struct GetTypeInfo<Ref<T>, typename EnableIf<TypeInherits<RefCounted, T>::value>::type> { + static const GDNativeVariantType VARIANT_TYPE = GDNATIVE_VARIANT_TYPE_OBJECT; + static const GDNativeExtensionClassMethodArgumentMetadata METADATA = GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_NONE; + + static inline PropertyInfo get_class_info() { + return PropertyInfo(GDNATIVE_VARIANT_TYPE_OBJECT, T::get_class_static()); + } +}; + +template <class T> +struct GetTypeInfo<const Ref<T> &, typename EnableIf<TypeInherits<RefCounted, T>::value>::type> { + static const GDNativeVariantType VARIANT_TYPE = GDNATIVE_VARIANT_TYPE_OBJECT; + static const GDNativeExtensionClassMethodArgumentMetadata METADATA = GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_NONE; + + static inline PropertyInfo get_class_info() { + return PropertyInfo(GDNATIVE_VARIANT_TYPE_OBJECT, T::get_class_static()); + } +}; + } // namespace godot #endif // ! GODOT_CPP_REF_HPP |
