You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-17 14:11:06 +00:00
Add GDType and Object::_gdtype_ptr for first-class Object typing.
The type is currently bare-bones, but will be expanded in future PRs.
This commit is contained in:
@@ -31,6 +31,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "core/extension/gdextension_interface.h"
|
||||
#include "core/object/gdtype.h"
|
||||
#include "core/object/message_queue.h"
|
||||
#include "core/object/object_id.h"
|
||||
#include "core/os/rw_lock.h"
|
||||
@@ -494,21 +495,18 @@ private:
|
||||
friend class ::ClassDB; \
|
||||
\
|
||||
public: \
|
||||
virtual const StringName *_get_class_namev() const override { \
|
||||
return &get_class_static(); \
|
||||
virtual const GDType &_get_typev() const override { \
|
||||
return get_gdtype_static(); \
|
||||
} \
|
||||
static const GDType &get_gdtype_static() { \
|
||||
static GDType *_class_static; \
|
||||
if (unlikely(!_class_static)) { \
|
||||
assign_type_static(&_class_static, #m_class, &super_type::get_gdtype_static()); \
|
||||
} \
|
||||
return *_class_static; \
|
||||
} \
|
||||
static const StringName &get_class_static() { \
|
||||
static StringName _class_name_static; \
|
||||
if (unlikely(!_class_name_static)) { \
|
||||
assign_class_name_static(#m_class, _class_name_static); \
|
||||
} \
|
||||
return _class_name_static; \
|
||||
} \
|
||||
virtual bool is_class(const String &p_class) const override { \
|
||||
if (_get_extension() && _get_extension()->is_class(p_class)) { \
|
||||
return true; \
|
||||
} \
|
||||
return (p_class == (#m_class)) ? true : m_inherits::is_class(p_class); \
|
||||
return get_gdtype_static().get_name(); \
|
||||
} \
|
||||
\
|
||||
protected: \
|
||||
@@ -668,7 +666,7 @@ private:
|
||||
Variant script; // Reference does not exist yet, store it in a Variant.
|
||||
HashMap<StringName, Variant> metadata;
|
||||
HashMap<StringName, Variant *> metadata_properties;
|
||||
mutable const StringName *_class_name_ptr = nullptr;
|
||||
mutable const GDType *_gdtype_ptr = nullptr;
|
||||
|
||||
void _add_user_signal(const String &p_name, const Array &p_args = Array());
|
||||
bool _has_user_signal(const StringName &p_name) const;
|
||||
@@ -774,9 +772,7 @@ protected:
|
||||
Variant _call_bind(const Variant **p_args, int p_argcount, Callable::CallError &r_error);
|
||||
Variant _call_deferred_bind(const Variant **p_args, int p_argcount, Callable::CallError &r_error);
|
||||
|
||||
virtual const StringName *_get_class_namev() const {
|
||||
return &get_class_static();
|
||||
}
|
||||
virtual const GDType &_get_typev() const { return get_gdtype_static(); }
|
||||
|
||||
TypedArray<StringName> _get_meta_list_bind() const;
|
||||
TypedArray<Dictionary> _get_property_list_bind() const;
|
||||
@@ -842,26 +838,25 @@ public:
|
||||
};
|
||||
|
||||
/* TYPE API */
|
||||
static void assign_class_name_static(const Span<char> &p_name, StringName &r_target);
|
||||
static void assign_type_static(GDType **type_ptr, const char *p_name, const GDType *super_type);
|
||||
|
||||
static const StringName &get_class_static() {
|
||||
static StringName _class_name_static;
|
||||
if (unlikely(!_class_name_static)) {
|
||||
assign_class_name_static("Object", _class_name_static);
|
||||
static const GDType &get_gdtype_static() {
|
||||
static GDType *_class_static;
|
||||
if (unlikely(!_class_static)) {
|
||||
assign_type_static(&_class_static, "Object", nullptr);
|
||||
}
|
||||
return _class_name_static;
|
||||
return *_class_static;
|
||||
}
|
||||
|
||||
const GDType &get_gdtype() const;
|
||||
|
||||
static const StringName &get_class_static() { return get_gdtype_static().get_name(); }
|
||||
|
||||
_FORCE_INLINE_ String get_class() const { return get_class_name(); }
|
||||
|
||||
virtual String get_save_class() const { return get_class(); } //class stored when saving
|
||||
|
||||
virtual bool is_class(const String &p_class) const {
|
||||
if (_extension && _extension->is_class(p_class)) {
|
||||
return true;
|
||||
}
|
||||
return (p_class == "Object");
|
||||
}
|
||||
bool is_class(const String &p_class) const;
|
||||
virtual bool is_class_ptr(void *p_ptr) const { return get_class_ptr_static() == p_ptr; }
|
||||
|
||||
template <typename T>
|
||||
|
||||
Reference in New Issue
Block a user