]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/stringimpl.h
Correct wxImage::Size() again; add unit tests for it.
[wxWidgets.git] / include / wx / stringimpl.h
index 7a9adb99bf90dde84b8456e8dcffa153b7346c46..7371bfa39dd80fd72296e39cab676f53ad1cf351 100644 (file)
@@ -34,7 +34,7 @@
 
 // implementation only
 #define   wxASSERT_VALID_INDEX(i) \
 
 // implementation only
 #define   wxASSERT_VALID_INDEX(i) \
-    wxASSERT_MSG( (size_t)(i) <= length(), _T("invalid index in wxString") )
+    wxASSERT_MSG( (size_t)(i) <= length(), wxT("invalid index in wxString") )
 
 
 // ----------------------------------------------------------------------------
 
 
 // ----------------------------------------------------------------------------
@@ -53,7 +53,18 @@ extern WXDLLIMPEXP_DATA_BASE(const wxStringCharType*) wxEmptyStringImpl;
 // deal with STL/non-STL/non-STL-but-wxUSE_STD_STRING
 // ----------------------------------------------------------------------------
 
 // deal with STL/non-STL/non-STL-but-wxUSE_STD_STRING
 // ----------------------------------------------------------------------------
 
-#define wxUSE_STL_BASED_WXSTRING  wxUSE_STL
+// using STL implies using std::string
+#if wxUSE_STL
+    #undef wxUSE_STD_STRING
+    #define wxUSE_STD_STRING 1
+#endif
+
+// we use STL-based string internally if we use std::string at all now, there
+// should be no reason to prefer our internal implement but if you really need
+// it you can predefine wxUSE_STL_BASED_WXSTRING as 0 when building the library
+#ifndef wxUSE_STL_BASED_WXSTRING
+    #define wxUSE_STL_BASED_WXSTRING  wxUSE_STD_STRING
+#endif
 
 // in both cases we need to define wxStdString
 #if wxUSE_STL_BASED_WXSTRING || wxUSE_STD_STRING
 
 // in both cases we need to define wxStdString
 #if wxUSE_STL_BASED_WXSTRING || wxUSE_STD_STRING
@@ -83,8 +94,10 @@ extern WXDLLIMPEXP_DATA_BASE(const wxStringCharType*) wxEmptyStringImpl;
     #undef wxUSE_STD_STRING
     #define wxUSE_STD_STRING 1
 
     #undef wxUSE_STD_STRING
     #define wxUSE_STD_STRING 1
 
+    // the versions of std::string included with gcc 2.95 and VC6 (for which
+    // _MSC_VER == 1200) and eVC4 (_MSC_VER == 1201) lack clear() method
     #if (defined(__GNUG__) && (__GNUG__ < 3)) || \
     #if (defined(__GNUG__) && (__GNUG__ < 3)) || \
-        (defined(_MSC_VER) && (_MSC_VER <= 1200))
+        !wxCHECK_VISUALC_VERSION(7) || defined(__EVC4__)
         #define wxSTRING_BASE_HASNT_CLEAR
     #endif
 
         #define wxSTRING_BASE_HASNT_CLEAR
     #endif
 
@@ -287,7 +300,7 @@ public:
   wxStringImpl(const wxStringImpl& stringSrc)
   {
     wxASSERT_MSG( stringSrc.GetStringData()->IsValid(),
   wxStringImpl(const wxStringImpl& stringSrc)
   {
     wxASSERT_MSG( stringSrc.GetStringData()->IsValid(),
-                  _T("did you forget to call UngetWriteBuf()?") );
+                  wxT("did you forget to call UngetWriteBuf()?") );
 
     if ( stringSrc.empty() ) {
       // nothing to do for an empty string
 
     if ( stringSrc.empty() ) {
       // nothing to do for an empty string
@@ -310,7 +323,7 @@ public:
   wxStringImpl(const wxStringImpl& str, size_t nPos, size_t nLen)
   {
     wxASSERT_MSG( str.GetStringData()->IsValid(),
   wxStringImpl(const wxStringImpl& str, size_t nPos, size_t nLen)
   {
     wxASSERT_MSG( str.GetStringData()->IsValid(),
-                  _T("did you forget to call UngetWriteBuf()?") );
+                  wxT("did you forget to call UngetWriteBuf()?") );
     Init();
     size_t strLen = str.length() - nPos; nLen = strLen < nLen ? strLen : nLen;
     InitWith(str.c_str(), nPos, nLen);
     Init();
     size_t strLen = str.length() - nPos; nLen = strLen < nLen ? strLen : nLen;
     InitWith(str.c_str(), nPos, nLen);
@@ -328,23 +341,24 @@ public:
       { return wxStdString(c_str(), length()); }
 #endif
 
       { return wxStdString(c_str(), length()); }
 #endif
 
+#if defined(__VISUALC__) && (__VISUALC__ >= 1200)
+    // disable warning about Unlock() below not being inlined (first, it
+    // seems to be inlined nevertheless and second, even if it isn't, there
+    // is nothing we can do about this
+    #pragma warning(push)
+    #pragma warning (disable:4714)
+#endif
 
     // dtor is not virtual, this class must not be inherited from!
   ~wxStringImpl()
   {
 
     // dtor is not virtual, this class must not be inherited from!
   ~wxStringImpl()
   {
-#if defined(__VISUALC__) && (__VISUALC__ >= 1200)
-      //RN - according to the above VC++ does indeed inline this,
-      //even though it spits out two warnings
-      #pragma warning (disable:4714)
-#endif
-
       GetStringData()->Unlock();
   }
 
 #if defined(__VISUALC__) && (__VISUALC__ >= 1200)
       GetStringData()->Unlock();
   }
 
 #if defined(__VISUALC__) && (__VISUALC__ >= 1200)
-    //re-enable inlining warning
-    #pragma warning (default:4714)
+    #pragma warning(pop)
 #endif
 #endif
+
   // overloaded assignment
     // from another wxString
   wxStringImpl& operator=(const wxStringImpl& stringSrc);
   // overloaded assignment
     // from another wxString
   wxStringImpl& operator=(const wxStringImpl& stringSrc);
@@ -371,9 +385,11 @@ public:
 
   // lib.string.access
     // return the character at position n
 
   // lib.string.access
     // return the character at position n
+  value_type operator[](size_type n) const { return m_pchData[n]; }
   value_type at(size_type n) const
     { wxASSERT_VALID_INDEX( n ); return m_pchData[n]; }
     // returns the writable character at position n
   value_type at(size_type n) const
     { wxASSERT_VALID_INDEX( n ); return m_pchData[n]; }
     // returns the writable character at position n
+  reference operator[](size_type n) { CopyBeforeWrite(); return m_pchData[n]; }
   reference at(size_type n)
   {
     wxASSERT_VALID_INDEX( n );
   reference at(size_type n)
   {
     wxASSERT_VALID_INDEX( n );