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() << "\"";