X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1125dc3f5cd23453ac8d321817436e5e7f1da923..dd9f8b6bb6935360a8271dc3e8749fb026b601a8:/include/wx/object.h diff --git a/include/wx/object.h b/include/wx/object.h index a1d021fa91..88297d21b8 100644 --- a/include/wx/object.h +++ b/include/wx/object.h @@ -19,12 +19,44 @@ #include "wx/memory.h" -class WXDLLIMPEXP_BASE wxObject; +class WXDLLIMPEXP_FWD_BASE wxObject; +class WXDLLIMPEXP_FWD_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 @@ -33,9 +65,12 @@ class WXDLLIMPEXP_BASE wxObject; // conditional compilation // ---------------------------------------------------------------------------- -class WXDLLIMPEXP_BASE wxClassInfo; -class WXDLLIMPEXP_BASE wxHashTable; -class WXDLLIMPEXP_BASE wxObjectRefData; +class WXDLLIMPEXP_FWD_BASE wxClassInfo; +class WXDLLIMPEXP_FWD_BASE wxHashTable; +class WXDLLIMPEXP_FWD_BASE wxObject; +class WXDLLIMPEXP_FWD_BASE wxPluginLibrary; +class WXDLLIMPEXP_FWD_BASE wxObjectRefData; +class WXDLLIMPEXP_FWD_BASE wxHashTable_Node; // ---------------------------------------------------------------------------- // wxClassInfo @@ -45,6 +80,8 @@ typedef wxObject *(*wxObjectConstructorFn)(void); class WXDLLIMPEXP_BASE wxClassInfo { + friend class WXDLLIMPEXP_FWD_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,7 +131,8 @@ public: ( m_baseInfo2 && m_baseInfo2->IsKindOf(info) ) ); } -public: + DECLARE_CLASS_INFO_ITERATORS() +private: const wxChar *m_className; int m_objectSize; wxObjectConstructorFn m_objectConstructor; @@ -110,8 +148,6 @@ 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; protected: @@ -122,7 +158,7 @@ protected: DECLARE_NO_COPY_CLASS(wxClassInfo) }; -WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxChar *name); +WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxString& name); // ---------------------------------------------------------------------------- // Dynamic class macros @@ -372,7 +408,7 @@ inline void* wxCheckCast(void *ptr) class WXDLLIMPEXP_BASE wxObjectRefData { - friend class WXDLLIMPEXP_BASE wxObject; + friend class WXDLLIMPEXP_FWD_BASE wxObject; public: wxObjectRefData() : m_count(1) { } @@ -420,7 +456,26 @@ public: } T *get() const { return m_ptr; } - T *operator->() const { return get(); } + + // test for pointer validity: defining conversion to unspecified_bool_type + // and not more obvious bool to avoid implicit conversions to integer types + typedef T *(wxObjectDataPtr::*unspecified_bool_type)() const; + operator unspecified_bool_type() const + { + return m_ptr ? &wxObjectDataPtr::get : NULL; + } + + T& operator*() const + { + wxASSERT(m_ptr != NULL); + return *(m_ptr); + } + + T *operator->() const + { + wxASSERT(m_ptr != NULL); + return get(); + } void reset(T *ptr) { @@ -444,8 +499,6 @@ public: if (m_ptr) m_ptr->DecRef(); m_ptr = ptr; - if (m_ptr) - m_ptr->IncRef(); return *this; } @@ -558,7 +611,7 @@ inline wxObject *wxCheckDynamicCast(wxObject *obj, wxClassInfo *classInfo) #if wxUSE_EXTENDED_RTTI class WXDLLIMPEXP_BASE wxDynamicObject : public wxObject { - friend class WXDLLIMPEXP_BASE wxDynamicClassInfo ; + friend class WXDLLIMPEXP_FWD_BASE wxDynamicClassInfo ; public: // instantiates this object with an instance of its superclass wxDynamicObject(wxObject* superClassInstance, const wxDynamicClassInfo *info) ;