/*!
@class 引用计数类
*/
class RefCounted
{
public:
//! @brief 增加计数
virtual void G_CALL ref() = 0;
//! @brief 减少计数
virtual void G_CALL unref() = 0;
protected:
~RefCounted()
{
}
};
template< typename T >
class RefPtr
{
public:
RefPtr(T* ptr = 0)
{
mPtr = 0;
*this = ptr;
}
RefPtr(const RefPtr<T>& ptr)
{
mPtr = 0;
*this = ptr;
}
~RefPtr()
{
if (mPtr)
{
mPtr->unref();
mPtr = 0;
}
}
RefPtr<T>& operator=(T* ptr)
{
if (ptr != mPtr)
{
if (mPtr)
{
mPtr->unref();
}
mPtr = ptr;
if (mPtr)
{
mPtr->ref();
}
}
return *this;
}
RefPtr<T>& operator=(const RefPtr<T>& ptr)
{
*this = ptr.mPtr;
return *this;
}
T* operator->() const
{
return mPtr;
}
T& operator*() const
{
return *mPtr;
}
operator bool() const
{
return (mPtr != 0);
}
T* get() const
{
return mPtr;
}
private:
T* mPtr;
};