]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/object.h
check for self-assignment in operator=
[wxWidgets.git] / include / wx / object.h
index 4b70945219b2059511a103d568d1a405e95c0b51..26c3c0271cf518922fc18a832bf0635fc0fd6295 100644 (file)
@@ -19,7 +19,8 @@
 
 #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
@@ -64,12 +65,12 @@ class WXDLLIMPEXP_BASE wxObject;
 // 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
@@ -79,8 +80,8 @@ typedef wxObject *(*wxObjectConstructorFn)(void);
 
 class WXDLLIMPEXP_BASE wxClassInfo
 {
-    friend class WXDLLIMPEXP_BASE wxObject;
-    friend wxObject *wxCreateDynamicObject(const wxChar *name);
+    friend class WXDLLIMPEXP_FWD_BASE wxObject;
+    friend WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxString& name);
 public:
     wxClassInfo( const wxChar *className,
                  const wxClassInfo *baseInfo1,
@@ -117,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.
@@ -154,10 +155,10 @@ protected:
     void Register();
     void Unregister();
 
-    DECLARE_NO_COPY_CLASS(wxClassInfo)
+    wxDECLARE_NO_COPY_CLASS(wxClassInfo);
 };
 
-WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxChar *name);
+WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxString& name);
 
 // ----------------------------------------------------------------------------
 // Dynamic class macros
@@ -189,7 +190,7 @@ WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxChar *name);
             &basename::ms_classInfo,                                          \
             baseclsinfo2,                                                     \
             (int) sizeof(name),                                               \
-            (wxObjectConstructorFn) func);                                    \
+            func);                                                            \
                                                                               \
     wxClassInfo *name::GetClassInfo() const                                   \
         { return &name::ms_classInfo; }
@@ -277,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)
@@ -318,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<wxObject *>(static_cast<const wxObject *>(\
+          const_cast<className *>(static_cast<const className *>(obj)))), \
         &className::ms_classInfo))
 
 // The 'this' pointer is always true, so use this version
@@ -338,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<className *>(static_cast<const className *>(obj))
 
 #endif  // __WXDEBUG__
 
@@ -407,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) { }
@@ -441,21 +442,40 @@ public:
     wxEXPLICIT wxObjectDataPtr(T *ptr = NULL) : m_ptr(ptr) {}
 
     // copy ctor
-    wxObjectDataPtr(const wxObjectDataPtr<T> &tocopy) 
+    wxObjectDataPtr(const wxObjectDataPtr<T> &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<T>::*unspecified_bool_type)() const;
+    operator unspecified_bool_type() const
+    {
+        return m_ptr ? &wxObjectDataPtr<T>::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)
     {
@@ -465,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;
     }
 
@@ -516,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
@@ -593,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) ;
@@ -608,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<wxDynamicClassInfo *>(m_classInfo);
+        return static_cast<wxClassInfo *>(nonconst);
 #endif
     }