#ifndef TEST_SUITE_REFCOUNT_H__ #define TEST_SUITE_REFCOUNT_H__ struct RCObjBase { /*! Return the numbers of active references. \return The internal \c refCount value. */ int ref_count() const { return refCount; } /*! Add one reference. \return The reference counter value. */ int addref() const { return add_ref(); } /*! Delete one reference. If the refCount is zero, the object is deleted. \return The reference counter value, which can be zero after deletion. */ int delref() const { if (ref_count() == 0 || del_ref() == 0 ) { delete this; return 0; } return ref_count(); } protected: RCObjBase(); RCObjBase(const RCObjBase& ); virtual ~RCObjBase() = 0; private: RCObjBase& operator=(const RCObjBase& ); friend struct RCObj; int add_ref() const { return ++refCount; } int del_ref() const { return --refCount; } mutable int refCount; }; struct RCObj : virtual RCObjBase { protected: RCObj() { } }; /*! Reference an RCObj object \return The input pointer \a r */ template inline T* addref(T* r) { return (r && r->addref() ) ? r : 0; } /*! Unreference an RCObj object. \return The input pointer \a r or nil if the object was deleted. */ template inline T* delref(T* r) { return ( r && r->delref() ) ? r : 0; } RCObjBase::RCObjBase() : refCount(0) { } RCObjBase::~RCObjBase() { } RCObjBase::RCObjBase(const RCObjBase&) : refCount(0) { } RCObjBase& RCObjBase::operator=(const RCObjBase&) { return *this; } template struct RCPtr { typedef T* pointer_type; typedef T& refernce_type; typedef T value_type; RCPtr(); RCPtr(T* realPtr); RCPtr(const RCPtr& rhs); ~RCPtr(); RCPtr& operator=(const RCPtr& rhs); RCPtr& operator=(T* realPtr); T* operator->() { return pointee; } T& operator*() { return *pointee; } const T* operator->() const { return pointee; } const T& operator*() const { return *pointee; } operator T*() { return pointee; } operator T&() { return *pointee; } operator const T*() const { return pointee; } operator const T&() const { return *pointee; } T* get() { return pointee; } T* get() const { return pointee; } private: T* pointee; }; template inline RCPtr::RCPtr() : pointee(0) { } template inline RCPtr::RCPtr(T* realPtr) : pointee(realPtr) { addref(pointee); } template inline RCPtr::RCPtr(const RCPtr& rhs) : pointee(rhs.pointee) { addref(pointee); } template inline RCPtr::~RCPtr() { delref(pointee); } template inline RCPtr& RCPtr::operator=(const RCPtr& rhs) { if (pointee != rhs.pointee) { delref(pointee); pointee = rhs.pointee; addref(pointee); } return *this; } #endif //TEST_SUITE_REFCOUNT_H__