X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e39d30c05b9febb396cd9f133b9df7718142e299..c79510ca120b9b6d143c278dcf96b1403410121b:/include/wx/object.h diff --git a/include/wx/object.h b/include/wx/object.h index df40c11d43..23b34bf334 100644 --- a/include/wx/object.h +++ b/include/wx/object.h @@ -26,7 +26,7 @@ class WXDLLIMPEXP_FWD_BASE wxString; #define wxUSE_EXTENDED_RTTI 0 #endif -#define DECLARE_CLASS_INFO_ITERATORS() \ +#define wxDECLARE_CLASS_INFO_ITERATORS() \ class WXDLLIMPEXP_BASE const_iterator \ { \ typedef wxHashTable_Node Node; \ @@ -55,7 +55,7 @@ class WXDLLIMPEXP_FWD_BASE wxString; }; \ \ static const_iterator begin_classinfo(); \ - static const_iterator end_classinfo(); + static const_iterator end_classinfo() #if wxUSE_EXTENDED_RTTI #include "wx/xti.h" @@ -69,7 +69,6 @@ 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; // ---------------------------------------------------------------------------- @@ -131,7 +130,8 @@ public: ( m_baseInfo2 && m_baseInfo2->IsKindOf(info) ) ); } - DECLARE_CLASS_INFO_ITERATORS() + wxDECLARE_CLASS_INFO_ITERATORS(); + private: const wxChar *m_className; int m_objectSize; @@ -155,7 +155,7 @@ protected: void Register(); void Unregister(); - DECLARE_NO_COPY_CLASS(wxClassInfo) + wxDECLARE_NO_COPY_CLASS(wxClassInfo); }; WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxString& name); @@ -164,24 +164,25 @@ WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxString& name); // Dynamic class macros // ---------------------------------------------------------------------------- -#define DECLARE_ABSTRACT_CLASS(name) \ +#define wxDECLARE_ABSTRACT_CLASS(name) \ public: \ static wxClassInfo ms_classInfo; \ - virtual wxClassInfo *GetClassInfo() const; + virtual wxClassInfo *GetClassInfo() const -#define DECLARE_DYNAMIC_CLASS_NO_ASSIGN(name) \ - DECLARE_NO_ASSIGN_CLASS(name) \ - DECLARE_DYNAMIC_CLASS(name) +#define wxDECLARE_DYNAMIC_CLASS_NO_ASSIGN(name) \ + wxDECLARE_NO_ASSIGN_CLASS(name); \ + wxDECLARE_DYNAMIC_CLASS(name) -#define DECLARE_DYNAMIC_CLASS_NO_COPY(name) \ - DECLARE_NO_COPY_CLASS(name) \ - DECLARE_DYNAMIC_CLASS(name) +#define wxDECLARE_DYNAMIC_CLASS_NO_COPY(name) \ + wxDECLARE_NO_COPY_CLASS(name); \ + wxDECLARE_DYNAMIC_CLASS(name) -#define DECLARE_DYNAMIC_CLASS(name) \ - DECLARE_ABSTRACT_CLASS(name) \ - static wxObject* wxCreateObject(); +#define wxDECLARE_DYNAMIC_CLASS(name) \ + wxDECLARE_ABSTRACT_CLASS(name); \ + static wxObject* wxCreateObject() -#define DECLARE_CLASS(name) DECLARE_DYNAMIC_CLASS(name) +#define wxDECLARE_CLASS(name) \ + wxDECLARE_DYNAMIC_CLASS(name) // common part of the macros below @@ -190,7 +191,7 @@ WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxString& name); &basename::ms_classInfo, \ baseclsinfo2, \ (int) sizeof(name), \ - (wxObjectConstructorFn) func); \ + func); \ \ wxClassInfo *name::GetClassInfo() const \ { return &name::ms_classInfo; } @@ -206,13 +207,13 @@ WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxString& name); // ----------------------------------- // Single inheritance with one base class -#define IMPLEMENT_DYNAMIC_CLASS(name, basename) \ +#define wxIMPLEMENT_DYNAMIC_CLASS(name, basename) \ wxIMPLEMENT_CLASS_COMMON1(name, basename, name::wxCreateObject) \ wxObject* name::wxCreateObject() \ { return new name; } // Multiple inheritance with two base classes -#define IMPLEMENT_DYNAMIC_CLASS2(name, basename1, basename2) \ +#define wxIMPLEMENT_DYNAMIC_CLASS2(name, basename1, basename2) \ wxIMPLEMENT_CLASS_COMMON2(name, basename1, basename2, \ name::wxCreateObject) \ wxObject* name::wxCreateObject() \ @@ -223,17 +224,18 @@ WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxString& name); // ----------------------------------- // Single inheritance with one base class - -#define IMPLEMENT_ABSTRACT_CLASS(name, basename) \ +#define wxIMPLEMENT_ABSTRACT_CLASS(name, basename) \ wxIMPLEMENT_CLASS_COMMON1(name, basename, NULL) // Multiple inheritance with two base classes - -#define IMPLEMENT_ABSTRACT_CLASS2(name, basename1, basename2) \ +#define wxIMPLEMENT_ABSTRACT_CLASS2(name, basename1, basename2) \ wxIMPLEMENT_CLASS_COMMON2(name, basename1, basename2, NULL) -#define IMPLEMENT_CLASS IMPLEMENT_ABSTRACT_CLASS -#define IMPLEMENT_CLASS2 IMPLEMENT_ABSTRACT_CLASS2 +#define wxIMPLEMENT_CLASS(name, basename) \ + wxIMPLEMENT_ABSTRACT_CLASS(name, basename) + +#define wxIMPLEMENT_CLASS2(name, basename1, basename2) \ + IMPLEMENT_ABSTRACT_CLASS2(name, basename1, basename2) #endif // !wxUSE_EXTENDED_RTTI @@ -258,7 +260,7 @@ public: \ name##PluginSentinel(); \ ~name##PluginSentinel(); \ }; \ -name##PluginSentinel m_pluginsentinel; +name##PluginSentinel m_pluginsentinel #define _IMPLEMENT_DL_SENTINEL(name) \ const wxString name::name##PluginSentinel::sm_className(#name); \ @@ -277,35 +279,35 @@ name##PluginSentinel m_pluginsentinel; #endif // wxUSE_NESTED_CLASSES -#define DECLARE_PLUGGABLE_CLASS(name) \ - DECLARE_DYNAMIC_CLASS(name) _DECLARE_DL_SENTINEL(name, WXDLLEXPORT) -#define DECLARE_ABSTRACT_PLUGGABLE_CLASS(name) \ - DECLARE_ABSTRACT_CLASS(name) _DECLARE_DL_SENTINEL(name, WXDLLEXPORT) - -#define DECLARE_USER_EXPORTED_PLUGGABLE_CLASS(name, usergoo) \ - DECLARE_DYNAMIC_CLASS(name) _DECLARE_DL_SENTINEL(name, usergoo) -#define DECLARE_USER_EXPORTED_ABSTRACT_PLUGGABLE_CLASS(name, usergoo) \ - DECLARE_ABSTRACT_CLASS(name) _DECLARE_DL_SENTINEL(name, usergoo) - -#define IMPLEMENT_PLUGGABLE_CLASS(name, basename) \ - IMPLEMENT_DYNAMIC_CLASS(name, basename) _IMPLEMENT_DL_SENTINEL(name) -#define IMPLEMENT_PLUGGABLE_CLASS2(name, basename1, basename2) \ - IMPLEMENT_DYNAMIC_CLASS2(name, basename1, basename2) _IMPLEMENT_DL_SENTINEL(name) -#define IMPLEMENT_ABSTRACT_PLUGGABLE_CLASS(name, basename) \ - IMPLEMENT_ABSTRACT_CLASS(name, basename) _IMPLEMENT_DL_SENTINEL(name) -#define IMPLEMENT_ABSTRACT_PLUGGABLE_CLASS2(name, basename1, basename2) \ - IMPLEMENT_ABSTRACT_CLASS2(name, basename1, basename2) _IMPLEMENT_DL_SENTINEL(name) - -#define IMPLEMENT_USER_EXPORTED_PLUGGABLE_CLASS(name, basename) \ - IMPLEMENT_PLUGGABLE_CLASS(name, basename) -#define IMPLEMENT_USER_EXPORTED_PLUGGABLE_CLASS2(name, basename1, basename2) \ - IMPLEMENT_PLUGGABLE_CLASS2(name, basename1, basename2) -#define IMPLEMENT_USER_EXPORTED_ABSTRACT_PLUGGABLE_CLASS(name, basename) \ - IMPLEMENT_ABSTRACT_PLUGGABLE_CLASS(name, basename) -#define IMPLEMENT_USER_EXPORTED_ABSTRACT_PLUGGABLE_CLASS2(name, basename1, basename2) \ - IMPLEMENT_ABSTRACT_PLUGGABLE_CLASS2(name, basename1, basename2) - -#define CLASSINFO(name) (&name::ms_classInfo) +#define wxDECLARE_PLUGGABLE_CLASS(name) \ + wxDECLARE_DYNAMIC_CLASS(name); _DECLARE_DL_SENTINEL(name, WXDLLIMPEXP_CORE) +#define wxDECLARE_ABSTRACT_PLUGGABLE_CLASS(name) \ + wxDECLARE_ABSTRACT_CLASS(name); _DECLARE_DL_SENTINEL(name, WXDLLIMPEXP_CORE) + +#define wxDECLARE_USER_EXPORTED_PLUGGABLE_CLASS(name, usergoo) \ + wxDECLARE_DYNAMIC_CLASS(name); _DECLARE_DL_SENTINEL(name, usergoo) +#define wxDECLARE_USER_EXPORTED_ABSTRACT_PLUGGABLE_CLASS(name, usergoo) \ + wxDECLARE_ABSTRACT_CLASS(name); _DECLARE_DL_SENTINEL(name, usergoo) + +#define wxIMPLEMENT_PLUGGABLE_CLASS(name, basename) \ + wxIMPLEMENT_DYNAMIC_CLASS(name, basename) _IMPLEMENT_DL_SENTINEL(name) +#define wxIMPLEMENT_PLUGGABLE_CLASS2(name, basename1, basename2) \ + wxIMPLEMENT_DYNAMIC_CLASS2(name, basename1, basename2) _IMPLEMENT_DL_SENTINEL(name) +#define wxIMPLEMENT_ABSTRACT_PLUGGABLE_CLASS(name, basename) \ + wxIMPLEMENT_ABSTRACT_CLASS(name, basename) _IMPLEMENT_DL_SENTINEL(name) +#define wxIMPLEMENT_ABSTRACT_PLUGGABLE_CLASS2(name, basename1, basename2) \ + wxIMPLEMENT_ABSTRACT_CLASS2(name, basename1, basename2) _IMPLEMENT_DL_SENTINEL(name) + +#define wxIMPLEMENT_USER_EXPORTED_PLUGGABLE_CLASS(name, basename) \ + wxIMPLEMENT_PLUGGABLE_CLASS(name, basename) +#define wxIMPLEMENT_USER_EXPORTED_PLUGGABLE_CLASS2(name, basename1, basename2) \ + wxIMPLEMENT_PLUGGABLE_CLASS2(name, basename1, basename2) +#define wxIMPLEMENT_USER_EXPORTED_ABSTRACT_PLUGGABLE_CLASS(name, basename) \ + wxIMPLEMENT_ABSTRACT_PLUGGABLE_CLASS(name, basename) +#define wxIMPLEMENT_USER_EXPORTED_ABSTRACT_PLUGGABLE_CLASS2(name, basename1, basename2) \ + wxIMPLEMENT_ABSTRACT_PLUGGABLE_CLASS2(name, basename1, basename2) + +#define wxCLASSINFO(name) (&name::ms_classInfo) #define wxIS_KIND_OF(obj, className) obj->IsKindOf(&className::ms_classInfo) @@ -319,8 +321,8 @@ name##PluginSentinel m_pluginsentinel; // be replaced by it as long as there are any compilers not supporting it #define wxDynamicCast(obj, className) \ ((className *) wxCheckDynamicCast( \ - wx_const_cast(wxObject *, wx_static_cast(const wxObject *, \ - wx_const_cast(className *, wx_static_cast(const className *, obj)))), \ + const_cast(static_cast(\ + const_cast(static_cast(obj)))), \ &className::ms_classInfo)) // The 'this' pointer is always true, so use this version @@ -328,20 +330,16 @@ name##PluginSentinel m_pluginsentinel; #define wxDynamicCastThis(className) \ (IsKindOf(&className::ms_classInfo) ? (className *)(this) : (className *)0) -#ifdef __WXDEBUG__ -inline void* wxCheckCast(void *ptr) +// FIXME-VC6: dummy argument needed because VC6 doesn't support explicitly +// choosing the template function to call +template +inline T *wxCheckCast(const void *ptr, T * = NULL) { - wxASSERT_MSG( ptr, _T("wxStaticCast() used incorrectly") ); - return ptr; + wxASSERT_MSG( wxDynamicCast(ptr, T), "wxStaticCast() used incorrectly" ); + return const_cast(static_cast(ptr)); } -#define wxStaticCast(obj, className) \ - ((className *)wxCheckCast(wxDynamicCast(obj, className))) - -#else // !__WXDEBUG__ -#define wxStaticCast(obj, className) \ - wx_const_cast(className *, wx_static_cast(const className *, obj)) -#endif // __WXDEBUG__ +#define wxStaticCast(obj, className) wxCheckCast((obj), (className *)NULL) // ---------------------------------------------------------------------------- // set up memory debugging macros @@ -359,7 +357,7 @@ inline void* wxCheckCast(void *ptr) _WX_WANT_ARRAY_DELETE_VOID_WXCHAR_INT = void operator delete[] (void* buf, wxChar*, int ) */ -#if defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING +#if wxUSE_MEMORY_TRACING // All compilers get this one #define _WX_WANT_NEW_SIZET_WXCHAR_INT @@ -400,18 +398,16 @@ inline void* wxCheckCast(void *ptr) #endif // wxUSE_ARRAY_MEMORY_OPERATORS -#endif // __WXDEBUG__ && wxUSE_MEMORY_TRACING +#endif // wxUSE_MEMORY_TRACING // ---------------------------------------------------------------------------- -// wxObjectRefData: ref counted data meant to be stored in wxObject +// wxRefCounter: ref counted data "manager" // ---------------------------------------------------------------------------- -class WXDLLIMPEXP_BASE wxObjectRefData +class WXDLLIMPEXP_BASE wxRefCounter { - friend class WXDLLIMPEXP_FWD_BASE wxObject; - public: - wxObjectRefData() : m_count(1) { } + wxRefCounter() { m_count = 1; } int GetRefCount() const { return m_count; } @@ -421,13 +417,20 @@ public: protected: // this object should never be destroyed directly but only as a // result of a DecRef() call: - virtual ~wxObjectRefData() { } + virtual ~wxRefCounter() { } private: // our refcount: int m_count; }; +// ---------------------------------------------------------------------------- +// wxObjectRefData: ref counted data meant to be stored in wxObject +// ---------------------------------------------------------------------------- + +typedef wxRefCounter wxObjectRefData; + + // ---------------------------------------------------------------------------- // wxObjectDataPtr: helper class to avoid memleaks because of missing calls // to wxObjectRefData::DecRef @@ -442,25 +445,39 @@ public: wxEXPLICIT wxObjectDataPtr(T *ptr = NULL) : m_ptr(ptr) {} // copy ctor - wxObjectDataPtr(const wxObjectDataPtr &tocopy) + wxObjectDataPtr(const wxObjectDataPtr &tocopy) : m_ptr(tocopy.m_ptr) - { + { if (m_ptr) - m_ptr->IncRef(); + m_ptr->IncRef(); } - ~wxObjectDataPtr() - { - if (m_ptr) - m_ptr->DecRef(); + ~wxObjectDataPtr() + { + if (m_ptr) + m_ptr->DecRef(); } T *get() const { return m_ptr; } - + + // 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(); + { + wxASSERT(m_ptr != NULL); + return get(); } void reset(T *ptr) @@ -471,20 +488,20 @@ public: } wxObjectDataPtr& operator=(const wxObjectDataPtr &tocopy) - { - if (m_ptr) - m_ptr->DecRef(); - m_ptr = tocopy.m_ptr; + { + if (m_ptr) + m_ptr->DecRef(); + m_ptr = tocopy.m_ptr; if (m_ptr) - m_ptr->IncRef(); + m_ptr->IncRef(); return *this; } wxObjectDataPtr& operator=(T *ptr) - { - if (m_ptr) - m_ptr->DecRef(); - m_ptr = ptr; + { + if (m_ptr) + m_ptr->DecRef(); + m_ptr = ptr; return *this; } @@ -498,7 +515,7 @@ private: class WXDLLIMPEXP_BASE wxObject { - DECLARE_ABSTRACT_CLASS(wxObject) + wxDECLARE_ABSTRACT_CLASS(wxObject); public: wxObject() { m_refData = NULL; } @@ -508,7 +525,7 @@ public: { m_refData = other.m_refData; if (m_refData) - m_refData->m_count++; + m_refData->IncRef(); } wxObject& operator=(const wxObject& other) @@ -520,7 +537,7 @@ public: return *this; } - bool IsKindOf(wxClassInfo *info) const; + bool IsKindOf(const wxClassInfo *info) const; // Turn on the correct set of new and delete operators @@ -612,8 +629,8 @@ public: #ifdef _MSC_VER return (wxClassInfo*) m_classInfo; #else - wxDynamicClassInfo *nonconst = wx_const_cast(wxDynamicClassInfo *, m_classInfo); - return wx_static_cast(wxClassInfo *, nonconst); + wxDynamicClassInfo *nonconst = const_cast(m_classInfo); + return static_cast(nonconst); #endif } @@ -639,24 +656,54 @@ private : // more debugging macros // ---------------------------------------------------------------------------- -// Redefine new to be the debugging version. This doesn't work with all -// compilers, in which case you need to use WXDEBUG_NEW explicitly if you wish -// to use the debugging version. - -#ifdef __WXDEBUG__ +#if wxUSE_DEBUG_NEW_ALWAYS #define WXDEBUG_NEW new(__TFILE__,__LINE__) - #if wxUSE_DEBUG_NEW_ALWAYS - #if wxUSE_GLOBAL_MEMORY_OPERATORS - #define new WXDEBUG_NEW - #elif defined(__VISUALC__) - // Including this file redefines new and allows leak reports to - // contain line numbers - #include "wx/msw/msvcrt.h" - #endif - #endif // wxUSE_DEBUG_NEW_ALWAYS -#else // !__WXDEBUG__ - #define WXDEBUG_NEW new -#endif // __WXDEBUG__/!__WXDEBUG__ + #if wxUSE_GLOBAL_MEMORY_OPERATORS + #define new WXDEBUG_NEW + #elif defined(__VISUALC__) + // Including this file redefines new and allows leak reports to + // contain line numbers + #include "wx/msw/msvcrt.h" + #endif +#endif // wxUSE_DEBUG_NEW_ALWAYS + +// ---------------------------------------------------------------------------- +// Compatibility macro aliases +// ---------------------------------------------------------------------------- + +// deprecated variants _not_ requiring a semicolon after them and without wx prefix. +// (note that also some wx-prefixed macro do _not_ require a semicolon because +// it's not always possible to force the compire to require it) + +#define DECLARE_CLASS_INFO_ITERATORS() wxDECLARE_CLASS_INFO_ITERATORS(); +#define DECLARE_ABSTRACT_CLASS(n) wxDECLARE_ABSTRACT_CLASS(n); +#define DECLARE_DYNAMIC_CLASS_NO_ASSIGN(n) wxDECLARE_DYNAMIC_CLASS_NO_ASSIGN(n); +#define DECLARE_DYNAMIC_CLASS_NO_COPY(n) wxDECLARE_DYNAMIC_CLASS_NO_COPY(n); +#define DECLARE_DYNAMIC_CLASS(n) wxDECLARE_DYNAMIC_CLASS(n); +#define DECLARE_CLASS(n) wxDECLARE_CLASS(n); + +#define IMPLEMENT_DYNAMIC_CLASS(n,b) wxIMPLEMENT_DYNAMIC_CLASS(n,b) +#define IMPLEMENT_DYNAMIC_CLASS2(n,b1,b2) wxIMPLEMENT_DYNAMIC_CLASS2(n,b1,b2) +#define IMPLEMENT_ABSTRACT_CLASS(n,b) wxIMPLEMENT_ABSTRACT_CLASS(n,b) +#define IMPLEMENT_ABSTRACT_CLASS2(n,b1,b2) wxIMPLEMENT_ABSTRACT_CLASS2(n,b1,b2) +#define IMPLEMENT_CLASS(n,b) wxIMPLEMENT_CLASS(n,b) +#define IMPLEMENT_CLASS2(n,b1,b2) wxIMPLEMENT_CLASS2(n,b1,b2) + +#define DECLARE_PLUGGABLE_CLASS(n) wxDECLARE_PLUGGABLE_CLASS(n); +#define DECLARE_ABSTRACT_PLUGGABLE_CLASS(n) wxDECLARE_ABSTRACT_PLUGGABLE_CLASS(n); +#define DECLARE_USER_EXPORTED_PLUGGABLE_CLASS(n,u) wxDECLARE_USER_EXPORTED_PLUGGABLE_CLASS(n,u); +#define DECLARE_USER_EXPORTED_ABSTRACT_PLUGGABLE_CLASS(n,u) wxDECLARE_USER_EXPORTED_ABSTRACT_PLUGGABLE_CLASS(n,u); + +#define IMPLEMENT_PLUGGABLE_CLASS(n,b) wxIMPLEMENT_PLUGGABLE_CLASS(n,b) +#define IMPLEMENT_PLUGGABLE_CLASS2(n,b,b2) wxIMPLEMENT_PLUGGABLE_CLASS2(n,b,b2) +#define IMPLEMENT_ABSTRACT_PLUGGABLE_CLASS(n,b) wxIMPLEMENT_ABSTRACT_PLUGGABLE_CLASS(n,b) +#define IMPLEMENT_ABSTRACT_PLUGGABLE_CLASS2(n,b,b2) wxIMPLEMENT_ABSTRACT_PLUGGABLE_CLASS2(n,b,b2) +#define IMPLEMENT_USER_EXPORTED_PLUGGABLE_CLASS(n,b) wxIMPLEMENT_USER_EXPORTED_PLUGGABLE_CLASS(n,b) +#define IMPLEMENT_USER_EXPORTED_PLUGGABLE_CLASS2(n,b,b2) wxIMPLEMENT_USER_EXPORTED_PLUGGABLE_CLASS2(n,b,b2) +#define IMPLEMENT_USER_EXPORTED_ABSTRACT_PLUGGABLE_CLASS(n,b) wxIMPLEMENT_USER_EXPORTED_ABSTRACT_PLUGGABLE_CLASS(n,b) +#define IMPLEMENT_USER_EXPORTED_ABSTRACT_PLUGGABLE_CLASS2(n,b,b2) wxIMPLEMENT_USER_EXPORTED_ABSTRACT_PLUGGABLE_CLASS2(n,b,b2) + +#define CLASSINFO(n) wxCLASSINFO(n) #endif // _WX_OBJECTH__