X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b5dbe15d0bacde245539f54c4d97af6b4696f01f..664e5ff93e8ed74969e67c79ce9da004309ca91c:/include/wx/object.h?ds=sidebyside diff --git a/include/wx/object.h b/include/wx/object.h index e24fc89e1c..0f2f72b3f7 100644 --- a/include/wx/object.h +++ b/include/wx/object.h @@ -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 @@ -339,7 +339,7 @@ inline void* wxCheckCast(void *ptr) #else // !__WXDEBUG__ #define wxStaticCast(obj, className) \ - wx_const_cast(className *, wx_static_cast(const className *, obj)) + const_cast(static_cast(obj)) #endif // __WXDEBUG__ @@ -442,21 +442,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 +485,20 @@ public: } wxObjectDataPtr& operator=(const wxObjectDataPtr &tocopy) - { - if (m_ptr) - m_ptr->DecRef(); - m_ptr = tocopy.m_ptr; + { if (m_ptr) - m_ptr->IncRef(); + 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(); + m_ptr->DecRef(); + m_ptr = ptr; return *this; } @@ -517,7 +534,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 @@ -609,8 +626,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 }