#ifndef UNIQUEPTR_H
#define UNIQUEPTR_H
template<typename _T>
struct default_delete
{
void operator()(_T *ptr)
{
delete ptr;
}
};
template<typename _T, typename _D = default_delete<_T> >
class UniquePtr
{
public:
UniquePtr(_T *ptr = NULL)
{
_ptr = ptr;
}
~UniquePtr()
{
reset();
}
// Move constructor
UniquePtr(const UniquePtr<_T,_D> &u)
{
_ptr = u.release();
}
// Move assignment operator
UniquePtr<_T,_D>& operator=(const UniquePtr<_T,_D> &rhs)
{
reset(rhs.release());
return *this;
}
_T* operator->() const
{
return get();
}
_T& operator*() const
{
return *get();
}
void reset(_T *ptr = NULL)
{
_deleter(_ptr);
_ptr = ptr;
}
void swap(UniquePtr<_T,_D> &r)
{
_T *t = _ptr;
_ptr = r._ptr;
r._ptr = t;
}
_T* release() const
{
_T *t = _ptr;
_ptr = NULL;
return t;
}
_T* get() const
{
return _ptr;
}
private:
mutable _T *_ptr;
_D _deleter;
};
#endif