]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/sharedptr.h
Avoid dropping events in wxDocParentFrameAnyBase in some circumstances.
[wxWidgets.git] / include / wx / sharedptr.h
index 5bfd215136e22640647b746b1a6b5acf16185151..a9b6442c09b52a8cc22dda34759aac8a153eb3d2 100644 (file)
@@ -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: object.h 47254 2007-07-09 10:09:52Z VS $
 // Copyright:   Robert Roebling
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
@@ -31,6 +30,14 @@ public:
             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(const wxSharedPtr& tocopy)   { Acquire(tocopy.m_ref); }
 
@@ -92,6 +99,14 @@ public:
             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); }
     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<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)
     {
@@ -115,10 +144,9 @@ private:
     {
         if (m_ref)
         {
-            wxAtomicDec( m_ref->m_count );
-            if (m_ref->m_count == 0)
+            if (!wxAtomicDec( m_ref->m_count ))
             {
-                delete m_ref->m_ptr;
+                m_ref->delete_ptr();
                 delete m_ref;
             }
             m_ref = NULL;