X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c1e10a22b6a2f859d23024bdb57f84665f66f89e..cbeda384e51acb82e13994cb67ac1714669cae10:/include/wx/object.h diff --git a/include/wx/object.h b/include/wx/object.h index a65117de24..9da3222c8e 100644 --- a/include/wx/object.h +++ b/include/wx/object.h @@ -19,8 +19,8 @@ #include "wx/memory.h" -class WXDLLIMPEXP_BASE wxObject; -class WXDLLIMPEXP_BASE wxString; +class WXDLLIMPEXP_FWD_BASE wxObject; +class WXDLLIMPEXP_FWD_BASE wxString; #ifndef wxUSE_EXTENDED_RTTI #define wxUSE_EXTENDED_RTTI 0 @@ -65,12 +65,12 @@ class WXDLLIMPEXP_BASE wxString; // conditional compilation // ---------------------------------------------------------------------------- -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; +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 @@ -80,7 +80,7 @@ typedef wxObject *(*wxObjectConstructorFn)(void); class WXDLLIMPEXP_BASE wxClassInfo { - friend class WXDLLIMPEXP_BASE wxObject; + friend class WXDLLIMPEXP_FWD_BASE wxObject; friend WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxString& name); public: wxClassInfo( const wxChar *className, @@ -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); @@ -190,7 +190,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; } @@ -278,9 +278,9 @@ name##PluginSentinel m_pluginsentinel; #endif // wxUSE_NESTED_CLASSES #define DECLARE_PLUGGABLE_CLASS(name) \ - DECLARE_DYNAMIC_CLASS(name) _DECLARE_DL_SENTINEL(name, WXDLLEXPORT) + DECLARE_DYNAMIC_CLASS(name) _DECLARE_DL_SENTINEL(name, WXDLLIMPEXP_CORE) #define DECLARE_ABSTRACT_PLUGGABLE_CLASS(name) \ - DECLARE_ABSTRACT_CLASS(name) _DECLARE_DL_SENTINEL(name, WXDLLEXPORT) + DECLARE_ABSTRACT_CLASS(name) _DECLARE_DL_SENTINEL(name, WXDLLIMPEXP_CORE) #define DECLARE_USER_EXPORTED_PLUGGABLE_CLASS(name, usergoo) \ DECLARE_DYNAMIC_CLASS(name) _DECLARE_DL_SENTINEL(name, usergoo) @@ -319,8 +319,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 +328,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 +355,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,7 +396,7 @@ 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 @@ -408,7 +404,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) { } @@ -442,21 +438,40 @@ 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; } - 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) { @@ -466,22 +481,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->IncRef(); + m_ptr->DecRef(); + m_ptr = ptr; return *this; } @@ -517,7 +530,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 @@ -594,7 +607,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) ; @@ -609,8 +622,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 } @@ -636,24 +649,16 @@ 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 #endif // _WX_OBJECTH__