X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a3ab1c18017bb08329e73918f9f502ea00cdb447..40e5ebbf98728d627e4d3c9e3a57f28f5bb8fcb9:/include/wx/object.h diff --git a/include/wx/object.h b/include/wx/object.h index f9d9f2be9b..a65117de24 100644 --- a/include/wx/object.h +++ b/include/wx/object.h @@ -20,11 +20,43 @@ #include "wx/memory.h" class WXDLLIMPEXP_BASE wxObject; +class WXDLLIMPEXP_BASE wxString; #ifndef wxUSE_EXTENDED_RTTI #define wxUSE_EXTENDED_RTTI 0 #endif +#define DECLARE_CLASS_INFO_ITERATORS() \ + class WXDLLIMPEXP_BASE const_iterator \ + { \ + typedef wxHashTable_Node Node; \ + public: \ + typedef const wxClassInfo* value_type; \ + typedef const value_type& const_reference; \ + typedef const_iterator itor; \ + typedef value_type* ptr_type; \ + \ + Node* m_node; \ + wxHashTable* m_table; \ + public: \ + typedef const_reference reference_type; \ + typedef ptr_type pointer_type; \ + \ + const_iterator(Node* node, wxHashTable* table) \ + : m_node(node), m_table(table) { } \ + const_iterator() : m_node(NULL), m_table(NULL) { } \ + value_type operator*() const; \ + itor& operator++(); \ + const itor operator++(int); \ + bool operator!=(const itor& it) const \ + { return it.m_node != m_node; } \ + bool operator==(const itor& it) const \ + { return it.m_node == m_node; } \ + }; \ + \ + static const_iterator begin_classinfo(); \ + static const_iterator end_classinfo(); + #if wxUSE_EXTENDED_RTTI #include "wx/xti.h" #else @@ -35,7 +67,10 @@ class WXDLLIMPEXP_BASE wxObject; class WXDLLIMPEXP_BASE wxClassInfo; class WXDLLIMPEXP_BASE wxHashTable; +class WXDLLIMPEXP_BASE wxObject; +class WXDLLIMPEXP_BASE wxPluginLibrary; class WXDLLIMPEXP_BASE wxObjectRefData; +class WXDLLIMPEXP_BASE wxHashTable_Node; // ---------------------------------------------------------------------------- // wxClassInfo @@ -45,6 +80,8 @@ typedef wxObject *(*wxObjectConstructorFn)(void); class WXDLLIMPEXP_BASE wxClassInfo { + friend class WXDLLIMPEXP_BASE wxObject; + friend WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxString& name); public: wxClassInfo( const wxChar *className, const wxClassInfo *baseInfo1, @@ -81,7 +118,7 @@ public: { return m_objectConstructor; } static const wxClassInfo *GetFirst() { return sm_first; } const wxClassInfo *GetNext() const { return m_next; } - static wxClassInfo *FindClass(const wxChar *className); + static wxClassInfo *FindClass(const wxString& className); // Climb upwards through inheritance hierarchy. // Dual inheritance is catered for. @@ -94,19 +131,13 @@ 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: + DECLARE_CLASS_INFO_ITERATORS() +private: 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; @@ -117,28 +148,17 @@ public: static wxClassInfo *sm_first; wxClassInfo *m_next; - // FIXME: this should be private (currently used directly by way too - // 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(); -}; -WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxChar *name); + DECLARE_NO_COPY_CLASS(wxClassInfo) +}; -#if WXWIN_COMPATIBILITY_2_4 -inline void wxClassInfo::InitializeClasses() {} -inline void wxClassInfo::CleanUpClasses() {} -#endif +WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxString& name); // ---------------------------------------------------------------------------- // Dynamic class macros @@ -392,14 +412,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 // ---------------------------------------------------------------------------- @@ -520,7 +609,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 }