Commit 7179fc9f authored by Jan Wilken Dörrie's avatar Jan Wilken Dörrie Committed by Commit Bot

[base] Introduce wide string split utilities

This change implements wide string overloads to string_split.h
and string_util.h.
Since these functions are not supposed to be used by Cross-Platform
code it is guarded by correpsonding #ifdef guards. Furthermore,
this change performs some minor code clean-ups and performance
improvements.

Bug: 911896
Change-Id: I579b55a398307c890b30a027699b74a9afb1a77e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1823851
Commit-Queue: Jan Wilken Dörrie <jdoerrie@chromium.org>
Reviewed-by: default avatarRobert Liao <robliao@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Cr-Commit-Position: refs/heads/master@{#703617}
parent 1b186eeb
......@@ -219,8 +219,11 @@ size_t find_first_of(const StringPiece& self,
size_t find_first_of(const StringPiece16& self,
const StringPiece16& s,
size_t pos) {
// Use the faster std::find() if searching for a single character.
StringPiece16::const_iterator found =
std::find_first_of(self.begin() + pos, self.end(), s.begin(), s.end());
s.size() == 1 ? std::find(self.begin() + pos, self.end(), s[0])
: std::find_first_of(self.begin() + pos, self.end(),
s.begin(), s.end());
if (found == self.end())
return StringPiece16::npos;
return found - self.begin();
......
This diff is collapsed.
......@@ -12,6 +12,7 @@
#include "base/base_export.h"
#include "base/strings/string16.h"
#include "base/strings/string_piece.h"
#include "build/build_config.h"
namespace base {
......@@ -132,6 +133,31 @@ BASE_EXPORT std::vector<StringPiece> SplitStringPieceUsingSubstr(
WhitespaceHandling whitespace,
SplitResult result_type);
#if defined(OS_WIN) && defined(BASE_STRING16_IS_STD_U16STRING)
BASE_EXPORT std::vector<std::wstring> SplitString(WStringPiece input,
WStringPiece separators,
WhitespaceHandling whitespace,
SplitResult result_type);
BASE_EXPORT std::vector<WStringPiece> SplitStringPiece(
WStringPiece input,
WStringPiece separators,
WhitespaceHandling whitespace,
SplitResult result_type);
BASE_EXPORT std::vector<std::wstring> SplitStringUsingSubstr(
WStringPiece input,
WStringPiece delimiter,
WhitespaceHandling whitespace,
SplitResult result_type);
BASE_EXPORT std::vector<WStringPiece> SplitStringPieceUsingSubstr(
WStringPiece input,
WStringPiece delimiter,
WhitespaceHandling whitespace,
SplitResult result_type);
#endif
} // namespace base
#endif // BASE_STRINGS_STRING_SPLIT_H_
......@@ -262,8 +262,8 @@ bool RemoveChars(const std::string& input,
return ReplaceCharsT(input, remove_chars, StringPiece(), output);
}
template<typename Str>
TrimPositions TrimStringT(const Str& input,
template <typename Str>
TrimPositions TrimStringT(BasicStringPiece<Str> input,
BasicStringPiece<Str> trim_chars,
TrimPositions positions,
Str* output) {
......@@ -271,40 +271,40 @@ TrimPositions TrimStringT(const Str& input,
// 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_piece.find_first_not_of(trim_chars) : 0;
const size_t last_good_char = (positions & TRIM_TRAILING) ?
input_piece.find_last_not_of(trim_chars) : last_char;
const size_t first_good_char =
(positions & TRIM_LEADING) ? input.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;
// 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)) {
if (input.empty() || 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.
*output =
input.substr(first_good_char, last_good_char - first_good_char + 1);
output->assign(input.data() + first_good_char,
last_good_char - first_good_char + 1);
// Return where we trimmed from.
return static_cast<TrimPositions>(
((first_good_char == 0) ? TRIM_NONE : TRIM_LEADING) |
((last_good_char == last_char) ? TRIM_NONE : TRIM_TRAILING));
(first_good_char == 0 ? TRIM_NONE : TRIM_LEADING) |
(last_good_char == last_char ? TRIM_NONE : TRIM_TRAILING));
}
bool TrimString(const string16& input,
bool TrimString(StringPiece16 input,
StringPiece16 trim_chars,
string16* output) {
return TrimStringT(input, trim_chars, TRIM_ALL, output) != TRIM_NONE;
}
bool TrimString(const std::string& input,
bool TrimString(StringPiece input,
StringPiece trim_chars,
std::string* output) {
return TrimStringT(input, trim_chars, TRIM_ALL, output) != TRIM_NONE;
......@@ -370,7 +370,7 @@ void TruncateUTF8ToByteSize(const std::string& input,
output->clear();
}
TrimPositions TrimWhitespace(const string16& input,
TrimPositions TrimWhitespace(StringPiece16 input,
TrimPositions positions,
string16* output) {
return TrimStringT(input, StringPiece16(kWhitespaceUTF16), positions, output);
......@@ -381,7 +381,7 @@ StringPiece16 TrimWhitespace(StringPiece16 input,
return TrimStringPieceT(input, StringPiece16(kWhitespaceUTF16), positions);
}
TrimPositions TrimWhitespaceASCII(const std::string& input,
TrimPositions TrimWhitespaceASCII(StringPiece input,
TrimPositions positions,
std::string* output) {
return TrimStringT(input, StringPiece(kWhitespaceASCII), positions, output);
......@@ -1085,6 +1085,32 @@ string16 ReplaceStringPlaceholders(const string16& format_string,
return result;
}
#if defined(OS_WIN) && defined(BASE_STRING16_IS_STD_U16STRING)
TrimPositions TrimWhitespace(WStringPiece input,
TrimPositions positions,
std::wstring* output) {
return TrimStringT(input, WStringPiece(kWhitespaceWide), positions, output);
}
WStringPiece TrimWhitespace(WStringPiece input, TrimPositions positions) {
return TrimStringPieceT(input, WStringPiece(kWhitespaceWide), positions);
}
bool TrimString(WStringPiece input,
WStringPiece trim_chars,
std::wstring* output) {
return TrimStringT(input, trim_chars, TRIM_ALL, output) != TRIM_NONE;
}
WStringPiece TrimString(WStringPiece input,
WStringPiece trim_chars,
TrimPositions positions) {
return TrimStringPieceT(input, trim_chars, positions);
}
#endif
// The following code is compatible with the OpenBSD lcpy interface. See:
// http://www.gratisoft.us/todd/papers/strlcpy.html
// ftp://ftp.openbsd.org/pub/OpenBSD/src/lib/libc/string/{wcs,str}lcpy.c
......
......@@ -204,10 +204,10 @@ enum TrimPositions {
//
// It is safe to use the same variable for both |input| and |output| (this is
// the normal usage to trim in-place).
BASE_EXPORT bool TrimString(const string16& input,
BASE_EXPORT bool TrimString(StringPiece16 input,
StringPiece16 trim_chars,
string16* output);
BASE_EXPORT bool TrimString(const std::string& input,
BASE_EXPORT bool TrimString(StringPiece input,
StringPiece trim_chars,
std::string* output);
......@@ -296,12 +296,12 @@ inline string16 AsString16(WStringPiece str) {
//
// The std::string versions return where whitespace was found.
// NOTE: Safe to use the same variable for both input and output.
BASE_EXPORT TrimPositions TrimWhitespace(const string16& input,
BASE_EXPORT TrimPositions TrimWhitespace(StringPiece16 input,
TrimPositions positions,
string16* output);
BASE_EXPORT StringPiece16 TrimWhitespace(StringPiece16 input,
TrimPositions positions);
BASE_EXPORT TrimPositions TrimWhitespaceASCII(const std::string& input,
BASE_EXPORT TrimPositions TrimWhitespaceASCII(StringPiece input,
TrimPositions positions,
std::string* output);
BASE_EXPORT StringPiece TrimWhitespaceASCII(StringPiece input,
......@@ -532,6 +532,23 @@ BASE_EXPORT string16 ReplaceStringPlaceholders(const string16& format_string,
const string16& a,
size_t* offset);
#if defined(OS_WIN) && defined(BASE_STRING16_IS_STD_U16STRING)
BASE_EXPORT TrimPositions TrimWhitespace(WStringPiece input,
TrimPositions positions,
std::wstring* output);
BASE_EXPORT WStringPiece TrimWhitespace(WStringPiece input,
TrimPositions positions);
BASE_EXPORT bool TrimString(WStringPiece input,
WStringPiece trim_chars,
std::wstring* output);
BASE_EXPORT WStringPiece TrimString(WStringPiece input,
WStringPiece trim_chars,
TrimPositions positions);
#endif
} // namespace base
#if defined(OS_WIN)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment