Skip to content

Commit 1e82038

Browse files
awesomeklingtrflynn89
authored andcommitted
AK: Add case-insensitive hashing for the new String classes
Bringing over this functionality from DeprecatedString.
1 parent 545d833 commit 1e82038

File tree

4 files changed

+22
-0
lines changed

4 files changed

+22
-0
lines changed

AK/FlyString.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,11 @@ unsigned FlyString::hash() const
100100
return String::fly_string_data_to_hash({}, m_data);
101101
}
102102

103+
u32 FlyString::ascii_case_insensitive_hash() const
104+
{
105+
return case_insensitive_string_hash(reinterpret_cast<char const*>(bytes().data()), bytes().size());
106+
}
107+
103108
FlyString::operator String() const
104109
{
105110
return to_string();

AK/FlyString.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class FlyString {
3636

3737
[[nodiscard]] bool is_empty() const;
3838
[[nodiscard]] unsigned hash() const;
39+
[[nodiscard]] u32 ascii_case_insensitive_hash() const;
3940

4041
explicit operator String() const;
4142
String to_string() const;
@@ -88,6 +89,11 @@ struct Formatter<FlyString> : Formatter<StringView> {
8889
ErrorOr<void> format(FormatBuilder&, FlyString const&);
8990
};
9091

92+
struct ASCIICaseInsensitiveFlyStringTraits : public Traits<String> {
93+
static unsigned hash(FlyString const& s) { return s.ascii_case_insensitive_hash(); }
94+
static bool equals(FlyString const& a, FlyString const& b) { return a.bytes().data() == b.bytes().data() || a.bytes_as_string_view().equals_ignoring_ascii_case(b.bytes_as_string_view()); }
95+
};
96+
9197
}
9298

9399
[[nodiscard]] ALWAYS_INLINE AK::FlyString operator""_fly_string(char const* cstring, size_t length)

AK/String.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,11 @@ u32 String::hash() const
439439
return m_data->hash();
440440
}
441441

442+
u32 String::ascii_case_insensitive_hash() const
443+
{
444+
return case_insensitive_string_hash(reinterpret_cast<char const*>(bytes().data()), bytes().size());
445+
}
446+
442447
Utf8View String::code_points() const
443448
{
444449
return Utf8View(bytes_as_string_view());

AK/String.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ class String {
168168
[[nodiscard]] bool contains(u32, CaseSensitivity = CaseSensitivity::CaseSensitive) const;
169169

170170
[[nodiscard]] u32 hash() const;
171+
[[nodiscard]] u32 ascii_case_insensitive_hash() const;
171172

172173
template<Arithmetic T>
173174
static ErrorOr<String> number(T value)
@@ -263,6 +264,11 @@ struct Formatter<String> : Formatter<StringView> {
263264
ErrorOr<void> format(FormatBuilder&, String const&);
264265
};
265266

267+
struct ASCIICaseInsensitiveStringTraits : public Traits<String> {
268+
static unsigned hash(String const& s) { return s.ascii_case_insensitive_hash(); }
269+
static bool equals(String const& a, String const& b) { return a.bytes_as_string_view().equals_ignoring_ascii_case(b.bytes_as_string_view()); }
270+
};
271+
266272
}
267273

268274
[[nodiscard]] ALWAYS_INLINE AK::String operator""_string(char const* cstring, size_t length)

0 commit comments

Comments
 (0)