size_t uiCount = 0; // count of replacements made
- const size_t uiOldLen = strOld.m_impl.length();
- const size_t uiNewLen = strNew.m_impl.length();
+ // optimize the special common case: replacement of one character by
+ // another one (in UTF-8 case we can only do this for ASCII characters)
+ //
+ // benchmarks show that this special version is around 3 times faster
+ // (depending on the proportion of matching characters and UTF-8/wchar_t
+ // build)
+ if ( strOld.m_impl.length() == 1 && strNew.m_impl.length() == 1 )
+ {
+ const wxStringCharType chOld = strOld.m_impl[0],
+ chNew = strNew.m_impl[0];
+
+ // this loop is the simplified version of the one below
+ for ( size_t pos = 0; ; )
+ {
+ pos = m_impl.find(chOld, pos);
+ if ( pos == npos )
+ break;
+
+ m_impl[pos++] = chNew;
+
+ uiCount++;
- for ( size_t dwPos = 0; dwPos < m_impl.length(); )
+ if ( !bReplaceAll )
+ break;
+ }
+ }
+ else // general case
{
- dwPos = m_impl.find(strOld.m_impl, dwPos);
- if ( dwPos == npos )
- break;
+ const size_t uiOldLen = strOld.m_impl.length();
+ const size_t uiNewLen = strNew.m_impl.length();
+
+ for ( size_t pos = 0; ; )
+ {
+ pos = m_impl.find(strOld.m_impl, pos);
+ if ( pos == npos )
+ break;
- // replace this occurance of the old string with the new one
- m_impl.replace(dwPos, uiOldLen, strNew.m_impl);
+ // replace this occurrence of the old string with the new one
+ m_impl.replace(pos, uiOldLen, strNew.m_impl);
- // move up pos past the string that was replaced
- dwPos += uiNewLen;
+ // move up pos past the string that was replaced
+ pos += uiNewLen;
- // increase replace count
- ++uiCount;
+ // increase replace count
+ uiCount++;
- // stop after the first one?
- if ( !bReplaceAll )
- break;
+ // stop after the first one?
+ if ( !bReplaceAll )
+ break;
+ }
}
return uiCount;
return *this;
}
+wxString& wxString::MakeCapitalized()
+{
+ const iterator en = end();
+ iterator it = begin();
+ if ( it != en )
+ {
+ *it = (wxChar)wxToupper(*it);
+ for ( ++it; it != en; ++it )
+ *it = (wxChar)wxTolower(*it);
+ }
+
+ return *this;
+}
+
// ---------------------------------------------------------------------------
// trimming and padding
// ---------------------------------------------------------------------------
return count;
}
-// convert to upper case, return the copy of the string
-wxString wxString::Upper() const
-{ wxString s(*this); return s.MakeUpper(); }
-
-// convert to lower case, return the copy of the string
-wxString wxString::Lower() const { wxString s(*this); return s.MakeLower(); }
-
// ----------------------------------------------------------------------------
// wxUTF8StringBuffer
// ----------------------------------------------------------------------------