diff --git a/headers/private/shared/WeakReferenceable.h b/headers/private/shared/WeakReferenceable.h index b0182688dd..df49fd9152 100644 --- a/headers/private/shared/WeakReferenceable.h +++ b/headers/private/shared/WeakReferenceable.h @@ -11,38 +11,35 @@ namespace BPrivate { -template class WeakReferenceable; -template +class BWeakReferenceable; + + class WeakPointer : public BReferenceable { public: - Type* Get(); + WeakPointer(BWeakReferenceable* object); + ~WeakPointer(); + + BWeakReferenceable* Get(); bool Put(); int32 UseCount() const; -private: - friend class WeakReferenceable; - - WeakPointer(Type* object); - ~WeakPointer(); - -private: - void _GetUnchecked(); + void GetUnchecked(); private: vint32 fUseCount; - Type* fObject; + BWeakReferenceable* fObject; }; -template -class WeakReferenceable { + +class BWeakReferenceable { public: - WeakReferenceable(Type* object); - ~WeakReferenceable(); + BWeakReferenceable(); + virtual ~BWeakReferenceable(); void AcquireReference() - { fPointer->_GetUnchecked(); } + { fPointer->GetUnchecked(); } bool ReleaseReference() { return fPointer->Put(); } @@ -50,55 +47,43 @@ public: int32 CountReferences() const { return fPointer->UseCount(); } - WeakPointer* GetWeakPointer(); - -protected: - WeakPointer* fPointer; + WeakPointer* GetWeakPointer(); +private: + WeakPointer* fPointer; }; + template -class WeakReference { +class BWeakReference { public: - WeakReference() + BWeakReference() : - fPointer(NULL), - fObject(NULL) + fPointer(NULL) { } - WeakReference(Type* object) + BWeakReference(Type* object) : - fPointer(NULL), - fObject(NULL) + fPointer(NULL) { SetTo(object); } - WeakReference(WeakPointer& other) + BWeakReference(const BWeakReference& other) : - fPointer(NULL), - fObject(NULL) - { - SetTo(&other); - } - - WeakReference(WeakPointer* other) - : - fPointer(NULL), - fObject(NULL) + fPointer(NULL) { SetTo(other); } - WeakReference(const WeakReference& other) + BWeakReference(const BReference& other) : - fPointer(NULL), - fObject(NULL) + fPointer(NULL) { - SetTo(other.fPointer); + SetTo(other); } - ~WeakReference() + ~BWeakReference() { Unset(); } @@ -107,63 +92,51 @@ public: { Unset(); - if (object != NULL) { + if (object != NULL) fPointer = object->GetWeakPointer(); - fObject = fPointer->Get(); - } } - void SetTo(WeakPointer* pointer) + void SetTo(const BWeakReference& other) { Unset(); - if (pointer != NULL) { - fPointer = pointer; + if (other.fPointer) { + fPointer = other.fPointer; fPointer->AcquireReference(); - fObject = pointer->Get(); } } + void SetTo(const BReference& other) + { + SetTo(other.Get()); + } + void Unset() { if (fPointer != NULL) { - if (fObject != NULL) { - fPointer->Put(); - fObject = NULL; - } fPointer->ReleaseReference(); fPointer = NULL; } } - Type* Get() const + bool IsAlive() { - return fObject; + if (fPointer == NULL) + return false; + Type* object = static_cast(fPointer->Get()); + if (object == NULL) + return false; + fPointer->Put(); + return true; } - Type* Detach() + BReference GetReference() { - Type* object = fObject; - Unset(); - return object; + Type* object = static_cast(fPointer->Get()); + return BReference(object, true); } - Type& operator*() const - { - return *fObject; - } - - operator Type*() const - { - return fObject; - } - - Type* operator->() const - { - return fObject; - } - - WeakReference& operator=(const WeakReference& other) + BWeakReference& operator=(const BWeakReference& other) { if (this == &other) return *this; @@ -172,46 +145,59 @@ public: return *this; } - WeakReference& operator=(const Type& other) + BWeakReference& operator=(const Type& other) { SetTo(&other); return *this; } - WeakReference& operator=(WeakPointer& other) - { - SetTo(&other); - return *this; - } - - WeakReference& operator=(WeakPointer* other) + BWeakReference& operator=(Type* other) { SetTo(other); return *this; } - bool operator==(const WeakReference& other) const + BWeakReference& operator=(const BReference& other) + { + SetTo(other.Get()); + return *this; + } + + bool operator==(const BWeakReference& other) const { return fPointer == other.fPointer; } - bool operator!=(const WeakReference& other) const + bool operator!=(const BWeakReference& other) const { return fPointer != other.fPointer; } private: - WeakPointer* fPointer; - Type* fObject; + WeakPointer* fPointer; }; // #pragma mark - -template -inline Type* -WeakPointer::Get() +inline +WeakPointer::WeakPointer(BWeakReferenceable* object) + : + fUseCount(1), + fObject(object) +{ +} + + +inline +WeakPointer::~WeakPointer() +{ +} + + +inline BWeakReferenceable* +WeakPointer::Get() { int32 count = -11; @@ -225,9 +211,8 @@ WeakPointer::Get() } -template inline bool -WeakPointer::Put() +WeakPointer::Put() { if (atomic_add(&fUseCount, -1) == 1) { delete fObject; @@ -238,34 +223,15 @@ WeakPointer::Put() } -template inline int32 -WeakPointer::UseCount() const +WeakPointer::UseCount() const { return fUseCount; } -template -inline -WeakPointer::WeakPointer(Type* object) - : - fUseCount(1), - fObject(object) -{ -} - - -template -inline -WeakPointer::~WeakPointer() -{ -} - - -template inline void -WeakPointer::_GetUnchecked() +WeakPointer::GetUnchecked() { atomic_add(&fUseCount, 1); } @@ -274,26 +240,23 @@ WeakPointer::_GetUnchecked() // #pragma - -template inline -WeakReferenceable::WeakReferenceable(Type* object) +BWeakReferenceable::BWeakReferenceable() : - fPointer(new WeakPointer(object)) + fPointer(new WeakPointer(this)) { } -template inline -WeakReferenceable::~WeakReferenceable() +BWeakReferenceable::~BWeakReferenceable() { fPointer->ReleaseReference(); } -template -inline WeakPointer* -WeakReferenceable::GetWeakPointer() +inline WeakPointer* +BWeakReferenceable::GetWeakPointer() { fPointer->AcquireReference(); return fPointer; @@ -301,8 +264,7 @@ WeakReferenceable::GetWeakPointer() } // namespace BPrivate -using BPrivate::WeakReferenceable; -using BPrivate::WeakPointer; -using BPrivate::WeakReference; +using BPrivate::BWeakReferenceable; +using BPrivate::BWeakReference; #endif // _WEAK_REFERENCEABLE_H