From 807d848702772c7dc59e7a2bb35b2971ad86a64d Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Thu, 31 Jan 2002 16:01:09 +0000 Subject: [PATCH] added wxObject::AllocExclusive() and associated methods git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13937 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/object.h | 31 +++++++++++++++++++++++-------- src/common/object.cpp | 42 ++++++++++++++++++++++++++++++++++++++---- 2 files changed, 61 insertions(+), 12 deletions(-) diff --git a/include/wx/object.h b/include/wx/object.h index 6b529bd31e..8ea419a4be 100644 --- a/include/wx/object.h +++ b/include/wx/object.h @@ -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; }; diff --git a/src/common/object.cpp b/src/common/object.cpp index 86b84c8a43..d502615e27 100644 --- a/src/common/object.cpp +++ b/src/common/object.cpp @@ -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) -- 2.45.2