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

Unified Diff: base/strings/string_util.cc

Issue 1182453004: Write new Starts/EndsWith and convert FilePath functions to StringPiece. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@string_util
Patch Set: default back 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
Index: base/strings/string_util.cc
diff --git a/base/strings/string_util.cc b/base/strings/string_util.cc
index 738d32e0455e99d0114964d792e7788fa6519f96..9bbe1cb569a9c94249f726776c8626350ca20931 100644
--- a/base/strings/string_util.cc
+++ b/base/strings/string_util.cc
@@ -507,48 +507,114 @@ bool EqualsASCII(const string16& a, const StringPiece& b) {
return std::equal(b.begin(), b.end(), a.begin());
}
-bool StartsWithASCII(const std::string& str,
- const std::string& search,
- bool case_sensitive) {
- if (case_sensitive)
- return str.compare(0, search.length(), search) == 0;
- else
- return base::strncasecmp(str.c_str(), search.c_str(), search.length()) == 0;
+template<typename Str>
+bool StartsWithT(BasicStringPiece<Str> str,
+ BasicStringPiece<Str> search_for,
+ CompareCase case_sensitivity) {
+ if (search_for.size() > str.size())
+ return false;
+
+ BasicStringPiece<Str> source = str.substr(0, search_for.size());
+
+ switch (case_sensitivity) {
+ case CompareCase::SENSITIVE:
+ return source == search_for;
+
+ case CompareCase::INSENSITIVE_ASCII:
+ return std::equal(
+ search_for.begin(), search_for.end(),
+ source.begin(),
+ base::CaseInsensitiveCompareASCII<typename Str::value_type>());
+
+ default:
+ NOTREACHED();
+ return false;
+ }
+}
+
+bool StartsWith(StringPiece str,
+ StringPiece search_for,
+ CompareCase case_sensitivity) {
+ return StartsWithT<std::string>(str, search_for, case_sensitivity);
+}
+
+bool StartsWith(StringPiece16 str,
+ StringPiece16 search_for,
+ CompareCase case_sensitivity) {
+ return StartsWithT<string16>(str, search_for, case_sensitivity);
}
bool StartsWith(const string16& str,
const string16& search,
bool case_sensitive) {
- if (case_sensitive) {
- return str.compare(0, search.length(), search) == 0;
+ if (!case_sensitive) {
+ // This function was originally written using the current locale functions
+ // for case-insensitive comparisons. Emulate this behavior until callers
+ // can be converted either to use the case-insensitive ASCII one (most
+ // callers) or ICU functions in base_i18n.
+ if (search.size() > str.size())
+ return false;
+ return std::equal(search.begin(), search.end(), str.begin(),
+ CaseInsensitiveCompare<char16>());
}
- if (search.size() > str.size())
- return false;
- return std::equal(search.begin(), search.end(), str.begin(),
- CaseInsensitiveCompare<char16>());
+ return StartsWith(StringPiece16(str), StringPiece16(search),
+ CompareCase::SENSITIVE);
}
-template <typename STR>
-bool EndsWithT(const STR& str, const STR& search, bool case_sensitive) {
- size_t str_length = str.length();
- size_t search_length = search.length();
- if (search_length > str_length)
+template <typename Str>
+bool EndsWithT(BasicStringPiece<Str> str,
+ BasicStringPiece<Str> search_for,
+ CompareCase case_sensitivity) {
+ if (search_for.size() > str.size())
return false;
- if (case_sensitive)
- return str.compare(str_length - search_length, search_length, search) == 0;
- return std::equal(search.begin(), search.end(),
- str.begin() + (str_length - search_length),
- base::CaseInsensitiveCompare<typename STR::value_type>());
+
+ BasicStringPiece<Str> source = str.substr(str.size() - search_for.size(),
+ search_for.size());
+
+ switch (case_sensitivity) {
+ case CompareCase::SENSITIVE:
+ return source == search_for;
+
+ case CompareCase::INSENSITIVE_ASCII:
+ return std::equal(
+ source.begin(), source.end(),
+ search_for.begin(),
+ base::CaseInsensitiveCompareASCII<typename Str::value_type>());
+
+ default:
+ NOTREACHED();
+ return false;
+ }
}
-bool EndsWith(const std::string& str, const std::string& search,
- bool case_sensitive) {
- return EndsWithT(str, search, case_sensitive);
+bool EndsWith(StringPiece str,
+ StringPiece search_for,
+ CompareCase case_sensitivity) {
+ return EndsWithT<std::string>(str, search_for, case_sensitivity);
+}
+
+bool EndsWith(StringPiece16 str,
+ StringPiece16 search_for,
+ CompareCase case_sensitivity) {
+ return EndsWithT<string16>(str, search_for, case_sensitivity);
}
-bool EndsWith(const string16& str, const string16& search,
+bool EndsWith(const string16& str,
+ const string16& search,
bool case_sensitive) {
- return EndsWithT(str, search, case_sensitive);
+ if (!case_sensitive) {
+ // This function was originally written using the current locale functions
+ // for case-insensitive comparisons. Emulate this behavior until callers
+ // can be converted either to use the case-insensitive ASCII one (most
+ // callers) or ICU functions in base_i18n.
+ if (search.size() > str.size())
+ return false;
+ return std::equal(search.begin(), search.end(),
+ str.begin() + (str.size() - search.size()),
+ CaseInsensitiveCompare<char16>());
+ }
+ return EndsWith(StringPiece16(str), StringPiece16(search),
+ CompareCase::SENSITIVE);
}
} // namespace base
« base/strings/string_util.h ('K') | « base/strings/string_util.h ('k') | base/sys_info.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698