Coverage Report

Created: 2025-09-05 06:52

/src/serenity/AK/SinglyLinkedList.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
3
 *
4
 * SPDX-License-Identifier: BSD-2-Clause
5
 */
6
7
#pragma once
8
9
#include <AK/Assertions.h>
10
#include <AK/Error.h>
11
#include <AK/Find.h>
12
#include <AK/StdLibExtras.h>
13
#include <AK/Traits.h>
14
#include <AK/Types.h>
15
16
namespace AK {
17
18
template<typename ListType, typename ElementType>
19
class SinglyLinkedListIterator {
20
public:
21
0
    SinglyLinkedListIterator() = default;
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<JS::FinalizationRegistry::FinalizationRecord, AK::DefaultSizeCalculationPolicy>, JS::FinalizationRegistry::FinalizationRecord>::SinglyLinkedListIterator()
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<JS::NonnullGCPtr<Web::Streams::ReadRequest>, AK::DefaultSizeCalculationPolicy>, JS::NonnullGCPtr<Web::Streams::ReadRequest> >::SinglyLinkedListIterator()
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<JS::NonnullGCPtr<JS::PromiseCapability>, AK::DefaultSizeCalculationPolicy>, JS::NonnullGCPtr<JS::PromiseCapability> >::SinglyLinkedListIterator()
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<Web::Streams::PullIntoDescriptor, AK::DefaultSizeCalculationPolicy>, Web::Streams::PullIntoDescriptor>::SinglyLinkedListIterator()
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<Web::Streams::ReadableByteStreamQueueEntry, AK::DefaultSizeCalculationPolicy>, Web::Streams::ReadableByteStreamQueueEntry>::SinglyLinkedListIterator()
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<Web::Streams::ValueWithSize, AK::DefaultSizeCalculationPolicy>, Web::Streams::ValueWithSize>::SinglyLinkedListIterator()
22
0
    bool operator!=(SinglyLinkedListIterator const& other) const { return m_node != other.m_node; }
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<JS::FinalizationRegistry::FinalizationRecord, AK::DefaultSizeCalculationPolicy>, JS::FinalizationRegistry::FinalizationRecord>::operator!=(AK::SinglyLinkedListIterator<AK::SinglyLinkedList<JS::FinalizationRegistry::FinalizationRecord, AK::DefaultSizeCalculationPolicy>, JS::FinalizationRegistry::FinalizationRecord> const&) const
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<JS::NonnullGCPtr<Web::Streams::ReadRequest>, AK::DefaultSizeCalculationPolicy>, JS::NonnullGCPtr<Web::Streams::ReadRequest> >::operator!=(AK::SinglyLinkedListIterator<AK::SinglyLinkedList<JS::NonnullGCPtr<Web::Streams::ReadRequest>, AK::DefaultSizeCalculationPolicy>, JS::NonnullGCPtr<Web::Streams::ReadRequest> > const&) const
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<JS::NonnullGCPtr<JS::PromiseCapability>, AK::DefaultSizeCalculationPolicy>, JS::NonnullGCPtr<JS::PromiseCapability> >::operator!=(AK::SinglyLinkedListIterator<AK::SinglyLinkedList<JS::NonnullGCPtr<JS::PromiseCapability>, AK::DefaultSizeCalculationPolicy>, JS::NonnullGCPtr<JS::PromiseCapability> > const&) const
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<Web::Streams::PullIntoDescriptor, AK::DefaultSizeCalculationPolicy>, Web::Streams::PullIntoDescriptor>::operator!=(AK::SinglyLinkedListIterator<AK::SinglyLinkedList<Web::Streams::PullIntoDescriptor, AK::DefaultSizeCalculationPolicy>, Web::Streams::PullIntoDescriptor> const&) const
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<Web::Streams::ReadableByteStreamQueueEntry, AK::DefaultSizeCalculationPolicy>, Web::Streams::ReadableByteStreamQueueEntry>::operator!=(AK::SinglyLinkedListIterator<AK::SinglyLinkedList<Web::Streams::ReadableByteStreamQueueEntry, AK::DefaultSizeCalculationPolicy>, Web::Streams::ReadableByteStreamQueueEntry> const&) const
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<Web::Streams::ValueWithSize, AK::DefaultSizeCalculationPolicy>, Web::Streams::ValueWithSize>::operator!=(AK::SinglyLinkedListIterator<AK::SinglyLinkedList<Web::Streams::ValueWithSize, AK::DefaultSizeCalculationPolicy>, Web::Streams::ValueWithSize> const&) const
23
    SinglyLinkedListIterator& operator++()
24
0
    {
25
0
        if (m_removed)
26
0
            m_removed = false;
27
0
        else
28
0
            m_prev = m_node;
29
0
        m_node = m_next;
30
0
        if (m_next)
31
0
            m_next = m_next->next;
32
0
        return *this;
33
0
    }
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<JS::FinalizationRegistry::FinalizationRecord, AK::DefaultSizeCalculationPolicy>, JS::FinalizationRegistry::FinalizationRecord>::operator++()
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<JS::NonnullGCPtr<Web::Streams::ReadRequest>, AK::DefaultSizeCalculationPolicy>, JS::NonnullGCPtr<Web::Streams::ReadRequest> >::operator++()
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<JS::NonnullGCPtr<JS::PromiseCapability>, AK::DefaultSizeCalculationPolicy>, JS::NonnullGCPtr<JS::PromiseCapability> >::operator++()
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<Web::Streams::PullIntoDescriptor, AK::DefaultSizeCalculationPolicy>, Web::Streams::PullIntoDescriptor>::operator++()
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<Web::Streams::ReadableByteStreamQueueEntry, AK::DefaultSizeCalculationPolicy>, Web::Streams::ReadableByteStreamQueueEntry>::operator++()
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<Web::Streams::ValueWithSize, AK::DefaultSizeCalculationPolicy>, Web::Streams::ValueWithSize>::operator++()
34
    ElementType& operator*()
35
0
    {
36
0
        VERIFY(!m_removed);
37
0
        return m_node->value;
38
0
    }
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<JS::FinalizationRegistry::FinalizationRecord, AK::DefaultSizeCalculationPolicy>, JS::FinalizationRegistry::FinalizationRecord>::operator*()
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<JS::NonnullGCPtr<Web::Streams::ReadRequest>, AK::DefaultSizeCalculationPolicy>, JS::NonnullGCPtr<Web::Streams::ReadRequest> >::operator*()
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<JS::NonnullGCPtr<JS::PromiseCapability>, AK::DefaultSizeCalculationPolicy>, JS::NonnullGCPtr<JS::PromiseCapability> >::operator*()
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<Web::Streams::PullIntoDescriptor, AK::DefaultSizeCalculationPolicy>, Web::Streams::PullIntoDescriptor>::operator*()
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<Web::Streams::ReadableByteStreamQueueEntry, AK::DefaultSizeCalculationPolicy>, Web::Streams::ReadableByteStreamQueueEntry>::operator*()
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<Web::Streams::ValueWithSize, AK::DefaultSizeCalculationPolicy>, Web::Streams::ValueWithSize>::operator*()
39
    ElementType* operator->()
40
0
    {
41
0
        VERIFY(!m_removed);
42
0
        return &m_node->value;
43
0
    }
44
0
    bool is_end() const { return !m_node; }
45
    bool is_begin() const { return !m_prev; }
46
    void remove(ListType& list)
47
0
    {
48
0
        m_removed = true;
49
0
        list.remove(*this);
50
0
    }
51
52
private:
53
    friend ListType;
54
    explicit SinglyLinkedListIterator(typename ListType::Node* node, typename ListType::Node* prev = nullptr)
55
0
        : m_node(node)
56
0
        , m_prev(prev)
57
0
        , m_next(node ? node->next : nullptr)
58
0
    {
59
0
    }
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<JS::FinalizationRegistry::FinalizationRecord, AK::DefaultSizeCalculationPolicy>, JS::FinalizationRegistry::FinalizationRecord>::SinglyLinkedListIterator(AK::SinglyLinkedList<JS::FinalizationRegistry::FinalizationRecord, AK::DefaultSizeCalculationPolicy>::Node*, AK::SinglyLinkedList<JS::FinalizationRegistry::FinalizationRecord, AK::DefaultSizeCalculationPolicy>::Node*)
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<JS::NonnullGCPtr<Web::Streams::ReadRequest>, AK::DefaultSizeCalculationPolicy>, JS::NonnullGCPtr<Web::Streams::ReadRequest> >::SinglyLinkedListIterator(AK::SinglyLinkedList<JS::NonnullGCPtr<Web::Streams::ReadRequest>, AK::DefaultSizeCalculationPolicy>::Node*, AK::SinglyLinkedList<JS::NonnullGCPtr<Web::Streams::ReadRequest>, AK::DefaultSizeCalculationPolicy>::Node*)
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<JS::NonnullGCPtr<JS::PromiseCapability>, AK::DefaultSizeCalculationPolicy>, JS::NonnullGCPtr<JS::PromiseCapability> >::SinglyLinkedListIterator(AK::SinglyLinkedList<JS::NonnullGCPtr<JS::PromiseCapability>, AK::DefaultSizeCalculationPolicy>::Node*, AK::SinglyLinkedList<JS::NonnullGCPtr<JS::PromiseCapability>, AK::DefaultSizeCalculationPolicy>::Node*)
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<Web::Streams::PullIntoDescriptor, AK::DefaultSizeCalculationPolicy>, Web::Streams::PullIntoDescriptor>::SinglyLinkedListIterator(AK::SinglyLinkedList<Web::Streams::PullIntoDescriptor, AK::DefaultSizeCalculationPolicy>::Node*, AK::SinglyLinkedList<Web::Streams::PullIntoDescriptor, AK::DefaultSizeCalculationPolicy>::Node*)
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<Web::Streams::ReadableByteStreamQueueEntry, AK::DefaultSizeCalculationPolicy>, Web::Streams::ReadableByteStreamQueueEntry>::SinglyLinkedListIterator(AK::SinglyLinkedList<Web::Streams::ReadableByteStreamQueueEntry, AK::DefaultSizeCalculationPolicy>::Node*, AK::SinglyLinkedList<Web::Streams::ReadableByteStreamQueueEntry, AK::DefaultSizeCalculationPolicy>::Node*)
Unexecuted instantiation: AK::SinglyLinkedListIterator<AK::SinglyLinkedList<Web::Streams::ValueWithSize, AK::DefaultSizeCalculationPolicy>, Web::Streams::ValueWithSize>::SinglyLinkedListIterator(AK::SinglyLinkedList<Web::Streams::ValueWithSize, AK::DefaultSizeCalculationPolicy>::Node*, AK::SinglyLinkedList<Web::Streams::ValueWithSize, AK::DefaultSizeCalculationPolicy>::Node*)
60
    typename ListType::Node* m_node { nullptr };
61
    typename ListType::Node* m_prev { nullptr };
62
    typename ListType::Node* m_next { nullptr };
63
    bool m_removed { false };
64
};
65
66
template<typename T, typename TSizeCalculationPolicy>
67
class SinglyLinkedList {
68
private:
69
    struct Node {
70
        explicit Node(T&& v)
71
0
            : value(move(v))
72
0
        {
73
0
        }
Unexecuted instantiation: AK::SinglyLinkedList<JS::FinalizationRegistry::FinalizationRecord, AK::DefaultSizeCalculationPolicy>::Node::Node(JS::FinalizationRegistry::FinalizationRecord&&)
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::ValueWithSize, AK::DefaultSizeCalculationPolicy>::Node::Node(Web::Streams::ValueWithSize&&)
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::ReadableByteStreamQueueEntry, AK::DefaultSizeCalculationPolicy>::Node::Node(Web::Streams::ReadableByteStreamQueueEntry&&)
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::PullIntoDescriptor, AK::DefaultSizeCalculationPolicy>::Node::Node(Web::Streams::PullIntoDescriptor&&)
74
        explicit Node(T const& v)
75
0
            : value(v)
76
0
        {
77
0
        }
Unexecuted instantiation: AK::SinglyLinkedList<JS::NonnullGCPtr<Web::Streams::ReadRequest>, AK::DefaultSizeCalculationPolicy>::Node::Node(JS::NonnullGCPtr<Web::Streams::ReadRequest> const&)
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::PullIntoDescriptor, AK::DefaultSizeCalculationPolicy>::Node::Node(Web::Streams::PullIntoDescriptor const&)
Unexecuted instantiation: AK::SinglyLinkedList<JS::NonnullGCPtr<JS::PromiseCapability>, AK::DefaultSizeCalculationPolicy>::Node::Node(JS::NonnullGCPtr<JS::PromiseCapability> const&)
78
        T value;
79
        Node* next { nullptr };
80
    };
81
82
public:
83
0
    SinglyLinkedList() = default;
Unexecuted instantiation: AK::SinglyLinkedList<JS::FinalizationRegistry::FinalizationRecord, AK::DefaultSizeCalculationPolicy>::SinglyLinkedList()
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::PullIntoDescriptor, AK::DefaultSizeCalculationPolicy>::SinglyLinkedList()
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::ReadableByteStreamQueueEntry, AK::DefaultSizeCalculationPolicy>::SinglyLinkedList()
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::ValueWithSize, AK::DefaultSizeCalculationPolicy>::SinglyLinkedList()
Unexecuted instantiation: AK::SinglyLinkedList<JS::NonnullGCPtr<Web::Streams::ReadRequest>, AK::DefaultSizeCalculationPolicy>::SinglyLinkedList()
Unexecuted instantiation: AK::SinglyLinkedList<JS::NonnullGCPtr<JS::PromiseCapability>, AK::DefaultSizeCalculationPolicy>::SinglyLinkedList()
84
    SinglyLinkedList(SinglyLinkedList const& other) = delete;
85
    SinglyLinkedList(SinglyLinkedList&& other)
86
0
        : m_head(other.m_head)
87
0
        , m_tail(other.m_tail)
88
0
    {
89
0
        other.m_head = nullptr;
90
0
        other.m_tail = nullptr;
91
0
    }
92
    SinglyLinkedList& operator=(SinglyLinkedList const& other) = delete;
93
    SinglyLinkedList& operator=(SinglyLinkedList&&) = delete;
94
95
0
    ~SinglyLinkedList() { clear(); }
Unexecuted instantiation: AK::SinglyLinkedList<JS::FinalizationRegistry::FinalizationRecord, AK::DefaultSizeCalculationPolicy>::~SinglyLinkedList()
Unexecuted instantiation: AK::SinglyLinkedList<JS::NonnullGCPtr<Web::Streams::ReadRequest>, AK::DefaultSizeCalculationPolicy>::~SinglyLinkedList()
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::ReadableByteStreamQueueEntry, AK::DefaultSizeCalculationPolicy>::~SinglyLinkedList()
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::PullIntoDescriptor, AK::DefaultSizeCalculationPolicy>::~SinglyLinkedList()
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::ValueWithSize, AK::DefaultSizeCalculationPolicy>::~SinglyLinkedList()
Unexecuted instantiation: AK::SinglyLinkedList<JS::NonnullGCPtr<JS::PromiseCapability>, AK::DefaultSizeCalculationPolicy>::~SinglyLinkedList()
96
97
0
    bool is_empty() const { return !head(); }
Unexecuted instantiation: AK::SinglyLinkedList<JS::NonnullGCPtr<Web::Streams::ReadRequest>, AK::DefaultSizeCalculationPolicy>::is_empty() const
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::PullIntoDescriptor, AK::DefaultSizeCalculationPolicy>::is_empty() const
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::ValueWithSize, AK::DefaultSizeCalculationPolicy>::is_empty() const
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::ReadableByteStreamQueueEntry, AK::DefaultSizeCalculationPolicy>::is_empty() const
Unexecuted instantiation: AK::SinglyLinkedList<JS::NonnullGCPtr<JS::PromiseCapability>, AK::DefaultSizeCalculationPolicy>::is_empty() const
98
99
    inline size_t size() const
100
0
    {
101
0
        return m_size_policy.size(m_head);
102
0
    }
103
104
    void clear()
105
0
    {
106
0
        for (auto* node = m_head; node;) {
107
0
            auto* next = node->next;
108
0
            delete node;
109
0
            node = next;
110
0
        }
111
0
        m_head = nullptr;
112
0
        m_tail = nullptr;
113
0
        m_size_policy.reset();
114
0
    }
Unexecuted instantiation: AK::SinglyLinkedList<JS::FinalizationRegistry::FinalizationRecord, AK::DefaultSizeCalculationPolicy>::clear()
Unexecuted instantiation: AK::SinglyLinkedList<JS::NonnullGCPtr<Web::Streams::ReadRequest>, AK::DefaultSizeCalculationPolicy>::clear()
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::ValueWithSize, AK::DefaultSizeCalculationPolicy>::clear()
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::PullIntoDescriptor, AK::DefaultSizeCalculationPolicy>::clear()
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::ReadableByteStreamQueueEntry, AK::DefaultSizeCalculationPolicy>::clear()
Unexecuted instantiation: AK::SinglyLinkedList<JS::NonnullGCPtr<JS::PromiseCapability>, AK::DefaultSizeCalculationPolicy>::clear()
115
116
    T& first()
117
0
    {
118
0
        VERIFY(head());
119
0
        return head()->value;
120
0
    }
Unexecuted instantiation: AK::SinglyLinkedList<JS::NonnullGCPtr<Web::Streams::ReadRequest>, AK::DefaultSizeCalculationPolicy>::first()
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::ReadableByteStreamQueueEntry, AK::DefaultSizeCalculationPolicy>::first()
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::PullIntoDescriptor, AK::DefaultSizeCalculationPolicy>::first()
Unexecuted instantiation: AK::SinglyLinkedList<JS::NonnullGCPtr<JS::PromiseCapability>, AK::DefaultSizeCalculationPolicy>::first()
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::ValueWithSize, AK::DefaultSizeCalculationPolicy>::first()
121
    T const& first() const
122
0
    {
123
0
        VERIFY(head());
124
0
        return head()->value;
125
0
    }
126
    T& last()
127
    {
128
        VERIFY(head());
129
        return tail()->value;
130
    }
131
    T const& last() const
132
    {
133
        VERIFY(head());
134
        return tail()->value;
135
    }
136
137
    T take_first()
138
0
    {
139
0
        VERIFY(m_head);
140
0
        auto* prev_head = m_head;
141
0
        T value = move(first());
142
0
        if (m_tail == m_head)
143
0
            m_tail = nullptr;
144
0
        m_head = m_head->next;
145
0
        m_size_policy.decrease_size(value);
146
0
        delete prev_head;
147
0
        return value;
148
0
    }
Unexecuted instantiation: AK::SinglyLinkedList<JS::NonnullGCPtr<Web::Streams::ReadRequest>, AK::DefaultSizeCalculationPolicy>::take_first()
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::ReadableByteStreamQueueEntry, AK::DefaultSizeCalculationPolicy>::take_first()
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::PullIntoDescriptor, AK::DefaultSizeCalculationPolicy>::take_first()
Unexecuted instantiation: AK::SinglyLinkedList<JS::NonnullGCPtr<JS::PromiseCapability>, AK::DefaultSizeCalculationPolicy>::take_first()
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::ValueWithSize, AK::DefaultSizeCalculationPolicy>::take_first()
149
150
    template<typename U = T>
151
    ErrorOr<void> try_append(U&& value)
152
0
    {
153
0
        auto* node = new (nothrow) Node(forward<U>(value));
154
0
        if (!node)
155
0
            return Error::from_errno(ENOMEM);
156
0
        m_size_policy.increase_size(value);
157
0
        if (!m_head) {
158
0
            m_head = node;
159
0
            m_tail = node;
160
0
            return {};
161
0
        }
162
0
        m_tail->next = node;
163
0
        m_tail = node;
164
0
        return {};
165
0
    }
Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::SinglyLinkedList<JS::FinalizationRegistry::FinalizationRecord, AK::DefaultSizeCalculationPolicy>::try_append<JS::FinalizationRegistry::FinalizationRecord>(JS::FinalizationRegistry::FinalizationRecord&&)
Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::SinglyLinkedList<JS::NonnullGCPtr<Web::Streams::ReadRequest>, AK::DefaultSizeCalculationPolicy>::try_append<JS::NonnullGCPtr<Web::Streams::ReadRequest>&>(JS::NonnullGCPtr<Web::Streams::ReadRequest>&)
Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::SinglyLinkedList<Web::Streams::PullIntoDescriptor, AK::DefaultSizeCalculationPolicy>::try_append<Web::Streams::PullIntoDescriptor&>(Web::Streams::PullIntoDescriptor&)
Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::SinglyLinkedList<Web::Streams::ValueWithSize, AK::DefaultSizeCalculationPolicy>::try_append<Web::Streams::ValueWithSize>(Web::Streams::ValueWithSize&&)
Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::SinglyLinkedList<Web::Streams::ReadableByteStreamQueueEntry, AK::DefaultSizeCalculationPolicy>::try_append<Web::Streams::ReadableByteStreamQueueEntry>(Web::Streams::ReadableByteStreamQueueEntry&&)
Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::SinglyLinkedList<JS::NonnullGCPtr<JS::PromiseCapability>, AK::DefaultSizeCalculationPolicy>::try_append<JS::NonnullGCPtr<JS::PromiseCapability>&>(JS::NonnullGCPtr<JS::PromiseCapability>&)
Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::SinglyLinkedList<Web::Streams::PullIntoDescriptor, AK::DefaultSizeCalculationPolicy>::try_append<Web::Streams::PullIntoDescriptor>(Web::Streams::PullIntoDescriptor&&)
166
167
    template<typename U = T>
168
    ErrorOr<void> try_prepend(U&& value)
169
    {
170
        auto* node = new (nothrow) Node(forward<U>(value));
171
        if (!node)
172
            return Error::from_errno(ENOMEM);
173
        m_size_policy.increase_size(value);
174
        if (!m_head) {
175
            m_head = node;
176
            m_tail = node;
177
            return {};
178
        }
179
        node->next = m_head;
180
        m_head = node;
181
        return {};
182
    }
183
184
#ifndef KERNEL
185
    template<typename U = T>
186
    void append(U&& value)
187
0
    {
188
0
        MUST(try_append(forward<U>(value)));
189
0
    }
Unexecuted instantiation: void AK::SinglyLinkedList<JS::FinalizationRegistry::FinalizationRecord, AK::DefaultSizeCalculationPolicy>::append<JS::FinalizationRegistry::FinalizationRecord>(JS::FinalizationRegistry::FinalizationRecord&&)
Unexecuted instantiation: void AK::SinglyLinkedList<JS::NonnullGCPtr<Web::Streams::ReadRequest>, AK::DefaultSizeCalculationPolicy>::append<JS::NonnullGCPtr<Web::Streams::ReadRequest>&>(JS::NonnullGCPtr<Web::Streams::ReadRequest>&)
Unexecuted instantiation: void AK::SinglyLinkedList<Web::Streams::PullIntoDescriptor, AK::DefaultSizeCalculationPolicy>::append<Web::Streams::PullIntoDescriptor&>(Web::Streams::PullIntoDescriptor&)
Unexecuted instantiation: void AK::SinglyLinkedList<Web::Streams::ValueWithSize, AK::DefaultSizeCalculationPolicy>::append<Web::Streams::ValueWithSize>(Web::Streams::ValueWithSize&&)
Unexecuted instantiation: void AK::SinglyLinkedList<Web::Streams::ReadableByteStreamQueueEntry, AK::DefaultSizeCalculationPolicy>::append<Web::Streams::ReadableByteStreamQueueEntry>(Web::Streams::ReadableByteStreamQueueEntry&&)
Unexecuted instantiation: void AK::SinglyLinkedList<JS::NonnullGCPtr<JS::PromiseCapability>, AK::DefaultSizeCalculationPolicy>::append<JS::NonnullGCPtr<JS::PromiseCapability>&>(JS::NonnullGCPtr<JS::PromiseCapability>&)
Unexecuted instantiation: void AK::SinglyLinkedList<Web::Streams::PullIntoDescriptor, AK::DefaultSizeCalculationPolicy>::append<Web::Streams::PullIntoDescriptor>(Web::Streams::PullIntoDescriptor&&)
190
191
    template<typename U = T>
192
    void prepend(U&& value)
193
    {
194
        MUST(try_prepend(forward<U>(value)));
195
    }
196
#endif
197
198
    bool contains_slow(T const& value) const
199
    {
200
        return find(value) != end();
201
    }
202
203
    using Iterator = SinglyLinkedListIterator<SinglyLinkedList, T>;
204
    friend Iterator;
205
0
    Iterator begin() { return Iterator(m_head); }
Unexecuted instantiation: AK::SinglyLinkedList<JS::FinalizationRegistry::FinalizationRecord, AK::DefaultSizeCalculationPolicy>::begin()
Unexecuted instantiation: AK::SinglyLinkedList<JS::NonnullGCPtr<Web::Streams::ReadRequest>, AK::DefaultSizeCalculationPolicy>::begin()
Unexecuted instantiation: AK::SinglyLinkedList<JS::NonnullGCPtr<JS::PromiseCapability>, AK::DefaultSizeCalculationPolicy>::begin()
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::PullIntoDescriptor, AK::DefaultSizeCalculationPolicy>::begin()
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::ReadableByteStreamQueueEntry, AK::DefaultSizeCalculationPolicy>::begin()
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::ValueWithSize, AK::DefaultSizeCalculationPolicy>::begin()
206
0
    Iterator end() { return {}; }
Unexecuted instantiation: AK::SinglyLinkedList<JS::FinalizationRegistry::FinalizationRecord, AK::DefaultSizeCalculationPolicy>::end()
Unexecuted instantiation: AK::SinglyLinkedList<JS::NonnullGCPtr<Web::Streams::ReadRequest>, AK::DefaultSizeCalculationPolicy>::end()
Unexecuted instantiation: AK::SinglyLinkedList<JS::NonnullGCPtr<JS::PromiseCapability>, AK::DefaultSizeCalculationPolicy>::end()
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::PullIntoDescriptor, AK::DefaultSizeCalculationPolicy>::end()
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::ReadableByteStreamQueueEntry, AK::DefaultSizeCalculationPolicy>::end()
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::ValueWithSize, AK::DefaultSizeCalculationPolicy>::end()
207
208
    using ConstIterator = SinglyLinkedListIterator<SinglyLinkedList const, T const>;
209
    friend ConstIterator;
210
    ConstIterator begin() const { return ConstIterator(m_head); }
211
    ConstIterator end() const { return {}; }
212
213
    template<typename TUnaryPredicate>
214
    ConstIterator find_if(TUnaryPredicate&& pred) const
215
    {
216
        return AK::find_if(begin(), end(), forward<TUnaryPredicate>(pred));
217
    }
218
219
    template<typename TUnaryPredicate>
220
    Iterator find_if(TUnaryPredicate&& pred)
221
    {
222
        return AK::find_if(begin(), end(), forward<TUnaryPredicate>(pred));
223
    }
224
225
    ConstIterator find(T const& value) const
226
    {
227
        return find_if([&](auto& entry) { return Traits<T>::equals(entry, value); });
228
    }
229
230
    Iterator find(T const& value)
231
    {
232
        return find_if([&](auto& entry) { return Traits<T>::equals(entry, value); });
233
    }
234
235
    template<typename U = T>
236
    ErrorOr<void> try_insert_before(Iterator iterator, U&& value)
237
    {
238
        auto* node = new (nothrow) Node(forward<U>(value));
239
        if (!node)
240
            return Error::from_errno(ENOMEM);
241
        m_size_policy.increase_size(value);
242
        node->next = iterator.m_node;
243
        if (m_head == iterator.m_node)
244
            m_head = node;
245
        if (iterator.m_prev)
246
            iterator.m_prev->next = node;
247
        return {};
248
    }
249
250
    template<typename U = T>
251
    ErrorOr<void> try_insert_after(Iterator iterator, U&& value)
252
    {
253
        if (iterator.is_end())
254
            return try_append(value);
255
256
        auto* node = new (nothrow) Node(forward<U>(value));
257
        if (!node)
258
            return Error::from_errno(ENOMEM);
259
        m_size_policy.increase_size(value);
260
        node->next = iterator.m_node->next;
261
262
        iterator.m_node->next = node;
263
264
        if (m_tail == iterator.m_node)
265
            m_tail = node;
266
        return {};
267
    }
268
269
#ifndef KERNEL
270
    template<typename U = T>
271
    void insert_before(Iterator iterator, U&& value)
272
    {
273
        MUST(try_insert_before(iterator, forward<U>(value)));
274
    }
275
276
    template<typename U = T>
277
    void insert_after(Iterator iterator, U&& value)
278
    {
279
        MUST(try_insert_after(iterator, forward<U>(value)));
280
    }
281
#endif
282
283
    void remove(Iterator& iterator)
284
0
    {
285
0
        VERIFY(!iterator.is_end());
286
0
        if (m_head == iterator.m_node)
287
0
            m_head = iterator.m_node->next;
288
0
        if (m_tail == iterator.m_node)
289
0
            m_tail = iterator.m_prev;
290
0
        if (iterator.m_prev)
291
0
            iterator.m_prev->next = iterator.m_node->next;
292
0
        m_size_policy.decrease_size(iterator.m_node->value);
293
0
        delete iterator.m_node;
294
0
    }
295
296
private:
297
0
    Node* head() { return m_head; }
Unexecuted instantiation: AK::SinglyLinkedList<JS::NonnullGCPtr<Web::Streams::ReadRequest>, AK::DefaultSizeCalculationPolicy>::head()
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::ReadableByteStreamQueueEntry, AK::DefaultSizeCalculationPolicy>::head()
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::PullIntoDescriptor, AK::DefaultSizeCalculationPolicy>::head()
Unexecuted instantiation: AK::SinglyLinkedList<JS::NonnullGCPtr<JS::PromiseCapability>, AK::DefaultSizeCalculationPolicy>::head()
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::ValueWithSize, AK::DefaultSizeCalculationPolicy>::head()
298
0
    Node const* head() const { return m_head; }
Unexecuted instantiation: AK::SinglyLinkedList<JS::NonnullGCPtr<Web::Streams::ReadRequest>, AK::DefaultSizeCalculationPolicy>::head() const
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::PullIntoDescriptor, AK::DefaultSizeCalculationPolicy>::head() const
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::ValueWithSize, AK::DefaultSizeCalculationPolicy>::head() const
Unexecuted instantiation: AK::SinglyLinkedList<Web::Streams::ReadableByteStreamQueueEntry, AK::DefaultSizeCalculationPolicy>::head() const
Unexecuted instantiation: AK::SinglyLinkedList<JS::NonnullGCPtr<JS::PromiseCapability>, AK::DefaultSizeCalculationPolicy>::head() const
299
300
    Node* tail() { return m_tail; }
301
    Node const* tail() const { return m_tail; }
302
303
    Node* m_head { nullptr };
304
    Node* m_tail { nullptr };
305
    TSizeCalculationPolicy m_size_policy {};
306
};
307
}
308
309
#if USING_AK_GLOBALLY
310
using AK::SinglyLinkedList;
311
#endif