1484543d1Sopenharmony_ci/*
2484543d1Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3484543d1Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4484543d1Sopenharmony_ci * you may not use this file except in compliance with the License.
5484543d1Sopenharmony_ci * You may obtain a copy of the License at
6484543d1Sopenharmony_ci *
7484543d1Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8484543d1Sopenharmony_ci *
9484543d1Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10484543d1Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11484543d1Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12484543d1Sopenharmony_ci * See the License for the specific language governing permissions and
13484543d1Sopenharmony_ci * limitations under the License.
14484543d1Sopenharmony_ci */
15484543d1Sopenharmony_ci
16484543d1Sopenharmony_ci#ifndef FFRT_LINKED_LIST_H
17484543d1Sopenharmony_ci#define FFRT_LINKED_LIST_H
18484543d1Sopenharmony_ci
19484543d1Sopenharmony_ci#include <cstddef>
20484543d1Sopenharmony_ci#include <cstdint>
21484543d1Sopenharmony_ci
22484543d1Sopenharmony_cinamespace ffrt {
23484543d1Sopenharmony_ciclass LinkedList {
24484543d1Sopenharmony_cipublic:
25484543d1Sopenharmony_ci    LinkedList() : prev(this), next(this)
26484543d1Sopenharmony_ci    {
27484543d1Sopenharmony_ci    }
28484543d1Sopenharmony_ci
29484543d1Sopenharmony_ci    LinkedList(LinkedList* prev, LinkedList* next) : prev(prev), next(next)
30484543d1Sopenharmony_ci    {
31484543d1Sopenharmony_ci    }
32484543d1Sopenharmony_ci
33484543d1Sopenharmony_ci    template <typename T>
34484543d1Sopenharmony_ci    static ptrdiff_t OffsetOf(LinkedList T::*member) noexcept
35484543d1Sopenharmony_ci    {
36484543d1Sopenharmony_ci        return reinterpret_cast<ptrdiff_t>(&(reinterpret_cast<T*>(0)->*member));
37484543d1Sopenharmony_ci    }
38484543d1Sopenharmony_ci
39484543d1Sopenharmony_ci    template <typename T>
40484543d1Sopenharmony_ci    static T* ContainerOf(LinkedList* node, LinkedList T::*member) noexcept
41484543d1Sopenharmony_ci    {
42484543d1Sopenharmony_ci        return reinterpret_cast<T*>(reinterpret_cast<intptr_t>(node) - OffsetOf<T>(member));
43484543d1Sopenharmony_ci    }
44484543d1Sopenharmony_ci
45484543d1Sopenharmony_ci    template <typename T>
46484543d1Sopenharmony_ci    T* ContainerOf(LinkedList T::*member) noexcept
47484543d1Sopenharmony_ci    {
48484543d1Sopenharmony_ci        return ContainerOf(this, member);
49484543d1Sopenharmony_ci    }
50484543d1Sopenharmony_ci
51484543d1Sopenharmony_ci    static void InsertAfter(LinkedList* cur, LinkedList* node) noexcept
52484543d1Sopenharmony_ci    {
53484543d1Sopenharmony_ci        node->next = cur->next;
54484543d1Sopenharmony_ci        node->prev = cur;
55484543d1Sopenharmony_ci        cur->next->prev = node;
56484543d1Sopenharmony_ci        cur->next = node;
57484543d1Sopenharmony_ci    }
58484543d1Sopenharmony_ci
59484543d1Sopenharmony_ci    static void InsertBefore(LinkedList* cur, LinkedList* node) noexcept
60484543d1Sopenharmony_ci    {
61484543d1Sopenharmony_ci        node->next = cur;
62484543d1Sopenharmony_ci        node->prev = cur->prev;
63484543d1Sopenharmony_ci        cur->prev->next = node;
64484543d1Sopenharmony_ci        cur->prev = node;
65484543d1Sopenharmony_ci    }
66484543d1Sopenharmony_ci
67484543d1Sopenharmony_ci    static void Delete(LinkedList& node) noexcept
68484543d1Sopenharmony_ci    {
69484543d1Sopenharmony_ci        node.prev->next = node.next;
70484543d1Sopenharmony_ci        node.next->prev = node.prev;
71484543d1Sopenharmony_ci        node.next = &node;
72484543d1Sopenharmony_ci        node.prev = &node;
73484543d1Sopenharmony_ci    }
74484543d1Sopenharmony_ci
75484543d1Sopenharmony_ci    static void Delete(LinkedList* node) noexcept
76484543d1Sopenharmony_ci    {
77484543d1Sopenharmony_ci        node->prev->next = node->next;
78484543d1Sopenharmony_ci        node->next->prev = node->prev;
79484543d1Sopenharmony_ci        node->next = node;
80484543d1Sopenharmony_ci        node->prev = node;
81484543d1Sopenharmony_ci    }
82484543d1Sopenharmony_ci
83484543d1Sopenharmony_ci    static void RemoveCur(LinkedList& node) noexcept
84484543d1Sopenharmony_ci    {
85484543d1Sopenharmony_ci        if (node.Null()) {
86484543d1Sopenharmony_ci            return;
87484543d1Sopenharmony_ci        }
88484543d1Sopenharmony_ci        Delete(node);
89484543d1Sopenharmony_ci    }
90484543d1Sopenharmony_ci
91484543d1Sopenharmony_ci    static void RemoveCur(LinkedList* node) noexcept
92484543d1Sopenharmony_ci    {
93484543d1Sopenharmony_ci        if (node->Null()) {
94484543d1Sopenharmony_ci            return;
95484543d1Sopenharmony_ci        }
96484543d1Sopenharmony_ci        Delete(node);
97484543d1Sopenharmony_ci    }
98484543d1Sopenharmony_ci
99484543d1Sopenharmony_ci    static LinkedList* Next(LinkedList* cur) noexcept
100484543d1Sopenharmony_ci    {
101484543d1Sopenharmony_ci        if (cur->Empty()) {
102484543d1Sopenharmony_ci            return nullptr;
103484543d1Sopenharmony_ci        }
104484543d1Sopenharmony_ci
105484543d1Sopenharmony_ci        LinkedList* next = cur->next;
106484543d1Sopenharmony_ci        return next;
107484543d1Sopenharmony_ci    }
108484543d1Sopenharmony_ci
109484543d1Sopenharmony_ci    template <typename T>
110484543d1Sopenharmony_ci    static T* Next(LinkedList* cur, LinkedList T::*member) noexcept
111484543d1Sopenharmony_ci    {
112484543d1Sopenharmony_ci        if (cur->Empty()) {
113484543d1Sopenharmony_ci            return nullptr;
114484543d1Sopenharmony_ci        }
115484543d1Sopenharmony_ci
116484543d1Sopenharmony_ci        LinkedList* next = cur->next;
117484543d1Sopenharmony_ci        return ContainerOf<T>(next, member);
118484543d1Sopenharmony_ci    }
119484543d1Sopenharmony_ci
120484543d1Sopenharmony_ci    static LinkedList* RemoveNext(LinkedList* cur) noexcept
121484543d1Sopenharmony_ci    {
122484543d1Sopenharmony_ci        if (cur->Empty()) {
123484543d1Sopenharmony_ci            return nullptr;
124484543d1Sopenharmony_ci        }
125484543d1Sopenharmony_ci
126484543d1Sopenharmony_ci        LinkedList* next = cur->next;
127484543d1Sopenharmony_ci        Delete(next);
128484543d1Sopenharmony_ci        return next;
129484543d1Sopenharmony_ci    }
130484543d1Sopenharmony_ci
131484543d1Sopenharmony_ci    template <typename T>
132484543d1Sopenharmony_ci    static T* RemoveNext(LinkedList* cur, LinkedList T::*member) noexcept
133484543d1Sopenharmony_ci    {
134484543d1Sopenharmony_ci        if (cur->Empty()) {
135484543d1Sopenharmony_ci            return nullptr;
136484543d1Sopenharmony_ci        }
137484543d1Sopenharmony_ci
138484543d1Sopenharmony_ci        LinkedList* next = cur->next;
139484543d1Sopenharmony_ci        Delete(next);
140484543d1Sopenharmony_ci        return ContainerOf<T>(next, member);
141484543d1Sopenharmony_ci    }
142484543d1Sopenharmony_ci
143484543d1Sopenharmony_ci    static LinkedList* RemovePrev(LinkedList* cur) noexcept
144484543d1Sopenharmony_ci    {
145484543d1Sopenharmony_ci        if (cur->Empty()) {
146484543d1Sopenharmony_ci            return nullptr;
147484543d1Sopenharmony_ci        }
148484543d1Sopenharmony_ci
149484543d1Sopenharmony_ci        LinkedList* prev = cur->prev;
150484543d1Sopenharmony_ci        Delete(prev);
151484543d1Sopenharmony_ci        return prev;
152484543d1Sopenharmony_ci    }
153484543d1Sopenharmony_ci
154484543d1Sopenharmony_ci    template <typename T>
155484543d1Sopenharmony_ci    static T* RemovePrev(LinkedList* cur, LinkedList T::*member) noexcept
156484543d1Sopenharmony_ci    {
157484543d1Sopenharmony_ci        if (cur->Empty()) {
158484543d1Sopenharmony_ci            return nullptr;
159484543d1Sopenharmony_ci        }
160484543d1Sopenharmony_ci
161484543d1Sopenharmony_ci        LinkedList* prev = cur->prev;
162484543d1Sopenharmony_ci        Delete(prev);
163484543d1Sopenharmony_ci        return ContainerOf<T>(prev, member);
164484543d1Sopenharmony_ci    }
165484543d1Sopenharmony_ci
166484543d1Sopenharmony_ci    void InsertAfter(LinkedList& node) noexcept
167484543d1Sopenharmony_ci    {
168484543d1Sopenharmony_ci        InsertAfter(this, &node);
169484543d1Sopenharmony_ci    }
170484543d1Sopenharmony_ci
171484543d1Sopenharmony_ci    void InsertAfter(LinkedList* node) noexcept
172484543d1Sopenharmony_ci    {
173484543d1Sopenharmony_ci        InsertAfter(this, node);
174484543d1Sopenharmony_ci    }
175484543d1Sopenharmony_ci
176484543d1Sopenharmony_ci    void InsertBefore(LinkedList& node) noexcept
177484543d1Sopenharmony_ci    {
178484543d1Sopenharmony_ci        InsertBefore(this, &node);
179484543d1Sopenharmony_ci    }
180484543d1Sopenharmony_ci
181484543d1Sopenharmony_ci    void InsertBefore(LinkedList* node) noexcept
182484543d1Sopenharmony_ci    {
183484543d1Sopenharmony_ci        InsertBefore(this, node);
184484543d1Sopenharmony_ci    }
185484543d1Sopenharmony_ci
186484543d1Sopenharmony_ci    LinkedList* Next() noexcept
187484543d1Sopenharmony_ci    {
188484543d1Sopenharmony_ci        return Next(this);
189484543d1Sopenharmony_ci    }
190484543d1Sopenharmony_ci
191484543d1Sopenharmony_ci    template <typename T>
192484543d1Sopenharmony_ci    T* Next(LinkedList T::*member) noexcept
193484543d1Sopenharmony_ci    {
194484543d1Sopenharmony_ci        return Next(this, member);
195484543d1Sopenharmony_ci    }
196484543d1Sopenharmony_ci
197484543d1Sopenharmony_ci    LinkedList* RemoveNext() noexcept
198484543d1Sopenharmony_ci    {
199484543d1Sopenharmony_ci        return RemoveNext(this);
200484543d1Sopenharmony_ci    }
201484543d1Sopenharmony_ci
202484543d1Sopenharmony_ci    template <typename T>
203484543d1Sopenharmony_ci    T* RemoveNext(LinkedList T::*member) noexcept
204484543d1Sopenharmony_ci    {
205484543d1Sopenharmony_ci        return RemoveNext(this, member);
206484543d1Sopenharmony_ci    }
207484543d1Sopenharmony_ci
208484543d1Sopenharmony_ci    LinkedList* RemovePrev() noexcept
209484543d1Sopenharmony_ci    {
210484543d1Sopenharmony_ci        return RemovePrev(this);
211484543d1Sopenharmony_ci    }
212484543d1Sopenharmony_ci
213484543d1Sopenharmony_ci    template <typename T>
214484543d1Sopenharmony_ci    T* RemovePrev(LinkedList T::*member) noexcept
215484543d1Sopenharmony_ci    {
216484543d1Sopenharmony_ci        return RemovePrev(this, member);
217484543d1Sopenharmony_ci    }
218484543d1Sopenharmony_ci
219484543d1Sopenharmony_ci    void PushFront(LinkedList& node) noexcept
220484543d1Sopenharmony_ci    {
221484543d1Sopenharmony_ci        InsertAfter(&node);
222484543d1Sopenharmony_ci    }
223484543d1Sopenharmony_ci
224484543d1Sopenharmony_ci    void PushFront(LinkedList* node) noexcept
225484543d1Sopenharmony_ci    {
226484543d1Sopenharmony_ci        InsertAfter(node);
227484543d1Sopenharmony_ci    }
228484543d1Sopenharmony_ci
229484543d1Sopenharmony_ci    void PushBack(LinkedList& node) noexcept
230484543d1Sopenharmony_ci    {
231484543d1Sopenharmony_ci        InsertBefore(&node);
232484543d1Sopenharmony_ci    }
233484543d1Sopenharmony_ci
234484543d1Sopenharmony_ci    void PushBack(LinkedList* node) noexcept
235484543d1Sopenharmony_ci    {
236484543d1Sopenharmony_ci        InsertBefore(node);
237484543d1Sopenharmony_ci    }
238484543d1Sopenharmony_ci
239484543d1Sopenharmony_ci    LinkedList* Front() noexcept
240484543d1Sopenharmony_ci    {
241484543d1Sopenharmony_ci        return Next();
242484543d1Sopenharmony_ci    }
243484543d1Sopenharmony_ci
244484543d1Sopenharmony_ci    template <typename T>
245484543d1Sopenharmony_ci    T* Front(LinkedList T::*member) noexcept
246484543d1Sopenharmony_ci    {
247484543d1Sopenharmony_ci        return Next(member);
248484543d1Sopenharmony_ci    }
249484543d1Sopenharmony_ci
250484543d1Sopenharmony_ci    LinkedList* PopFront() noexcept
251484543d1Sopenharmony_ci    {
252484543d1Sopenharmony_ci        return RemoveNext();
253484543d1Sopenharmony_ci    }
254484543d1Sopenharmony_ci
255484543d1Sopenharmony_ci    template <typename T>
256484543d1Sopenharmony_ci    T* PopFront(LinkedList T::*member) noexcept
257484543d1Sopenharmony_ci    {
258484543d1Sopenharmony_ci        return RemoveNext(member);
259484543d1Sopenharmony_ci    }
260484543d1Sopenharmony_ci
261484543d1Sopenharmony_ci    LinkedList* PopBack() noexcept
262484543d1Sopenharmony_ci    {
263484543d1Sopenharmony_ci        return RemovePrev();
264484543d1Sopenharmony_ci    }
265484543d1Sopenharmony_ci
266484543d1Sopenharmony_ci    template <typename T>
267484543d1Sopenharmony_ci    T* PopBack(LinkedList T::*member) noexcept
268484543d1Sopenharmony_ci    {
269484543d1Sopenharmony_ci        return RemovePrev(member);
270484543d1Sopenharmony_ci    }
271484543d1Sopenharmony_ci
272484543d1Sopenharmony_ci    bool Empty() const noexcept
273484543d1Sopenharmony_ci    {
274484543d1Sopenharmony_ci        return next == this;
275484543d1Sopenharmony_ci    }
276484543d1Sopenharmony_ci
277484543d1Sopenharmony_ci    bool Null() const noexcept
278484543d1Sopenharmony_ci    {
279484543d1Sopenharmony_ci        return prev == nullptr && next == nullptr;
280484543d1Sopenharmony_ci    }
281484543d1Sopenharmony_ci
282484543d1Sopenharmony_ci    bool InList() const noexcept
283484543d1Sopenharmony_ci    {
284484543d1Sopenharmony_ci        return (next != nullptr && next != this);
285484543d1Sopenharmony_ci    }
286484543d1Sopenharmony_ci
287484543d1Sopenharmony_ciprivate:
288484543d1Sopenharmony_ci    LinkedList* prev;
289484543d1Sopenharmony_ci    LinkedList* next;
290484543d1Sopenharmony_ci};
291484543d1Sopenharmony_ci} // namespace ffrt
292484543d1Sopenharmony_ci#endif
293