X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4e124582c4503cea32915642d97a0476f8d81cc4..21324807f5dd02a91124bdc50cb350af88058018:/include/wx/object.h?ds=sidebyside diff --git a/include/wx/object.h b/include/wx/object.h index b7de67c0fe..a1d021fa91 100644 --- a/include/wx/object.h +++ b/include/wx/object.h @@ -94,19 +94,12 @@ public: ( m_baseInfo2 && m_baseInfo2->IsKindOf(info) ) ); } -#if WXWIN_COMPATIBILITY_2_4 - // Initializes parent pointers and hash table for fast searching. - wxDEPRECATED( static void InitializeClasses() ); - // Cleans up hash table used for fast searching. - wxDEPRECATED( static void CleanUpClasses() ); -#endif - public: const wxChar *m_className; int m_objectSize; wxObjectConstructorFn m_objectConstructor; - // Pointers to base wxClassInfos: set in InitializeClasses + // Pointers to base wxClassInfos const wxClassInfo *m_baseInfo1; const wxClassInfo *m_baseInfo2; @@ -121,25 +114,16 @@ public: // many clients) static wxHashTable *sm_classTable; -private: - // InitializeClasses() helper - static wxClassInfo *GetBaseByName(const wxChar *name); - - DECLARE_NO_COPY_CLASS(wxClassInfo) - protected: // registers the class void Register(); void Unregister(); + + DECLARE_NO_COPY_CLASS(wxClassInfo) }; WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxChar *name); -#if WXWIN_COMPATIBILITY_2_4 -inline void wxClassInfo::InitializeClasses() {} -inline void wxClassInfo::CleanUpClasses() {} -#endif - // ---------------------------------------------------------------------------- // Dynamic class macros // ---------------------------------------------------------------------------- @@ -392,14 +376,83 @@ class WXDLLIMPEXP_BASE wxObjectRefData public: wxObjectRefData() : m_count(1) { } - virtual ~wxObjectRefData() { } int GetRefCount() const { return m_count; } + void IncRef() { m_count++; } + void DecRef(); + +protected: + // this object should never be destroyed directly but only as a + // result of a DecRef() call: + virtual ~wxObjectRefData() { } + private: + // our refcount: int m_count; }; +// ---------------------------------------------------------------------------- +// wxObjectDataPtr: helper class to avoid memleaks because of missing calls +// to wxObjectRefData::DecRef +// ---------------------------------------------------------------------------- + +template +class wxObjectDataPtr +{ +public: + typedef T element_type; + + wxEXPLICIT wxObjectDataPtr(T *ptr = NULL) : m_ptr(ptr) {} + + // copy ctor + wxObjectDataPtr(const wxObjectDataPtr &tocopy) + : m_ptr(tocopy.m_ptr) + { + if (m_ptr) + m_ptr->IncRef(); + } + + ~wxObjectDataPtr() + { + if (m_ptr) + m_ptr->DecRef(); + } + + T *get() const { return m_ptr; } + T *operator->() const { return get(); } + + void reset(T *ptr) + { + if (m_ptr) + m_ptr->DecRef(); + m_ptr = ptr; + } + + wxObjectDataPtr& operator=(const wxObjectDataPtr &tocopy) + { + if (m_ptr) + m_ptr->DecRef(); + m_ptr = tocopy.m_ptr; + if (m_ptr) + m_ptr->IncRef(); + return *this; + } + + wxObjectDataPtr& operator=(T *ptr) + { + if (m_ptr) + m_ptr->DecRef(); + m_ptr = ptr; + if (m_ptr) + m_ptr->IncRef(); + return *this; + } + +private: + T *m_ptr; +}; + // ---------------------------------------------------------------------------- // wxObject: the root class of wxWidgets object hierarchy // ---------------------------------------------------------------------------- @@ -476,9 +529,8 @@ public: // Make sure this object has only one reference void UnShare() { AllocExclusive(); } - // Do a shallow comparison of our referenced data with the given object's - // refdata - bool IsRefTo(const wxObject *p) const { return m_refData == p->m_refData; } + // check if this object references the same data as the other one + bool IsSameAs(const wxObject& o) const { return m_refData == o.m_refData; } protected: // ensure that our data is not shared with anybody else: if we have no @@ -521,7 +573,8 @@ public: #ifdef _MSC_VER return (wxClassInfo*) m_classInfo; #else - return wx_const_cast(wxClassInfo *, m_classInfo); + wxDynamicClassInfo *nonconst = wx_const_cast(wxDynamicClassInfo *, m_classInfo); + return wx_static_cast(wxClassInfo *, nonconst); #endif }