Coverage Report

Created: 2025-11-16 07:46

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/serenity/AK/FlyString.h
Line
Count
Source
1
/*
2
 * Copyright (c) 2023, Tim Flynn <trflynn89@serenityos.org>
3
 *
4
 * SPDX-License-Identifier: BSD-2-Clause
5
 */
6
7
#pragma once
8
9
#include <AK/Error.h>
10
#include <AK/Format.h>
11
#include <AK/Platform.h>
12
#include <AK/String.h>
13
#include <AK/Traits.h>
14
#include <AK/Types.h>
15
16
namespace AK {
17
18
class FlyString {
19
    AK_MAKE_DEFAULT_MOVABLE(FlyString);
20
    AK_MAKE_DEFAULT_COPYABLE(FlyString);
21
22
public:
23
41.1k
    FlyString() = default;
24
25
    static ErrorOr<FlyString> from_utf8(StringView);
26
    static FlyString from_utf8_without_validation(ReadonlyBytes);
27
    template<typename T>
28
    requires(IsOneOf<RemoveCVReference<T>, ByteString, DeprecatedFlyString, FlyString, String>)
29
    static ErrorOr<String> from_utf8(T&&) = delete;
30
31
    FlyString(String const&);
32
    FlyString& operator=(String const&);
33
34
    [[nodiscard]] bool is_empty() const;
35
    [[nodiscard]] unsigned hash() const;
36
    [[nodiscard]] u32 ascii_case_insensitive_hash() const;
37
38
    explicit operator String() const;
39
    String to_string() const;
40
41
    [[nodiscard]] Utf8View code_points() const;
42
    [[nodiscard]] ReadonlyBytes bytes() const;
43
    [[nodiscard]] StringView bytes_as_string_view() const;
44
45
0
    [[nodiscard]] ALWAYS_INLINE bool operator==(FlyString const& other) const { return m_data.raw({}) == other.m_data.raw({}); }
46
    [[nodiscard]] bool operator==(String const&) const;
47
    [[nodiscard]] bool operator==(StringView) const;
48
    [[nodiscard]] bool operator==(char const*) const;
49
50
    [[nodiscard]] int operator<=>(FlyString const& other) const;
51
52
    static void did_destroy_fly_string_data(Badge<Detail::StringData>, Detail::StringData const&);
53
    [[nodiscard]] Detail::StringBase data(Badge<String>) const;
54
55
    // This is primarily interesting to unit tests.
56
    [[nodiscard]] static size_t number_of_fly_strings();
57
58
    // FIXME: Remove these once all code has been ported to FlyString
59
    [[nodiscard]] DeprecatedFlyString to_deprecated_fly_string() const;
60
    static ErrorOr<FlyString> from_deprecated_fly_string(DeprecatedFlyString const&);
61
    template<typename T>
62
    requires(IsSame<RemoveCVReference<T>, StringView>)
63
    static ErrorOr<String> from_deprecated_fly_string(T&&) = delete;
64
65
    // Compare this FlyString against another string with ASCII caseless matching.
66
    [[nodiscard]] bool equals_ignoring_ascii_case(FlyString const&) const;
67
    [[nodiscard]] bool equals_ignoring_ascii_case(StringView) const;
68
69
    [[nodiscard]] FlyString to_ascii_lowercase() const;
70
    [[nodiscard]] FlyString to_ascii_uppercase() const;
71
72
    [[nodiscard]] bool starts_with_bytes(StringView, CaseSensitivity = CaseSensitivity::CaseSensitive) const;
73
74
    [[nodiscard]] bool ends_with_bytes(StringView, CaseSensitivity = CaseSensitivity::CaseSensitive) const;
75
76
    template<typename... Ts>
77
    [[nodiscard]] ALWAYS_INLINE constexpr bool is_one_of(Ts&&... strings) const
78
0
    {
79
0
        return (... || this->operator==(forward<Ts>(strings)));
80
0
    }
Unexecuted instantiation: bool AK::FlyString::is_one_of<AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&>(AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&) const
Unexecuted instantiation: bool AK::FlyString::is_one_of<char const (&) [8], char const (&) [6], char const (&) [11], char const (&) [5], char const (&) [4], char const (&) [7], char const (&) [3], char const (&) [3], char const (&) [3], char const (&) [3], char const (&) [3], char const (&) [3], char const (&) [7], char const (&) [5], char const (&) [4], char const (&) [2], char const (&) [8], char const (&) [5]>(char const (&) [8], char const (&) [6], char const (&) [11], char const (&) [5], char const (&) [4], char const (&) [7], char const (&) [3], char const (&) [3], char const (&) [3], char const (&) [3], char const (&) [3], char const (&) [3], char const (&) [7], char const (&) [5], char const (&) [4], char const (&) [2], char const (&) [8], char const (&) [5]) const
Unexecuted instantiation: bool AK::FlyString::is_one_of<AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&>(AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&) const
Unexecuted instantiation: bool AK::FlyString::is_one_of<AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&>(AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&) const
Unexecuted instantiation: bool AK::FlyString::is_one_of<AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&>(AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&) const
Unexecuted instantiation: bool AK::FlyString::is_one_of<AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&>(AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&) const
Unexecuted instantiation: bool AK::FlyString::is_one_of<AK::FlyString&, AK::FlyString&>(AK::FlyString&, AK::FlyString&) const
Unexecuted instantiation: bool AK::FlyString::is_one_of<AK::FlyString&, AK::FlyString&, AK::FlyString&>(AK::FlyString&, AK::FlyString&, AK::FlyString&) const
Unexecuted instantiation: bool AK::FlyString::is_one_of<AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&>(AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&) const
Unexecuted instantiation: bool AK::FlyString::is_one_of<AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, char const (&) [7]>(AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, char const (&) [7]) const
Unexecuted instantiation: bool AK::FlyString::is_one_of<AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&>(AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&) const
Unexecuted instantiation: bool AK::FlyString::is_one_of<AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&>(AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&) const
Unexecuted instantiation: bool AK::FlyString::is_one_of<AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&>(AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&) const
Unexecuted instantiation: bool AK::FlyString::is_one_of<AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&>(AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&) const
Unexecuted instantiation: bool AK::FlyString::is_one_of<AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&>(AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&) const
Unexecuted instantiation: bool AK::FlyString::is_one_of<AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&>(AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&) const
Unexecuted instantiation: bool AK::FlyString::is_one_of<AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&>(AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&) const
Unexecuted instantiation: bool AK::FlyString::is_one_of<AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&>(AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&) const
Unexecuted instantiation: bool AK::FlyString::is_one_of<AK::FlyString>(AK::FlyString&&) const
Unexecuted instantiation: bool AK::FlyString::is_one_of<AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&>(AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&) const
Unexecuted instantiation: bool AK::FlyString::is_one_of<AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&>(AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&) const
Unexecuted instantiation: bool AK::FlyString::is_one_of<AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&>(AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&) const
Unexecuted instantiation: bool AK::FlyString::is_one_of<AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&>(AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&) const
Unexecuted instantiation: bool AK::FlyString::is_one_of<AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&>(AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&, AK::FlyString&) const
Unexecuted instantiation: bool AK::FlyString::is_one_of<AK::FlyString&>(AK::FlyString&) const
81
82
private:
83
    explicit FlyString(Detail::StringBase data)
84
0
        : m_data(move(data))
85
0
    {
86
0
    }
87
88
    Detail::StringBase m_data;
89
};
90
91
template<>
92
struct Traits<FlyString> : public DefaultTraits<FlyString> {
93
    static unsigned hash(FlyString const&);
94
};
95
96
template<>
97
struct Formatter<FlyString> : Formatter<StringView> {
98
    ErrorOr<void> format(FormatBuilder&, FlyString const&);
99
};
100
101
struct ASCIICaseInsensitiveFlyStringTraits : public Traits<String> {
102
0
    static unsigned hash(FlyString const& s) { return s.ascii_case_insensitive_hash(); }
103
0
    static bool equals(FlyString const& a, FlyString const& b) { return a.equals_ignoring_ascii_case(b); }
104
};
105
106
}
107
108
[[nodiscard]] ALWAYS_INLINE AK::FlyString operator""_fly_string(char const* cstring, size_t length)
109
1.12M
{
110
1.12M
    return AK::FlyString::from_utf8(AK::StringView(cstring, length)).release_value();
111
1.12M
}
112
113
#if USING_AK_GLOBALLY
114
using AK::FlyString;
115
#endif