]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/typeinfo.h
Applied rowspan patch #15276 (dghart)
[wxWidgets.git] / include / wx / typeinfo.h
index c1efb1b0c9b6785bca8e681cb7a9aab5a6046cd6..734783af5095242c9bacf20f6754313cf9fbaeeb 100644 (file)
 //
 // This file defines wxTypeId macro that should be used internally in
 // wxWidgets instead of typeid(), for compatibility with builds that do
-// not implement C++ RTTI. Also, type defining macros in this file are also
+// not implement C++ RTTI. Also, type defining macros in this file are
 // intended for internal use only at this time and may change in future
 // versions.
 //
+// The reason why we need this simple RTTI system in addition to the older
+// wxObject-based one is that the latter does not work in template
+// classes.
+//
 
 #include "wx/defs.h"
 
 #ifndef wxNO_RTTI
 
+//
+// Let's trust that Visual C++ versions 9.0 and later implement C++
+// RTTI well enough, so we can use it and work around harmless memory
+// leaks reported by the static run-time libraries.
+//
+#if wxCHECK_VISUALC_VERSION(9)
+    #define wxTRUST_CPP_RTTI    1
+#else
+    #define wxTRUST_CPP_RTTI    0
+#endif
+
 #include <typeinfo>
 #include <string.h>
 
 #define WX_DEFINE_TYPEINFO(CLS)
 #define WX_DECLARE_ABSTRACT_TYPEINFO(CLS)
 
+#if wxTRUST_CPP_RTTI
+
+#define wxTypeId    typeid
+
+#else /*  !wxTRUST_CPP_RTTI */
+
 //
 // For improved type-safety, let's make the check using class name
 // comparison. Most modern compilers already do this, but we cannot
 // wxTypeId could of course simply be defined as typeid.
 //
 
-class wxTypeInfo
+class wxTypeIdentifier
 {
 public:
-    wxTypeInfo(const char* className)
+    wxTypeIdentifier(const char* className)
     {
         m_className = className;
     }
 
-    bool operator==(const wxTypeInfo& other)
+    bool operator==(const wxTypeIdentifier& other)
     {
         return strcmp(m_className, other.m_className) == 0;
     }
 
-    bool operator!=(const wxTypeInfo& other)
+    bool operator!=(const wxTypeIdentifier& other)
     {
         return strcmp(m_className, other.m_className) != 0;
     }
@@ -61,10 +82,14 @@ private:
     const char* m_className;
 };
 
-#define wxTypeId(OBJ) wxTypeInfo(typeid(OBJ).name())
+#define wxTypeId(OBJ) wxTypeIdentifier(typeid(OBJ).name())
+
+#endif /*  wxTRUST_CPP_RTTI/!wxTRUST_CPP_RTTI */
 
 #else // if !wxNO_RTTI
 
+#define wxTRUST_CPP_RTTI    0
+
 //
 // When C++ RTTI is not available, we will have to make the type comparison
 // using pointer to a dummy static member function. This will fail if
@@ -112,7 +137,7 @@ _WX_DECLARE_TYPEINFO_CUSTOM(CLS, sm_wxClassInfo)
 
 #define wxTypeId(OBJ) (OBJ).GetWxTypeId()
 
-// Because abstract classes cannot be instantiated, we use 
+// Because abstract classes cannot be instantiated, we use
 // this macro to define pure virtual type interface for them.
 #define WX_DECLARE_ABSTRACT_TYPEINFO(CLS) \
 public: \