Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3017)

Unified Diff: base/strings/string_util.cc

Issue 1169393003: Add new SplitString backend. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/strings/string_util.h ('k') | base/strings/string_util_constants.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/strings/string_util.cc
diff --git a/base/strings/string_util.cc b/base/strings/string_util.cc
index cc7769343b5a592a2d081c89e3203dc82be8f720..540fc0948439e18276502d65c1211e1372bc3130 100644
--- a/base/strings/string_util.cc
+++ b/base/strings/string_util.cc
@@ -21,6 +21,7 @@
#include "base/basictypes.h"
#include "base/logging.h"
#include "base/memory/singleton.h"
+#include "base/strings/string_split.h"
#include "base/strings/utf_string_conversion_utils.h"
#include "base/strings/utf_string_conversions.h"
#include "base/third_party/icu/icu_utf.h"
@@ -193,29 +194,33 @@ bool RemoveChars(const std::string& input,
return ReplaceChars(input, remove_chars.as_string(), std::string(), output);
}
-template<typename STR>
-TrimPositions TrimStringT(const STR& input,
- const STR& trim_chars,
+template<typename Str>
+TrimPositions TrimStringT(const Str& input,
+ BasicStringPiece<Str> trim_chars,
TrimPositions positions,
- STR* output) {
- // Find the edges of leading/trailing whitespace as desired.
+ Str* output) {
+ // Find the edges of leading/trailing whitespace as desired. Need to use
+ // a StringPiece version of input to be able to call find* on it with the
+ // StringPiece version of trim_chars (normally the trim_chars will be a
+ // constant so avoid making a copy).
+ BasicStringPiece<Str> input_piece(input);
const size_t last_char = input.length() - 1;
const size_t first_good_char = (positions & TRIM_LEADING) ?
- input.find_first_not_of(trim_chars) : 0;
+ input_piece.find_first_not_of(trim_chars) : 0;
const size_t last_good_char = (positions & TRIM_TRAILING) ?
- input.find_last_not_of(trim_chars) : last_char;
+ input_piece.find_last_not_of(trim_chars) : last_char;
- // When the string was all whitespace, report that we stripped off whitespace
- // from whichever position the caller was interested in. For empty input, we
- // stripped no whitespace, but we still need to clear |output|.
+ // When the string was all trimmed, report that we stripped off characters
+ // from whichever position the caller was interested in. For empty input, we
+ // stripped no characters, but we still need to clear |output|.
if (input.empty() ||
- (first_good_char == STR::npos) || (last_good_char == STR::npos)) {
+ (first_good_char == Str::npos) || (last_good_char == Str::npos)) {
bool input_was_empty = input.empty(); // in case output == &input
output->clear();
return input_was_empty ? TRIM_NONE : positions;
}
- // Trim the whitespace.
+ // Trim.
*output =
input.substr(first_good_char, last_good_char - first_good_char + 1);
@@ -226,17 +231,38 @@ TrimPositions TrimStringT(const STR& input,
}
bool TrimString(const string16& input,
- const base::StringPiece16& trim_chars,
+ base::StringPiece16 trim_chars,
string16* output) {
- return TrimStringT(input, trim_chars.as_string(), TRIM_ALL, output) !=
- TRIM_NONE;
+ return TrimStringT(input, trim_chars, TRIM_ALL, output) != TRIM_NONE;
}
bool TrimString(const std::string& input,
- const base::StringPiece& trim_chars,
+ base::StringPiece trim_chars,
std::string* output) {
- return TrimStringT(input, trim_chars.as_string(), TRIM_ALL, output) !=
- TRIM_NONE;
+ return TrimStringT(input, trim_chars, TRIM_ALL, output) != TRIM_NONE;
+}
+
+template<typename Str>
+BasicStringPiece<Str> TrimStringPieceT(BasicStringPiece<Str> input,
+ BasicStringPiece<Str> trim_chars,
+ TrimPositions positions) {
+ size_t begin = (positions & TRIM_LEADING) ?
+ input.find_first_not_of(trim_chars) : 0;
+ size_t end = (positions & TRIM_TRAILING) ?
+ input.find_last_not_of(trim_chars) + 1 : input.size();
+ return input.substr(begin, end - begin);
+}
+
+StringPiece16 TrimString(StringPiece16 input,
+ const base::StringPiece16& trim_chars,
+ TrimPositions positions) {
+ return TrimStringPieceT(input, trim_chars, positions);
+}
+
+StringPiece TrimString(StringPiece input,
+ const base::StringPiece& trim_chars,
+ TrimPositions positions) {
+ return TrimStringPieceT(input, trim_chars, positions);
}
void TruncateUTF8ToByteSize(const std::string& input,
@@ -278,14 +304,13 @@ void TruncateUTF8ToByteSize(const std::string& input,
TrimPositions TrimWhitespace(const string16& input,
TrimPositions positions,
string16* output) {
- return TrimStringT(input, base::string16(kWhitespaceUTF16), positions,
- output);
+ return TrimStringT(input, StringPiece16(kWhitespaceUTF16), positions, output);
}
TrimPositions TrimWhitespaceASCII(const std::string& input,
TrimPositions positions,
std::string* output) {
- return TrimStringT(input, std::string(kWhitespaceASCII), positions, output);
+ return TrimStringT(input, StringPiece(kWhitespaceASCII), positions, output);
}
// This function is only for backward-compatibility.
@@ -696,44 +721,28 @@ void ReplaceSubstringsAfterOffset(std::string* str,
true); // replace all instances
}
-
-template<typename STR>
-static size_t TokenizeT(const STR& str,
- const STR& delimiters,
- std::vector<STR>* tokens) {
- tokens->clear();
-
- size_t start = str.find_first_not_of(delimiters);
- while (start != STR::npos) {
- size_t end = str.find_first_of(delimiters, start + 1);
- if (end == STR::npos) {
- tokens->push_back(str.substr(start));
- break;
- } else {
- tokens->push_back(str.substr(start, end - start));
- start = str.find_first_not_of(delimiters, end + 1);
- }
- }
-
+size_t Tokenize(const base::string16& str,
+ const base::string16& delimiters,
+ std::vector<base::string16>* tokens) {
+ *tokens = base::SplitString(
+ str, delimiters, base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
return tokens->size();
}
-size_t Tokenize(const string16& str,
- const string16& delimiters,
- std::vector<string16>* tokens) {
- return TokenizeT(str, delimiters, tokens);
-}
-
size_t Tokenize(const std::string& str,
const std::string& delimiters,
std::vector<std::string>* tokens) {
- return TokenizeT(str, delimiters, tokens);
+ *tokens = base::SplitString(
+ str, delimiters, base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
+ return tokens->size();
}
size_t Tokenize(const base::StringPiece& str,
const base::StringPiece& delimiters,
std::vector<base::StringPiece>* tokens) {
- return TokenizeT(str, delimiters, tokens);
+ *tokens = base::SplitStringPiece(
+ str, delimiters, base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
+ return tokens->size();
}
template<typename STR>
« no previous file with comments | « base/strings/string_util.h ('k') | base/strings/string_util_constants.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698