1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-14 08:54:58 +00:00

AK: Store data in FlyString as StringBase

Unfortunately, it is not clear to me how to split this commit into
several atomic ones.
This commit is contained in:
Dan Klishch 2023-10-28 18:58:29 -04:00 committed by Andrew Kaster
parent e7700e16ee
commit fa52f68142
7 changed files with 42 additions and 145 deletions

View file

@ -15,20 +15,10 @@ namespace AK {
static auto& all_fly_strings()
{
static Singleton<HashMap<StringView, uintptr_t>> table;
static Singleton<HashMap<StringView, Detail::StringBase>> table;
return *table;
}
FlyString::FlyString()
: m_data(String {}.to_fly_string_data({}))
{
}
FlyString::~FlyString()
{
String::unref_fly_string_data({}, m_data);
}
ErrorOr<FlyString> FlyString::from_utf8(StringView string)
{
return FlyString { TRY(String::from_utf8(string)) };
@ -37,21 +27,19 @@ ErrorOr<FlyString> FlyString::from_utf8(StringView string)
FlyString::FlyString(String const& string)
{
if (string.is_short_string()) {
m_data = string.to_fly_string_data({});
m_data = string;
return;
}
auto it = all_fly_strings().find(string.bytes_as_string_view());
if (it == all_fly_strings().end()) {
m_data = string.to_fly_string_data({});
m_data = string;
all_fly_strings().set(string.bytes_as_string_view(), m_data);
string.did_create_fly_string({});
} else {
m_data = it->value;
}
String::ref_fly_string_data({}, m_data);
}
FlyString& FlyString::operator=(String const& string)
@ -60,36 +48,6 @@ FlyString& FlyString::operator=(String const& string)
return *this;
}
FlyString::FlyString(FlyString const& other)
: m_data(other.m_data)
{
String::ref_fly_string_data({}, m_data);
}
FlyString& FlyString::operator=(FlyString const& other)
{
if (this != &other) {
m_data = other.m_data;
String::ref_fly_string_data({}, m_data);
}
return *this;
}
FlyString::FlyString(FlyString&& other)
: m_data(other.m_data)
{
other.m_data = String {}.to_fly_string_data({});
}
FlyString& FlyString::operator=(FlyString&& other)
{
m_data = other.m_data;
other.m_data = String {}.to_fly_string_data({});
return *this;
}
bool FlyString::is_empty() const
{
return bytes_as_string_view().is_empty();
@ -97,7 +55,7 @@ bool FlyString::is_empty() const
unsigned FlyString::hash() const
{
return String::fly_string_data_to_hash({}, m_data);
return m_data.hash();
}
u32 FlyString::ascii_case_insensitive_hash() const
@ -112,7 +70,8 @@ FlyString::operator String() const
String FlyString::to_string() const
{
return String::fly_string_data_to_string({}, m_data);
Detail::StringBase copy = m_data;
return String(move(copy));
}
Utf8View FlyString::code_points() const
@ -127,7 +86,7 @@ ReadonlyBytes FlyString::bytes() const
StringView FlyString::bytes_as_string_view() const
{
return String::fly_string_data_to_string_view({}, m_data);
return m_data.bytes();
}
bool FlyString::operator==(FlyString const& other) const
@ -137,10 +96,7 @@ bool FlyString::operator==(FlyString const& other) const
bool FlyString::operator==(String const& other) const
{
if (m_data == other.to_fly_string_data({}))
return true;
return bytes_as_string_view() == other.bytes_as_string_view();
return m_data == other;
}
bool FlyString::operator==(StringView string) const
@ -158,7 +114,7 @@ void FlyString::did_destroy_fly_string_data(Badge<Detail::StringData>, StringVie
all_fly_strings().remove(string_data);
}
uintptr_t FlyString::data(Badge<String>) const
Detail::StringBase FlyString::data(Badge<String>) const
{
return m_data;
}