From 4852df90e21578b7697fe05af3ac39fe5c696669 Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Fri, 6 Sep 2013 17:09:11 +0000 Subject: [PATCH] Add basic deleter support to wxSharedPtr. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74773 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/sharedptr.h | 36 +++++++++++++++++++++++++++++++++--- interface/wx/sharedptr.h | 31 +++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 3 deletions(-) diff --git a/include/wx/sharedptr.h b/include/wx/sharedptr.h index c6b28f8..a9b6442 100644 --- a/include/wx/sharedptr.h +++ b/include/wx/sharedptr.h @@ -30,6 +30,14 @@ public: m_ref = new reftype(ptr); } + template + wxEXPLICIT wxSharedPtr(T* ptr, Deleter d) + : m_ref(NULL) + { + if (ptr) + m_ref = new reftype_with_deleter(ptr, d); + } + ~wxSharedPtr() { Release(); } wxSharedPtr(const wxSharedPtr& tocopy) { Acquire(tocopy.m_ref); } @@ -91,6 +99,14 @@ public: m_ref = new reftype(ptr); } + template + void reset(T* ptr, Deleter d) + { + Release(); + if (ptr) + m_ref = new reftype_with_deleter(ptr, d); + } + 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); } @@ -98,10 +114,24 @@ private: 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; wxAtomicInt m_count; - }* m_ref; + }; + + template + 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) { @@ -116,7 +146,7 @@ private: { if (!wxAtomicDec( m_ref->m_count )) { - delete m_ref->m_ptr; + m_ref->delete_ptr(); delete m_ref; } m_ref = NULL; diff --git a/interface/wx/sharedptr.h b/interface/wx/sharedptr.h index f3c2131..8b7087b 100644 --- a/interface/wx/sharedptr.h +++ b/interface/wx/sharedptr.h @@ -29,6 +29,22 @@ public: 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 + wxEXPLICIT wxSharedPtr(T* ptr, Deleter d); + + /** Copy constructor. */ wxSharedPtr(const wxSharedPtr& tocopy); @@ -89,6 +105,21 @@ public: 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 + void reset(T* ptr, Deleter d); + + /** Returns @true if this is the only pointer pointing to its object. */ bool unique() const; -- 2.7.4