AK: Use HashMap::ensure() for FlyString and Utf16FlyString lookups

This consolidates sometimes-two hash lookups into always-one, which is
less work in the case where a new fly-string is introduced.
This commit is contained in:
Andreas Kling 2025-10-05 12:40:16 +02:00 committed by Andreas Kling
parent ca772caee6
commit 9425ee6d2b
2 changed files with 19 additions and 16 deletions

View File

@ -61,15 +61,16 @@ FlyString::FlyString(String const& string)
return;
}
auto it = all_fly_strings().find(string.m_impl.data);
if (it == all_fly_strings().end()) {
m_data = string;
all_fly_strings().set(string.m_impl.data);
string.m_impl.data->set_fly_string(true);
} else {
m_data.m_impl.data = *it;
m_data.m_impl.data->ref();
}
auto const* shared_data = all_fly_strings().ensure(
string.hash(),
[&](auto& candidate) { return *candidate == *string.m_impl.data; },
[&] {
string.m_impl.data->set_fly_string(true);
return string.m_impl.data;
},
HashSetExistingEntryBehavior::Keep);
shared_data->ref();
m_data.m_impl.data = shared_data;
}
FlyString& FlyString::operator=(String const& string)

View File

@ -85,14 +85,16 @@ Utf16FlyString::Utf16FlyString(Utf16String const& string)
return;
}
if (auto it = all_utf16_fly_strings().find(data); it == all_utf16_fly_strings().end()) {
m_data = string;
auto const* shared_data = all_utf16_fly_strings().ensure(
data->hash(),
[&](auto& candidate) { return *data == *candidate; },
[&] {
data->mark_as_fly_string({});
return data;
},
HashSetExistingEntryBehavior::Keep);
all_utf16_fly_strings().set(data);
data->mark_as_fly_string({});
} else {
m_data.set_data({}, *it);
}
m_data.set_data({}, shared_data);
}
size_t Utf16FlyString::number_of_utf16_fly_strings()