diff options
Diffstat (limited to 'core/reference.h')
| -rw-r--r-- | core/reference.h | 72 |
1 files changed, 19 insertions, 53 deletions
diff --git a/core/reference.h b/core/reference.h index fd42c4e537..f5794b0b67 100644 --- a/core/reference.h +++ b/core/reference.h @@ -36,7 +36,6 @@ #include "core/safe_refcount.h" class Reference : public Object { - GDCLASS(Reference, Object); SafeRefCount refcount; SafeRefCount refcount_init; @@ -52,32 +51,32 @@ public: int reference_get_count() const; Reference(); - ~Reference(); + ~Reference() {} }; template <class T> class Ref { - - T *reference; + T *reference = nullptr; void ref(const Ref &p_from) { - - if (p_from.reference == reference) + if (p_from.reference == reference) { return; + } unref(); reference = p_from.reference; - if (reference) + if (reference) { reference->reference(); + } } void ref_pointer(T *p_ref) { - ERR_FAIL_COND(!p_ref); - if (p_ref->init_ref()) + if (p_ref->init_ref()) { reference = p_ref; + } } //virtual Reference * get_reference() const { return reference; } @@ -90,60 +89,48 @@ public: } _FORCE_INLINE_ bool operator<(const Ref<T> &p_r) const { - return reference < p_r.reference; } _FORCE_INLINE_ bool operator==(const Ref<T> &p_r) const { - return reference == p_r.reference; } _FORCE_INLINE_ bool operator!=(const Ref<T> &p_r) const { - return reference != p_r.reference; } _FORCE_INLINE_ T *operator->() { - return reference; } _FORCE_INLINE_ T *operator*() { - return reference; } _FORCE_INLINE_ const T *operator->() const { - return reference; } _FORCE_INLINE_ const T *ptr() const { - return reference; } _FORCE_INLINE_ T *ptr() { - return reference; } _FORCE_INLINE_ const T *operator*() const { - return reference; } operator Variant() const { - return Variant(reference); } void operator=(const Ref &p_from) { - ref(p_from); } template <class T_Other> void operator=(const Ref<T_Other> &p_from) { - Reference *refb = const_cast<Reference *>(static_cast<const Reference *>(p_from.ptr())); if (!refb) { unref(); @@ -152,11 +139,10 @@ public: Ref r; r.reference = Object::cast_to<T>(refb); ref(r); - r.reference = NULL; + r.reference = nullptr; } void operator=(const Variant &p_variant) { - Object *object = p_variant.get_validated_object(); if (object == reference) { @@ -189,15 +175,11 @@ public: } Ref(const Ref &p_from) { - - reference = NULL; ref(p_from); } template <class T_Other> Ref(const Ref<T_Other> &p_from) { - - reference = NULL; Reference *refb = const_cast<Reference *>(static_cast<const Reference *>(p_from.ptr())); if (!refb) { unref(); @@ -206,35 +188,30 @@ public: Ref r; r.reference = Object::cast_to<T>(refb); ref(r); - r.reference = NULL; + r.reference = nullptr; } Ref(T *p_reference) { - - reference = NULL; - if (p_reference) + if (p_reference) { ref_pointer(p_reference); + } } Ref(const Variant &p_variant) { - Object *object = p_variant.get_validated_object(); if (!object) { - reference = nullptr; return; } T *r = Object::cast_to<T>(object); if (r && r->reference()) { reference = r; - } else { - reference = nullptr; } } - inline bool is_valid() const { return reference != NULL; } - inline bool is_null() const { return reference == NULL; } + inline bool is_valid() const { return reference != nullptr; } + inline bool is_null() const { return reference == nullptr; } void unref() { //TODO this should be moved to mutexes, since this engine does not really @@ -242,23 +219,18 @@ public: // mutexes will avoid more crashes? if (reference && reference->unreference()) { - memdelete(reference); } - reference = NULL; + reference = nullptr; } void instance() { ref(memnew(T)); } - Ref() { - - reference = NULL; - } + Ref() {} ~Ref() { - unref(); } }; @@ -266,7 +238,6 @@ public: typedef Ref<Reference> REF; class WeakRef : public Reference { - GDCLASS(WeakRef, Reference); ObjectID ref; @@ -279,30 +250,25 @@ public: void set_obj(Object *p_object); void set_ref(const REF &p_ref); - WeakRef(); + WeakRef() {} }; #ifdef PTRCALL_ENABLED template <class T> -struct PtrToArg<Ref<T> > { - +struct PtrToArg<Ref<T>> { _FORCE_INLINE_ static Ref<T> convert(const void *p_ptr) { - return Ref<T>(const_cast<T *>(reinterpret_cast<const T *>(p_ptr))); } _FORCE_INLINE_ static void encode(Ref<T> p_val, const void *p_ptr) { - *(Ref<Reference> *)p_ptr = p_val; } }; template <class T> struct PtrToArg<const Ref<T> &> { - _FORCE_INLINE_ static Ref<T> convert(const void *p_ptr) { - return Ref<T>((T *)p_ptr); } }; @@ -312,7 +278,7 @@ struct PtrToArg<const Ref<T> &> { #ifdef DEBUG_METHODS_ENABLED template <class T> -struct GetTypeInfo<Ref<T> > { +struct GetTypeInfo<Ref<T>> { static const Variant::Type VARIANT_TYPE = Variant::OBJECT; static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; |