X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/43003176311ddbd6abaf0e5d15b0967506cb8d3b..e118367990e341b7ba8e5f02295d7aa8def23d5b:/include/wx/sharedptr.h diff --git a/include/wx/sharedptr.h b/include/wx/sharedptr.h index 290c610adc..a9b6442c09 100644 --- a/include/wx/sharedptr.h +++ b/include/wx/sharedptr.h @@ -3,7 +3,6 @@ // Purpose: Shared pointer based on the counted_ptr<> template, which // is in the public domain // Author: Robert Roebling, Yonat Sharon -// RCS-ID: $Id$ // Copyright: Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -31,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); } @@ -92,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); } @@ -99,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) { @@ -117,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;