size_t uiCount = 0; // count of replacements made
- size_t uiOldLen = strOld.length();
- size_t uiNewLen = strNew.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;
- for ( size_t dwPos = 0; dwPos < length(); )
+ m_impl[pos++] = chNew;
+
+ uiCount++;
+
+ if ( !bReplaceAll )
+ break;
+ }
+ }
+ else // general case
{
- dwPos = find(strOld, 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
- replace(dwPos, uiOldLen, strNew, uiNewLen);
+ // 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;