fixed up util/refptr

git-svn-id: svn://anubis/fart/trunk@91 7f9b0f55-74a9-4bce-be96-3c2cd072584d
This commit is contained in:
Josh Holtrop 2009-02-09 23:51:00 +00:00
parent d34242252a
commit 498d35274d
2 changed files with 39 additions and 6 deletions

View File

@ -1,11 +1,18 @@
#include "refptr.h" #include "refptr.h"
#include <stdlib.h> /* NULL */
template <typename T> refptr<T>::refptr()
{
m_ptr = NULL;
m_refCount = NULL;
}
template <typename T> refptr<T>::refptr(const T * ptr) template <typename T> refptr<T>::refptr(const T * ptr)
{ {
m_ptr = ptr; m_ptr = ptr;
refCount = new int; m_refCount = new int;
*refCount = 1; *m_refCount = 1;
} }
template <typename T> refptr<T>::refptr(const refptr<T> & orig) template <typename T> refptr<T>::refptr(const refptr<T> & orig)
@ -15,13 +22,36 @@ template <typename T> refptr<T>::refptr(const refptr<T> & orig)
template <typename T> refptr<T> & refptr<T>::operator=(const refptr<T> & orig) template <typename T> refptr<T> & refptr<T>::operator=(const refptr<T> & orig)
{ {
destroy();
cloneFrom(orig); cloneFrom(orig);
return *this; return *this;
} }
template <typename T> void refptr<T>::cloneFrom(const refptr<T> & orig) template <typename T> void refptr<T>::cloneFrom(const refptr<T> & orig)
{ {
this->ptr = orig.ptr; this->m_ptr = orig.m_ptr;
this->refCount = orig.refCount; this->m_refCount = orig.m_refCount;
(*refCount)++; if (m_refCount != NULL)
(*m_refCount)++;
}
template <typename T> refptr<T>::~refptr()
{
destroy();
}
template <typename T> void refptr<T>::destroy()
{
if (m_refCount != NULL)
{
if (*m_refCount <= 1)
{
delete m_ptr;
delete m_refCount;
}
else
{
(*m_refCount)--;
}
}
} }

View File

@ -6,15 +6,18 @@ template <typename T>
class refptr class refptr
{ {
public: public:
refptr<T>();
refptr<T>(const T * ptr); refptr<T>(const T * ptr);
refptr<T>(const refptr<T> & orig); refptr<T>(const refptr<T> & orig);
refptr<T> & operator=(const refptr<T> & orig); refptr<T> & operator=(const refptr<T> & orig);
~refptr<T>();
private: private:
void cloneFrom(const refptr<T> & orig); void cloneFrom(const refptr<T> & orig);
void destroy();
T * m_ptr; T * m_ptr;
int * refCount; int * m_refCount;
}; };
#endif #endif