diff options
Diffstat (limited to 'core/reference.h')
-rw-r--r-- | core/reference.h | 58 |
1 files changed, 12 insertions, 46 deletions
diff --git a/core/reference.h b/core/reference.h index 30a93d82a6..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(); @@ -156,7 +143,6 @@ public: } 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 = nullptr; ref(p_from); } template <class T_Other> Ref(const Ref<T_Other> &p_from) { - - reference = nullptr; Reference *refb = const_cast<Reference *>(static_cast<const Reference *>(p_from.ptr())); if (!refb) { unref(); @@ -210,26 +192,21 @@ public: } Ref(T *p_reference) { - - reference = nullptr; - 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; } } @@ -242,7 +219,6 @@ public: // mutexes will avoid more crashes? if (reference && reference->unreference()) { - memdelete(reference); } reference = nullptr; @@ -252,13 +228,9 @@ public: ref(memnew(T)); } - Ref() { - - reference = nullptr; - } + 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>> { - _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); } }; |