/* * Copyright (c) 2023, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include namespace AK { class FlyString { public: FlyString(); ~FlyString(); static ErrorOr from_utf8(StringView); FlyString(String const&); FlyString& operator=(String const&); FlyString(FlyString const&); FlyString& operator=(FlyString const&); FlyString(FlyString&&); FlyString& operator=(FlyString&&); [[nodiscard]] bool is_empty() const; [[nodiscard]] unsigned hash() const; explicit operator String() const; String to_string() const; [[nodiscard]] Utf8View code_points() const; [[nodiscard]] ReadonlyBytes bytes() const; [[nodiscard]] StringView bytes_as_string_view() const; [[nodiscard]] bool operator==(FlyString const& other) const; [[nodiscard]] bool operator==(String const&) const; [[nodiscard]] bool operator==(StringView) const; [[nodiscard]] bool operator==(char const*) const; static void did_destroy_fly_string_data(Badge, StringView); [[nodiscard]] uintptr_t data(Badge) const; // This is primarily interesting to unit tests. [[nodiscard]] static size_t number_of_fly_strings(); private: // This will hold either the pointer to the Detail::StringData it represents or the raw bytes of // an inlined short string. uintptr_t m_data { 0 }; }; template<> struct Traits : public GenericTraits { static unsigned hash(FlyString const&); }; template<> struct Formatter : Formatter { ErrorOr format(FormatBuilder&, FlyString const&); }; } [[nodiscard]] ALWAYS_INLINE AK::ErrorOr operator""_fly_string(char const* cstring, size_t length) { return AK::FlyString::from_utf8(AK::StringView(cstring, length)); } #if USING_AK_GLOBALLY using AK::FlyString; #endif