| Index: base/strings/string_util.cc
|
| diff --git a/base/strings/string_util.cc b/base/strings/string_util.cc
|
| index 5839cf2980273573d91316437bff5e48166dc8e5..e3dcd8542fabcc263cf26f23014669097e9c3ba0 100644
|
| --- a/base/strings/string_util.cc
|
| +++ b/base/strings/string_util.cc
|
| @@ -659,19 +659,17 @@ string16 FormatBytesUnlocalized(int64 bytes) {
|
| return ASCIIToUTF16(buf);
|
| }
|
|
|
| -} // namespace base
|
| -
|
| // Runs in O(n) time in the length of |str|.
|
| template<class StringType>
|
| void DoReplaceSubstringsAfterOffset(StringType* str,
|
| size_t offset,
|
| - const StringType& find_this,
|
| - const StringType& replace_with,
|
| + BasicStringPiece<StringType> find_this,
|
| + BasicStringPiece<StringType> replace_with,
|
| bool replace_all) {
|
| DCHECK(!find_this.empty());
|
|
|
| // If the find string doesn't appear, there's nothing to do.
|
| - offset = str->find(find_this, offset);
|
| + offset = str->find(find_this.data(), offset, find_this.size());
|
| if (offset == StringType::npos)
|
| return;
|
|
|
| @@ -679,7 +677,7 @@ void DoReplaceSubstringsAfterOffset(StringType* str,
|
| // complicated.
|
| size_t find_length = find_this.length();
|
| if (!replace_all) {
|
| - str->replace(offset, find_length, replace_with);
|
| + str->replace(offset, find_length, replace_with.data(), replace_with.size());
|
| return;
|
| }
|
|
|
| @@ -688,8 +686,10 @@ void DoReplaceSubstringsAfterOffset(StringType* str,
|
| size_t replace_length = replace_with.length();
|
| if (find_length == replace_length) {
|
| do {
|
| - str->replace(offset, find_length, replace_with);
|
| - offset = str->find(find_this, offset + replace_length);
|
| + str->replace(offset, find_length,
|
| + replace_with.data(), replace_with.size());
|
| + offset = str->find(find_this.data(), offset + replace_length,
|
| + find_this.size());
|
| } while (offset != StringType::npos);
|
| return;
|
| }
|
| @@ -706,11 +706,14 @@ void DoReplaceSubstringsAfterOffset(StringType* str,
|
| size_t write_offset = offset;
|
| do {
|
| if (replace_length) {
|
| - str->replace(write_offset, replace_length, replace_with);
|
| + str->replace(write_offset, replace_length,
|
| + replace_with.data(), replace_with.size());
|
| write_offset += replace_length;
|
| }
|
| size_t read_offset = offset + find_length;
|
| - offset = std::min(str->find(find_this, read_offset), str_length);
|
| + offset = std::min(
|
| + str->find(find_this.data(), read_offset, find_this.size()),
|
| + str_length);
|
| size_t length = offset - read_offset;
|
| if (length) {
|
| memmove(&(*str)[write_offset], &(*str)[read_offset],
|
| @@ -739,13 +742,15 @@ void DoReplaceSubstringsAfterOffset(StringType* str,
|
| // exit from the loop, |current_match| will point at the last instance of
|
| // the find string, and we won't need to find() it again immediately.
|
| current_match = offset;
|
| - offset = str->find(find_this, offset + find_length);
|
| + offset = str->find(find_this.data(), offset + find_length,
|
| + find_this.size());
|
| } while (offset != StringType::npos);
|
| str->resize(final_length);
|
|
|
| // Now do the replacement loop, working backwards through the string.
|
| for (size_t prev_match = str_length, write_offset = final_length; ;
|
| - current_match = str->rfind(find_this, current_match - 1)) {
|
| + current_match = str->rfind(find_this.data(), current_match - 1,
|
| + find_this.size())) {
|
| size_t read_offset = current_match + find_length;
|
| size_t length = prev_match - read_offset;
|
| if (length) {
|
| @@ -754,7 +759,8 @@ void DoReplaceSubstringsAfterOffset(StringType* str,
|
| length * sizeof(typename StringType::value_type));
|
| }
|
| write_offset -= replace_length;
|
| - str->replace(write_offset, replace_length, replace_with);
|
| + str->replace(write_offset, replace_length,
|
| + replace_with.data(), replace_with.size());
|
| if (current_match == first_match)
|
| return;
|
| prev_match = current_match;
|
| @@ -763,36 +769,38 @@ void DoReplaceSubstringsAfterOffset(StringType* str,
|
|
|
| void ReplaceFirstSubstringAfterOffset(string16* str,
|
| size_t start_offset,
|
| - const string16& find_this,
|
| - const string16& replace_with) {
|
| - DoReplaceSubstringsAfterOffset(str, start_offset, find_this, replace_with,
|
| - false); // replace first instance
|
| + StringPiece16 find_this,
|
| + StringPiece16 replace_with) {
|
| + DoReplaceSubstringsAfterOffset<string16>(
|
| + str, start_offset, find_this, replace_with, false); // Replace first.
|
| }
|
|
|
| void ReplaceFirstSubstringAfterOffset(std::string* str,
|
| size_t start_offset,
|
| - const std::string& find_this,
|
| - const std::string& replace_with) {
|
| - DoReplaceSubstringsAfterOffset(str, start_offset, find_this, replace_with,
|
| - false); // replace first instance
|
| + StringPiece find_this,
|
| + StringPiece replace_with) {
|
| + DoReplaceSubstringsAfterOffset<std::string>(
|
| + str, start_offset, find_this, replace_with, false); // Replace first.
|
| }
|
|
|
| void ReplaceSubstringsAfterOffset(string16* str,
|
| size_t start_offset,
|
| - const string16& find_this,
|
| - const string16& replace_with) {
|
| - DoReplaceSubstringsAfterOffset(str, start_offset, find_this, replace_with,
|
| - true); // replace all instances
|
| + StringPiece16 find_this,
|
| + StringPiece16 replace_with) {
|
| + DoReplaceSubstringsAfterOffset<string16>(
|
| + str, start_offset, find_this, replace_with, true); // Replace all.
|
| }
|
|
|
| void ReplaceSubstringsAfterOffset(std::string* str,
|
| size_t start_offset,
|
| - const std::string& find_this,
|
| - const std::string& replace_with) {
|
| - DoReplaceSubstringsAfterOffset(str, start_offset, find_this, replace_with,
|
| - true); // replace all instances
|
| + StringPiece find_this,
|
| + StringPiece replace_with) {
|
| + DoReplaceSubstringsAfterOffset<std::string>(
|
| + str, start_offset, find_this, replace_with, true); // Replace all.
|
| }
|
|
|
| +} // namespace base
|
| +
|
| size_t Tokenize(const base::string16& str,
|
| const base::string16& delimiters,
|
| std::vector<base::string16>* tokens) {
|
|
|