diff --git a/AK/FlyString.cpp b/AK/FlyString.cpp index 43d1129e15..b7cd4d0e5d 100644 --- a/AK/FlyString.cpp +++ b/AK/FlyString.cpp @@ -28,11 +28,23 @@ static auto& all_fly_strings() ErrorOr FlyString::from_utf8(StringView string) { + if (string.is_empty()) + return FlyString {}; + if (string.length() <= Detail::MAX_SHORT_STRING_BYTE_COUNT) + return FlyString { TRY(String::from_utf8(string)) }; + if (auto it = all_fly_strings().find(string.hash(), [&](auto& entry) { return entry->bytes_as_string_view() == string; }); it != all_fly_strings().end()) + return FlyString { Detail::StringBase(**it) }; return FlyString { TRY(String::from_utf8(string)) }; } FlyString FlyString::from_utf8_without_validation(ReadonlyBytes string) { + if (string.is_empty()) + return FlyString {}; + if (string.size() <= Detail::MAX_SHORT_STRING_BYTE_COUNT) + return FlyString { String::from_utf8_without_validation(string) }; + if (auto it = all_fly_strings().find(StringView(string).hash(), [&](auto& entry) { return entry->bytes_as_string_view() == string; }); it != all_fly_strings().end()) + return FlyString { Detail::StringBase(**it) }; return FlyString { String::from_utf8_without_validation(string) }; } diff --git a/AK/FlyString.h b/AK/FlyString.h index 319079bfed..df2ce8fdd3 100644 --- a/AK/FlyString.h +++ b/AK/FlyString.h @@ -77,6 +77,11 @@ public: } private: + explicit FlyString(Detail::StringBase data) + : m_data(move(data)) + { + } + Detail::StringBase m_data; };