1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 15:17:36 +00:00

AK+LibUnicode: Implement String::equals_ignoring_case without allocating

We currently fully casefold the left- and right-hand sides to compare
two strings with case-insensitivity. Now, we casefold one code point at
a time, storing the result in a view for comparison, until we exhaust
both strings.
This commit is contained in:
Timothy Flynn 2023-03-08 13:03:04 -05:00 committed by Linus Groh
parent 4aee4e80bd
commit 1393ed2000
6 changed files with 150 additions and 52 deletions

View file

@ -330,25 +330,33 @@ TEST_CASE(equals_ignoring_case)
String string1 {};
String string2 {};
EXPECT(MUST(string1.equals_ignoring_case(string2)));
EXPECT(string1.equals_ignoring_case(string2));
}
{
auto string1 = MUST("abcd"_string);
auto string2 = MUST("ABCD"_string);
auto string3 = MUST("AbCd"_string);
auto string4 = MUST("dcba"_string);
auto string5 = MUST("abce"_string);
auto string6 = MUST("abc"_string);
EXPECT(MUST(string1.equals_ignoring_case(string2)));
EXPECT(MUST(string1.equals_ignoring_case(string3)));
EXPECT(!MUST(string1.equals_ignoring_case(string4)));
EXPECT(string1.equals_ignoring_case(string2));
EXPECT(string1.equals_ignoring_case(string3));
EXPECT(!string1.equals_ignoring_case(string4));
EXPECT(!string1.equals_ignoring_case(string5));
EXPECT(!string1.equals_ignoring_case(string6));
EXPECT(MUST(string2.equals_ignoring_case(string1)));
EXPECT(MUST(string2.equals_ignoring_case(string3)));
EXPECT(!MUST(string2.equals_ignoring_case(string4)));
EXPECT(string2.equals_ignoring_case(string1));
EXPECT(string2.equals_ignoring_case(string3));
EXPECT(!string2.equals_ignoring_case(string4));
EXPECT(!string2.equals_ignoring_case(string5));
EXPECT(!string2.equals_ignoring_case(string6));
EXPECT(MUST(string3.equals_ignoring_case(string1)));
EXPECT(MUST(string3.equals_ignoring_case(string2)));
EXPECT(!MUST(string3.equals_ignoring_case(string4)));
EXPECT(string3.equals_ignoring_case(string1));
EXPECT(string3.equals_ignoring_case(string2));
EXPECT(!string3.equals_ignoring_case(string4));
EXPECT(!string3.equals_ignoring_case(string5));
EXPECT(!string3.equals_ignoring_case(string6));
}
{
auto string1 = MUST("\u00DF"_string); // LATIN SMALL LETTER SHARP S
@ -358,29 +366,66 @@ TEST_CASE(equals_ignoring_case)
auto string5 = MUST("S"_string);
auto string6 = MUST("s"_string);
EXPECT(MUST(string1.equals_ignoring_case(string2)));
EXPECT(MUST(string1.equals_ignoring_case(string3)));
EXPECT(MUST(string1.equals_ignoring_case(string4)));
EXPECT(!MUST(string1.equals_ignoring_case(string5)));
EXPECT(!MUST(string1.equals_ignoring_case(string6)));
EXPECT(string1.equals_ignoring_case(string2));
EXPECT(string1.equals_ignoring_case(string3));
EXPECT(string1.equals_ignoring_case(string4));
EXPECT(!string1.equals_ignoring_case(string5));
EXPECT(!string1.equals_ignoring_case(string6));
EXPECT(MUST(string2.equals_ignoring_case(string1)));
EXPECT(MUST(string2.equals_ignoring_case(string3)));
EXPECT(MUST(string2.equals_ignoring_case(string4)));
EXPECT(!MUST(string2.equals_ignoring_case(string5)));
EXPECT(!MUST(string2.equals_ignoring_case(string6)));
EXPECT(string2.equals_ignoring_case(string1));
EXPECT(string2.equals_ignoring_case(string3));
EXPECT(string2.equals_ignoring_case(string4));
EXPECT(!string2.equals_ignoring_case(string5));
EXPECT(!string2.equals_ignoring_case(string6));
EXPECT(MUST(string3.equals_ignoring_case(string1)));
EXPECT(MUST(string3.equals_ignoring_case(string2)));
EXPECT(MUST(string3.equals_ignoring_case(string4)));
EXPECT(!MUST(string3.equals_ignoring_case(string5)));
EXPECT(!MUST(string3.equals_ignoring_case(string6)));
EXPECT(string3.equals_ignoring_case(string1));
EXPECT(string3.equals_ignoring_case(string2));
EXPECT(string3.equals_ignoring_case(string4));
EXPECT(!string3.equals_ignoring_case(string5));
EXPECT(!string3.equals_ignoring_case(string6));
EXPECT(MUST(string4.equals_ignoring_case(string1)));
EXPECT(MUST(string4.equals_ignoring_case(string2)));
EXPECT(MUST(string4.equals_ignoring_case(string3)));
EXPECT(!MUST(string4.equals_ignoring_case(string5)));
EXPECT(!MUST(string4.equals_ignoring_case(string6)));
EXPECT(string4.equals_ignoring_case(string1));
EXPECT(string4.equals_ignoring_case(string2));
EXPECT(string4.equals_ignoring_case(string3));
EXPECT(!string4.equals_ignoring_case(string5));
EXPECT(!string4.equals_ignoring_case(string6));
}
{
auto string1 = MUST("Ab\u00DFCd\u00DFeF"_string);
auto string2 = MUST("ABSSCDSSEF"_string);
auto string3 = MUST("absscdssef"_string);
auto string4 = MUST("aBSscDsSEf"_string);
auto string5 = MUST("Ab\u00DFCd\u00DFeg"_string);
auto string6 = MUST("Ab\u00DFCd\u00DFe"_string);
EXPECT(string1.equals_ignoring_case(string1));
EXPECT(string1.equals_ignoring_case(string2));
EXPECT(string1.equals_ignoring_case(string3));
EXPECT(string1.equals_ignoring_case(string4));
EXPECT(!string1.equals_ignoring_case(string5));
EXPECT(!string1.equals_ignoring_case(string6));
EXPECT(string2.equals_ignoring_case(string1));
EXPECT(string2.equals_ignoring_case(string2));
EXPECT(string2.equals_ignoring_case(string3));
EXPECT(string2.equals_ignoring_case(string4));
EXPECT(!string2.equals_ignoring_case(string5));
EXPECT(!string2.equals_ignoring_case(string6));
EXPECT(string3.equals_ignoring_case(string1));
EXPECT(string3.equals_ignoring_case(string2));
EXPECT(string3.equals_ignoring_case(string3));
EXPECT(string3.equals_ignoring_case(string4));
EXPECT(!string3.equals_ignoring_case(string5));
EXPECT(!string3.equals_ignoring_case(string6));
EXPECT(string4.equals_ignoring_case(string1));
EXPECT(string4.equals_ignoring_case(string2));
EXPECT(string4.equals_ignoring_case(string3));
EXPECT(string4.equals_ignoring_case(string4));
EXPECT(!string4.equals_ignoring_case(string5));
EXPECT(!string4.equals_ignoring_case(string6));
}
}