]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/wxcrt.h
Add iterators to wxVector, use std::vector in STL mode, correct wxVector::erase()
[wxWidgets.git] / include / wx / wxcrt.h
index 99c01b94ea96472607cf6e7e3e913bb0f2dfae3b..04fffe5a44e963765242f705fbebfecfaffae94d 100644 (file)
@@ -419,8 +419,9 @@ WX_STRCMP_FUNC(wxStricmp, wxCRT_StricmpA, wxCRT_StricmpW, wxStricmp_String)
 // the template's implementation uses overloaded function declared later (see
 // the wxStrcoll() call in wxStrcoll_String<T>()), so we have to
 // forward-declare the template and implement it below WX_STRCMP_FUNC. OTOH,
 // the template's implementation uses overloaded function declared later (see
 // the wxStrcoll() call in wxStrcoll_String<T>()), so we have to
 // forward-declare the template and implement it below WX_STRCMP_FUNC. OTOH,
-// this fails to compile with VC6, so don't do it for VC.
-#if !defined(__VISUALC__)
+// this fails to compile with VC6, so don't do it for VC. It also causes
+// problems with GCC visibility in newer GCC versions.
+#if !(defined(__VISUALC__) || wxCHECK_GCC_VERSION(3,4))
 template<typename T>
 inline int wxStrcoll_String(const wxString& s1, const T& s2);
 WX_STRCMP_FUNC(wxStrcoll, wxCRT_StrcollA, wxCRT_StrcollW, wxStrcoll_String)
 template<typename T>
 inline int wxStrcoll_String(const wxString& s1, const T& s2);
 WX_STRCMP_FUNC(wxStrcoll, wxCRT_StrcollA, wxCRT_StrcollW, wxStrcoll_String)
@@ -440,7 +441,7 @@ inline int wxStrcoll_String(const wxString& s1, const T& s2)
 #endif
 }
 
 #endif
 }
 
-#if defined(__VISUALC__)
+#if defined(__VISUALC__) || wxCHECK_GCC_VERSION(3,4)
 // this is exactly the same WX_STRCMP_FUNC line as above wxStrcoll_String<>
 WX_STRCMP_FUNC(wxStrcoll, wxCRT_StrcollA, wxCRT_StrcollW, wxStrcoll_String)
 #endif
 // this is exactly the same WX_STRCMP_FUNC line as above wxStrcoll_String<>
 WX_STRCMP_FUNC(wxStrcoll, wxCRT_StrcollA, wxCRT_StrcollW, wxStrcoll_String)
 #endif
@@ -771,11 +772,24 @@ inline double wxStrtod(const wxCharTypeBuffer<T>& nptr, T **endptr)
 // to be ever used, but it still has to compile).
 template<typename T> struct wxStrtoxCharType {};
 template<> struct wxStrtoxCharType<char**>
 // to be ever used, but it still has to compile).
 template<typename T> struct wxStrtoxCharType {};
 template<> struct wxStrtoxCharType<char**>
-    { typedef const char* Type; };
+{
+    typedef const char* Type;
+    static char** AsPointer(char **p) { return p; }
+};
 template<> struct wxStrtoxCharType<wchar_t**>
 template<> struct wxStrtoxCharType<wchar_t**>
-    { typedef const wchar_t* Type; };
+{
+    typedef const wchar_t* Type;
+    static wchar_t** AsPointer(wchar_t **p) { return p; }
+};
 template<> struct wxStrtoxCharType<int>
 template<> struct wxStrtoxCharType<int>
-    { typedef const char* Type; /* this one is never used */ };
+{
+    typedef const char* Type; /* this one is never used */
+    static char** AsPointer(int WXUNUSED_UNLESS_DEBUG(p))
+    {
+        wxASSERT_MSG( p == 0, "passing non-NULL int is invalid" );
+        return NULL;
+    }
+};
 
 template<typename T>
 inline double wxStrtod(const wxString& nptr, T endptr)
 
 template<typename T>
 inline double wxStrtod(const wxString& nptr, T endptr)
@@ -792,7 +806,9 @@ inline double wxStrtod(const wxString& nptr, T endptr)
         // note that it is important to use c_str() here and not mb_str() or
         // wc_str(), because we store the pointer into (possibly converted)
         // buffer in endptr and so it must be valid even when wxStrtod() returns
         // note that it is important to use c_str() here and not mb_str() or
         // wc_str(), because we store the pointer into (possibly converted)
         // buffer in endptr and so it must be valid even when wxStrtod() returns
-        return wxStrtod((typename wxStrtoxCharType<T>::Type)nptr.c_str(), endptr);
+        typedef typename wxStrtoxCharType<T>::Type CharType;
+        return wxStrtod((CharType)nptr.c_str(),
+                        wxStrtoxCharType<T>::AsPointer(endptr));
     }
 }
 template<typename T>
     }
 }
 template<typename T>
@@ -815,8 +831,12 @@ inline double wxStrtod(const wxCStrData& nptr, T endptr)
         if ( endptr == 0 )                                                    \
             return name(nptr.wx_str(), (wxStringCharType**)NULL, base);       \
         else                                                                  \
         if ( endptr == 0 )                                                    \
             return name(nptr.wx_str(), (wxStringCharType**)NULL, base);       \
         else                                                                  \
-            return name((typename wxStrtoxCharType<T>::Type)nptr.c_str(),     \
-                        endptr, base);                                        \
+        {                                                                     \
+            typedef typename wxStrtoxCharType<T>::Type CharType;              \
+            return name((CharType)nptr.c_str(),                               \
+                        wxStrtoxCharType<T>::AsPointer(endptr),               \
+                        base);                                                \
+        }                                                                     \
     }                                                                         \
     template<typename T>                                                      \
     inline rettype name(const wxCStrData& nptr, T endptr, int base)           \
     }                                                                         \
     template<typename T>                                                      \
     inline rettype name(const wxCStrData& nptr, T endptr, int base)           \