X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c95e653ca42e6474c32d71e69a3fd8a2bc443fc4..cbb003b1053e30ea93a5cb956c360a4a39c35622:/src/common/string.cpp diff --git a/src/common/string.cpp b/src/common/string.cpp index f413b031fd..2530f0718f 100644 --- a/src/common/string.cpp +++ b/src/common/string.cpp @@ -35,10 +35,6 @@ #include #include -#ifdef __SALFORDC__ - #include -#endif - #include "wx/hashmap.h" // string handling functions used by wxString: @@ -373,6 +369,9 @@ wxString::SubstrBufFromMB wxString::ConvertStr(const char *psz, size_t nLength, // UTF-8 sequence and psz may be invalid: if ( wxStringOperations::IsValidUtf8String(psz, nLength) ) { + // we must pass the real string length to SubstrBufFromMB ctor + if ( nLength == npos ) + nLength = psz ? strlen(psz) : 0; return SubstrBufFromMB(wxCharBuffer::CreateNonOwned(psz), nLength); } // else: do the roundtrip through wchar_t* @@ -1240,33 +1239,55 @@ size_t wxString::Replace(const wxString& strOld, 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; + + m_impl[pos++] = chNew; - size_t dwPos = 0; + uiCount++; - while ( (*this)[dwPos] != wxT('\0') ) + if ( !bReplaceAll ) + break; + } + } + else // general case { - //DO NOT USE STRSTR HERE - //this string can contain embedded null characters, - //so strstr will function incorrectly - dwPos = find(strOld, dwPos); - if ( dwPos == npos ) - break; // exit the loop - else + const size_t uiOldLen = strOld.m_impl.length(); + const size_t uiNewLen = strNew.m_impl.length(); + + for ( size_t pos = 0; ; ) { - //replace this occurance of the old string with the new one - replace(dwPos, uiOldLen, strNew, uiNewLen); + pos = m_impl.find(strOld.m_impl, pos); + if ( pos == npos ) + break; + + // 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 now? + // stop after the first one? if ( !bReplaceAll ) - break; // exit the loop + break; } } @@ -1342,6 +1363,20 @@ wxString& wxString::MakeLower() 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 // --------------------------------------------------------------------------- @@ -1946,13 +1981,6 @@ int wxString::Freq(wxUniChar ch) const 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 // ---------------------------------------------------------------------------- @@ -1981,3 +2009,15 @@ wxUTF8StringBufferLength::~wxUTF8StringBufferLength() wbuf.SetLength(wlen); } #endif // wxUSE_UNICODE_WCHAR + +// ---------------------------------------------------------------------------- +// wxCharBufferType +// ---------------------------------------------------------------------------- + +template<> +wxCharTypeBuffer::Data +wxCharTypeBuffer::NullData(NULL); + +template<> +wxCharTypeBuffer::Data +wxCharTypeBuffer::NullData(NULL);