]> git.saurik.com Git - wxWidgets.git/commitdiff
added wxObject::AllocExclusive() and associated methods
authorVadim Zeitlin <vadim@wxwidgets.org>
Thu, 31 Jan 2002 16:01:09 +0000 (16:01 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Thu, 31 Jan 2002 16:01:09 +0000 (16:01 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13937 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/object.h
src/common/object.cpp

index 6b529bd31e60f4795692a7a868c7cdd449fdd26a..8ea419a4be1c59bacb69009101ec879433c417d1 100644 (file)
@@ -84,7 +84,7 @@ public:
     static const wxClassInfo  *GetFirst() { return sm_first; }
     const wxClassInfo         *GetNext() const { return m_next; }
     static wxClassInfo        *FindClass(const wxChar *className);
-    
+
         // Climb upwards through inheritance hierarchy.
         // Dual inheritance is catered for.
 
@@ -382,18 +382,33 @@ public:
     virtual void Dump(wxSTD ostream& str);
 #endif
 
-        // make a 'clone' of the object
-  
+    // ref counted data handling methods
+
+    // get/set
+    wxObjectRefData *GetRefData() const { return m_refData; }
+    void SetRefData(wxObjectRefData *data) { m_refData = data; }
+
+    // make a 'clone' of the object
     void Ref(const wxObject& clone);
 
-        // destroy a reference
-  
+    // destroy a reference
     void UnRef();
 
-    inline wxObjectRefData *GetRefData() const { return m_refData; }
-    inline void SetRefData(wxObjectRefData *data) { m_refData = data; }
-
 protected:
+    // ensure that our data is not shared with anybody else: if we have no
+    // data, it is created using CreateRefData() below, if we have shared data
+    // it is copied using CloneRefData(), otherwise nothing is done
+    void AllocExclusive();
+
+    // both methods must be implemented if Unshare() is used, not pure virtual
+    // only because of the backwards compatibility reasons
+
+    // create a new m_refData
+    virtual wxObjectRefData *CreateRefData() const;
+
+    // create a new m_refData initialized with the given one
+    virtual wxObjectRefData *CloneRefData(wxObjectRefData *data) const;
+
     wxObjectRefData *m_refData;
 };
 
index 86b84c8a4370cf79d26e2f740fc90192a834068a..d502615e2717b5ebc310b1aaf127b8a294ebdfbf 100644 (file)
@@ -227,14 +227,14 @@ wxObject *wxCreateDynamicObject(const wxChar *name)
 void wxObject::Ref(const wxObject& clone)
 {
 #if defined(__WXDEBUG__) || wxUSE_DEBUG_CONTEXT
- DEBUG_PRINTF(wxObject::Ref)
   DEBUG_PRINTF(wxObject::Ref)
 #endif
 
     // delete reference to old data
     UnRef();
 
     // reference new data
-    if( clone.m_refData )
+    if ( clone.m_refData )
     {
         m_refData = clone.m_refData;
         ++(m_refData->m_count);
@@ -243,16 +243,50 @@ void wxObject::Ref(const wxObject& clone)
 
 void wxObject::UnRef()
 {
-    if( m_refData )
+    if ( m_refData )
     {
         wxASSERT_MSG( m_refData->m_count > 0, _T("invalid ref data count") );
 
         if ( !--m_refData->m_count )
             delete m_refData;
-        m_refData = 0;
+        m_refData = NULL;
     }
 }
 
+void wxObject::AllocExclusive()
+{
+    if ( !m_refData )
+    {
+        m_refData = CreateRefData();
+    }
+    else if ( m_refData->GetRefCount() > 1 )
+    {
+        // note that ref is not going to be destroyed in this case
+        wxObjectRefData* ref = m_refData;
+        UnRef();
+
+        // ... so we can still access it
+        m_refData = CloneRefData(ref);
+    }
+    //else: ref count is 1, we are exclusive owners of m_refData anyhow
+
+    wxASSERT_MSG( m_refData && m_refData->GetRefCount() == 1,
+                  _T("wxObject::AllocExclusive() failed.") );
+}
+
+wxObjectRefData *wxObject::CreateRefData() const
+{
+    return NULL;
+}
+
+wxObjectRefData *wxObject::CloneRefData(wxObjectRefData * WXUNUSED(data)) const
+{
+    return NULL;
+}
+
+// ----------------------------------------------------------------------------
+// misc
+// ----------------------------------------------------------------------------
 
 #if defined(__DARWIN__) && defined(DYLIB_INIT)