strings: support case insensitive check only in StartsWith/EndsWith std::string and std::string_view have starts_with and ends_with for case senstive check. Change-Id: I53d84d27b18443b89a000bd9c4af5c4e605b8d80 Reviewed-on: https://gn-review.googlesource.com/c/gn/+/16540 Commit-Queue: Takuto Ikuta <tikuta@google.com> Reviewed-by: David Turner <digit@google.com>
diff --git a/src/base/files/file_path.cc b/src/base/files/file_path.cc index 3b53abc..be045b0 100644 --- a/src/base/files/file_path.cc +++ b/src/base/files/file_path.cc
@@ -67,7 +67,7 @@ StringViewType a_letter(a.substr(0, a_letter_pos + 1)); StringViewType b_letter(b.substr(0, b_letter_pos + 1)); - if (!StartsWith(a_letter, b_letter, CompareCase::INSENSITIVE_ASCII)) + if (!StartsWithCaseInsensitiveASCII(a_letter, b_letter)) return false; StringViewType a_rest(a.substr(a_letter_pos + 1)); @@ -271,7 +271,7 @@ // never case sensitive. if ((FindDriveLetter(*parent_comp) != StringType::npos) && (FindDriveLetter(*child_comp) != StringType::npos)) { - if (!StartsWith(*parent_comp, *child_comp, CompareCase::INSENSITIVE_ASCII)) + if (!StartsWithCaseInsensitiveASCII(*parent_comp, *child_comp)) return false; ++parent_comp; ++child_comp;
diff --git a/src/base/strings/string_util.cc b/src/base/strings/string_util.cc index e1b494d..b00d77f 100644 --- a/src/base/strings/string_util.cc +++ b/src/base/strings/string_util.cc
@@ -505,75 +505,50 @@ } template <typename char_type> -bool StartsWithT(std::basic_string_view<char_type> str, - std::basic_string_view<char_type> search_for, - CompareCase case_sensitivity) { +bool StartsWithCaseInsensitiveASCIIT( + std::basic_string_view<char_type> str, + std::basic_string_view<char_type> search_for) { if (search_for.size() > str.size()) return false; std::basic_string_view<char_type> 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(), - CaseInsensitiveCompareASCII<char_type>()); - - default: - NOTREACHED(); - return false; - } + return std::equal(search_for.begin(), search_for.end(), source.begin(), + CaseInsensitiveCompareASCII<char_type>()); } -bool StartsWith(std::string_view str, - std::string_view search_for, - CompareCase case_sensitivity) { - return StartsWithT(str, search_for, case_sensitivity); +bool StartsWithCaseInsensitiveASCII(std::string_view str, + std::string_view search_for) { + return StartsWithCaseInsensitiveASCIIT(str, search_for); } -bool StartsWith(std::u16string_view str, - std::u16string_view search_for, - CompareCase case_sensitivity) { - return StartsWithT(str, search_for, case_sensitivity); +bool StartsWithCaseInsensitiveASCII(std::u16string_view str, + std::u16string_view search_for) { + return StartsWithCaseInsensitiveASCIIT(str, search_for); } -template <typename Str> -bool EndsWithT(std::basic_string_view<typename Str::value_type> str, - std::basic_string_view<typename Str::value_type> search_for, - CompareCase case_sensitivity) { +template <typename char_type> +bool EndsWithCaseInsensitiveASCIIT( + std::basic_string_view<char_type> str, + std::basic_string_view<char_type> search_for) { if (search_for.size() > str.size()) return false; - std::basic_string_view<typename Str::value_type> source = + std::basic_string_view<char_type> 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(), - CaseInsensitiveCompareASCII<typename Str::value_type>()); - - default: - NOTREACHED(); - return false; - } + return std::equal(source.begin(), source.end(), search_for.begin(), + CaseInsensitiveCompareASCII<char_type>()); } -bool EndsWith(std::string_view str, - std::string_view search_for, - CompareCase case_sensitivity) { - return EndsWithT<std::string>(str, search_for, case_sensitivity); +bool EndsWithCaseInsensitiveASCII(std::string_view str, + std::string_view search_for) { + return EndsWithCaseInsensitiveASCIIT(str, search_for); } -bool EndsWith(std::u16string_view str, - std::u16string_view search_for, - CompareCase case_sensitivity) { - return EndsWithT<std::u16string>(str, search_for, case_sensitivity); +bool EndsWithCaseInsensitiveASCII(std::u16string_view str, + std::u16string_view search_for) { + return EndsWithCaseInsensitiveASCIIT(str, search_for); } char HexDigitToInt(char16_t c) {
diff --git a/src/base/strings/string_util.h b/src/base/strings/string_util.h index 9ed66b2..bd28dbd 100644 --- a/src/base/strings/string_util.h +++ b/src/base/strings/string_util.h
@@ -246,31 +246,19 @@ // undefined if the |ascii| string is not ASCII. bool EqualsASCII(std::u16string_view str, std::string_view ascii); -// Indicates case sensitivity of comparisons. Only ASCII case insensitivity -// is supported. Full Unicode case-insensitive conversions would need to go in -// base/i18n so it can use ICU. -// +// starts_with/ends_with for ASCII case-insensitive comparisons. // If you need to do Unicode-aware case-insensitive StartsWith/EndsWith, it's // best to call base::i18n::ToLower() or base::i18n::FoldCase() (see // base/i18n/case_conversion.h for usage advice) on the arguments, and then use // the results to a case-sensitive comparison. -enum class CompareCase { - SENSITIVE, - INSENSITIVE_ASCII, -}; - -bool StartsWith(std::string_view str, - std::string_view search_for, - CompareCase case_sensitivity); -bool StartsWith(std::u16string_view str, - std::u16string_view search_for, - CompareCase case_sensitivity); -bool EndsWith(std::string_view str, - std::string_view search_for, - CompareCase case_sensitivity); -bool EndsWith(std::u16string_view str, - std::u16string_view search_for, - CompareCase case_sensitivity); +bool StartsWithCaseInsensitiveASCII(std::string_view str, + std::string_view search_for); +bool StartsWithCaseInsensitiveASCII(std::u16string_view str, + std::u16string_view search_for); +bool EndsWithCaseInsensitiveASCII(std::string_view str, + std::string_view search_for); +bool EndsWithCaseInsensitiveASCII(std::u16string_view str, + std::u16string_view search_for); // Determines the type of ASCII character, independent of locale (the C // library versions will change based on locale).
diff --git a/src/gn/ninja_target_writer.cc b/src/gn/ninja_target_writer.cc index 2f7ec38..6ecbaa7 100644 --- a/src/gn/ninja_target_writer.cc +++ b/src/gn/ninja_target_writer.cc
@@ -524,8 +524,7 @@ // First validate that the target's dependency is a stamp file. Otherwise, // we shouldn't have gotten here! - CHECK(base::EndsWith(stamp_file.value(), ".stamp", - base::CompareCase::INSENSITIVE_ASCII)) + CHECK(base::EndsWithCaseInsensitiveASCII(stamp_file.value(), ".stamp")) << "Output should end in \".stamp\" for stamp file output. Instead got: " << "\"" << stamp_file.value() << "\"";