Add basic deleter support to wxSharedPtr<T>.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74773 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík
2013-09-06 17:09:11 +00:00
parent 36c5850bcf
commit 4852df90e2
2 changed files with 64 additions and 3 deletions

View File

@@ -30,6 +30,14 @@ public:
m_ref = new reftype(ptr); m_ref = new reftype(ptr);
} }
template<typename Deleter>
wxEXPLICIT wxSharedPtr(T* ptr, Deleter d)
: m_ref(NULL)
{
if (ptr)
m_ref = new reftype_with_deleter<Deleter>(ptr, d);
}
~wxSharedPtr() { Release(); } ~wxSharedPtr() { Release(); }
wxSharedPtr(const wxSharedPtr& tocopy) { Acquire(tocopy.m_ref); } wxSharedPtr(const wxSharedPtr& tocopy) { Acquire(tocopy.m_ref); }
@@ -91,6 +99,14 @@ public:
m_ref = new reftype(ptr); m_ref = new reftype(ptr);
} }
template<typename Deleter>
void reset(T* ptr, Deleter d)
{
Release();
if (ptr)
m_ref = new reftype_with_deleter<Deleter>(ptr, d);
}
bool unique() const { return (m_ref ? m_ref->m_count == 1 : true); } bool unique() const { return (m_ref ? m_ref->m_count == 1 : true); }
long use_count() const { return (m_ref ? (long)m_ref->m_count : 0); } long use_count() const { return (m_ref ? (long)m_ref->m_count : 0); }
@@ -98,10 +114,24 @@ private:
struct reftype struct reftype
{ {
reftype( T* ptr = NULL, unsigned count = 1 ) : m_ptr(ptr), m_count(count) {} reftype(T* ptr) : m_ptr(ptr), m_count(1) {}
virtual ~reftype() {}
virtual void delete_ptr() { delete m_ptr; }
T* m_ptr; T* m_ptr;
wxAtomicInt m_count; wxAtomicInt m_count;
}* m_ref; };
template<typename Deleter>
struct reftype_with_deleter : public reftype
{
reftype_with_deleter(T* ptr, Deleter d) : reftype(ptr), m_deleter(d) {}
virtual void delete_ptr() { m_deleter(this->m_ptr); }
Deleter m_deleter;
};
reftype* m_ref;
void Acquire(reftype* ref) void Acquire(reftype* ref)
{ {
@@ -116,7 +146,7 @@ private:
{ {
if (!wxAtomicDec( m_ref->m_count )) if (!wxAtomicDec( m_ref->m_count ))
{ {
delete m_ref->m_ptr; m_ref->delete_ptr();
delete m_ref; delete m_ref;
} }
m_ref = NULL; m_ref = NULL;

View File

@@ -28,6 +28,22 @@ public:
*/ */
wxEXPLICIT wxSharedPtr(T* ptr = NULL); wxEXPLICIT wxSharedPtr(T* ptr = NULL);
/**
Constructor.
Creates shared pointer from the raw pointer @a ptr and deleter @a d
and takes ownership of it.
@param ptr The raw pointer.
@param d Deleter - a functor that is called instead of delete to
free the @a ptr raw pointer when its reference count drops to
zero.
@since 3.0
*/
template<typename Deleter>
wxEXPLICIT wxSharedPtr(T* ptr, Deleter d);
/** /**
Copy constructor. Copy constructor.
*/ */
@@ -88,6 +104,21 @@ public:
*/ */
void reset(T* ptr = NULL); void reset(T* ptr = NULL);
/**
Reset pointer to @a ptr.
If the reference count of the previously owned pointer was 1 it will be deleted.
@param ptr The new raw pointer.
@param d Deleter - a functor that is called instead of delete to
free the @a ptr raw pointer when its reference count drops to
zero.
@since 3.0
*/
template<typename Deleter>
void reset(T* ptr, Deleter d);
/** /**
Returns @true if this is the only pointer pointing to its object. Returns @true if this is the only pointer pointing to its object.
*/ */