Chromium Code Reviews| Index: base/strings/string_split.cc |
| diff --git a/base/strings/string_split.cc b/base/strings/string_split.cc |
| index 210789cd22d0df9b524d40aaeca002ad6e6fb705..daabf840c9d76a6558ed9389aa591b45716e8671 100644 |
| --- a/base/strings/string_split.cc |
| +++ b/base/strings/string_split.cc |
| @@ -11,11 +11,13 @@ |
| namespace base { |
| -template<typename STR> |
| -static void SplitStringT(const STR& str, |
| - const typename STR::value_type s, |
| - bool trim_whitespace, |
| - std::vector<STR>* r) { |
| +namespace { |
| + |
| +template <typename STR> |
| +void SplitStringT(const STR& str, |
| + const typename STR::value_type s, |
| + bool trim_whitespace, |
| + std::vector<STR>* r) { |
| r->clear(); |
| size_t last = 0; |
| size_t c = str.size(); |
| @@ -33,6 +35,34 @@ static void SplitStringT(const STR& str, |
| } |
| } |
| +bool SplitStringIntoKeyValue(const std::string& line, |
| + char key_value_delimiter, |
| + std::string* key, |
| + std::string* value) { |
| + key->clear(); |
| + value->clear(); |
| + |
| + // Find the delimiter. |
| + size_t end_key_pos = line.find_first_of(key_value_delimiter); |
| + if (end_key_pos == std::string::npos) { |
| + DVLOG(1) << "cannot find delimiter in: " << line; |
| + return false; // no delimiter |
| + } |
| + key->assign(line, 0, end_key_pos); |
| + |
| + // Find the value string. |
| + std::string remains(line, end_key_pos, line.size() - end_key_pos); |
| + size_t begin_value_pos = remains.find_first_not_of(key_value_delimiter); |
| + if (begin_value_pos == std::string::npos) { |
| + DVLOG(1) << "cannot parse value from line: " << line; |
| + return false; // no value |
| + } |
| + value->assign(remains, begin_value_pos, remains.size() - begin_value_pos); |
| + return true; |
| +} |
| + |
| +} // namespace |
| + |
| void SplitString(const string16& str, |
| char16 c, |
| std::vector<string16>* r) { |
| @@ -50,36 +80,6 @@ void SplitString(const std::string& str, |
| SplitStringT(str, c, true, r); |
| } |
| -bool SplitStringIntoKeyValues( |
| - const std::string& line, |
| - char key_value_delimiter, |
| - std::string* key, std::vector<std::string>* values) { |
| - key->clear(); |
| - values->clear(); |
| - |
| - // Find the key string. |
| - size_t end_key_pos = line.find_first_of(key_value_delimiter); |
| - if (end_key_pos == std::string::npos) { |
| - DVLOG(1) << "cannot parse key from line: " << line; |
| - return false; // no key |
| - } |
| - key->assign(line, 0, end_key_pos); |
| - |
| - // Find the values string. |
| - std::string remains(line, end_key_pos, line.size() - end_key_pos); |
| - size_t begin_values_pos = remains.find_first_not_of(key_value_delimiter); |
| - if (begin_values_pos == std::string::npos) { |
| - DVLOG(1) << "cannot parse value from line: " << line; |
| - return false; // no value |
| - } |
| - std::string values_string(remains, begin_values_pos, |
| - remains.size() - begin_values_pos); |
| - |
| - // Construct the values vector. |
| - values->push_back(values_string); |
| - return true; |
| -} |
| - |
| bool SplitStringIntoKeyValuePairs(const std::string& line, |
| char key_value_delimiter, |
| char key_value_pair_delimiter, |
| @@ -91,23 +91,19 @@ bool SplitStringIntoKeyValuePairs(const std::string& line, |
| bool success = true; |
| for (size_t i = 0; i < pairs.size(); ++i) { |
| - // Empty pair. SplitStringIntoKeyValues is more strict about an empty pair |
| - // line, so continue with the next pair. |
| + // Don't add empty pairs into the result. |
|
Mark Mentovai
2014/03/06 17:55:51
This is empty pairs after whitespace trimming. Des
|
| if (pairs[i].empty()) |
| continue; |
| std::string key; |
| - std::vector<std::string> value; |
| - if (!SplitStringIntoKeyValues(pairs[i], |
| - key_value_delimiter, |
| - &key, &value)) { |
| - // Don't return here, to allow for keys without associated |
| - // values; just record that our split failed. |
| + std::string value; |
| + if (!SplitStringIntoKeyValue(pairs[i], key_value_delimiter, &key, &value)) { |
|
Mark Mentovai
2014/03/06 17:55:51
This whole thing would be better with StringPieces
|
| + // Don't return here, to allow for pairs without associated |
| + // value or key; just record that our split failed. |
|
Mark Mentovai
2014/03/06 17:55:51
our split -> the split
See the test CL. I’m not s
pneubeck (no reviews)
2014/03/07 17:12:11
Done.
|
| success = false; |
| } |
| DCHECK_LE(value.size(), 1U); |
|
Mark Mentovai
2014/03/06 17:55:51
?
pneubeck (no reviews)
2014/03/07 17:12:11
Ouch. yes that has to be removed.
Done.
|
| - key_value_pairs->push_back( |
| - make_pair(key, value.empty() ? std::string() : value[0])); |
| + key_value_pairs->push_back(make_pair(key, value)); |
| } |
| return success; |
| } |