/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 |