5,530
社区成员




template <typename T> struct Deleter
{
typedef T value_type;
typedef void (*Type)(T*);
static void Delete(T* _obj_ptr)
{
delete _obj_ptr;
}
};
template<typename T, typename D = Deleter<T> >
class SharedPtr
{
public:
typedef T value_type;
SharedPtr();
SharedPtr(const SharedPtr& _ptr);
explicit SharedPtr(T* _ptr);
~SharedPtr();
SharedPtr& operator = (const SharedPtr& _ptr);
bool IsEmpty () const;
T& operator *() const;
T* operator->() const;
private:
T* holder_ptr;
long* ref_ptr;
void Release ();
void Swap(SharedPtr &_other);
};
//-------------------------------------------------------------------------
template<class T, class D>
inline bool Boi::SharedPtr<T, D>::IsEmpty() const
{
return !holder_ptr;
}
//-------------------------------------------------------------------------
template<class T, class D>
inline void Boi::SharedPtr<T, D>::Swap( SharedPtr<T, D> &_other )
{
std::swap(holder_ptr, _other.holder_ptr);
std::swap(ref_ptr, _other.ref_ptr);
}
//-------------------------------------------------------------------------
template<class T, class D>
inline void Boi::SharedPtr<T, D>::Release()
{
if (holder_ptr && ref_ptr && --*ref_ptr <= 0)
{
delete ref_ptr;
D::Delete(holder_ptr);
}
holder_ptr = NULL, ref_ptr = NULL;
}
//-------------------------------------------------------------------------
template<class T, class D>
inline T* Boi::SharedPtr<T, D>::operator->() const
{
return holder_ptr;
}
//-------------------------------------------------------------------------
template<class T, class D>
inline T& Boi::SharedPtr<T, D>::operator*() const
{
return *holder_ptr;
}
//-------------------------------------------------------------------------
template<class T, class D>
inline SharedPtr<T, D>& Boi::SharedPtr<T, D>::operator = ( const SharedPtr<T, D>& _ptr )
{
Swap(SharedPtr<T, D>(_ptr));
return *this;
}
//-------------------------------------------------------------------------
template<class T, class D>
inline Boi::SharedPtr<T, D>::~SharedPtr()
{
Release();
}
//-------------------------------------------------------------------------
template<class T, class D>
inline Boi::SharedPtr<T, D>::SharedPtr(T* _ptr)
: holder_ptr(_ptr)
{
if (holder_ptr)
{
ASSERT(ref_ptr = new long(1));
}
}
//-------------------------------------------------------------------------
template<class T, class D>
inline Boi::SharedPtr<T, D>::SharedPtr(const SharedPtr<T, D>& _ptr)
: ref_ptr(_ptr.ref_ptr), holder_ptr(_ptr.holder_ptr)
{
if (ref_ptr) ++(*ref_ptr);
}
//-------------------------------------------------------------------------
template<class T, class D>
inline Boi::SharedPtr<T, D>::SharedPtr()
: holder_ptr(NULL), ref_ptr(NULL)
{
}
//-------------------------------------------------------------------------
long* ref_ptr;
-->
std::atomic<long>* ref_ptr;