ソースを参照

AK: Add String::equals_ignoring_case(StringView)

Andreas Kling 5 年 前
コミット
e3c0e75055
2 ファイル変更21 行追加0 行削除
  1. 19 0
      AK/String.cpp
  2. 2 0
      AK/String.h

+ 19 - 0
AK/String.cpp

@@ -7,6 +7,13 @@
 extern "C" char* strstr(const char* haystack, const char* needle);
 extern "C" char* strstr(const char* haystack, const char* needle);
 #endif
 #endif
 
 
+static inline char to_lowercase(char c)
+{
+    if (c >= 'A' && c <= 'Z')
+        return c | 0x20;
+    return c;
+}
+
 namespace AK {
 namespace AK {
 
 
 bool String::operator==(const String& other) const
 bool String::operator==(const String& other) const
@@ -322,5 +329,17 @@ bool String::contains(const String& needle) const
     return strstr(characters(), needle.characters());
     return strstr(characters(), needle.characters());
 }
 }
 
 
+bool String::equals_ignoring_case(const StringView& other) const
+{
+    if (other.m_impl == impl())
+        return true;
+    if (length() != other.length())
+        return false;
+    for (size_t i = 0; i < length(); ++i) {
+        if (::to_lowercase(characters()[i]) != ::to_lowercase(other.characters_without_null_termination()[i]))
+            return false;
+    }
+    return true;
 }
 }
 
 
+}

+ 2 - 0
AK/String.h

@@ -110,6 +110,8 @@ public:
         return m_impl->to_uppercase();
         return m_impl->to_uppercase();
     }
     }
 
 
+    bool equals_ignoring_case(const StringView&) const;
+
     bool contains(const String&) const;
     bool contains(const String&) const;
 
 
     Vector<String> split_limit(char separator, size_t limit) const;
     Vector<String> split_limit(char separator, size_t limit) const;