1 /*
2 * Copyright (C) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #ifndef NSTACKX_LIST_H
17 #define NSTACKX_LIST_H
18
19 #include <stdio.h>
20
21 #ifdef __cplusplus
22 extern "C" {
23 #endif
24
25 typedef struct List {
26 struct List *prev;
27 struct List *next;
28 } List;
29
ListInitHead(List * head)30 static inline void ListInitHead(List *head)
31 {
32 head->next = head;
33 head->prev = head;
34 }
35
ListInsertHead(List * head,List * node)36 static inline void ListInsertHead(List *head, List *node)
37 {
38 node->next = head->next;
39 node->next->prev = node;
40 node->prev = head;
41 head->next = node;
42 }
43
ListInsertTail(List * head,List * node)44 static inline void ListInsertTail(List *head, List *node)
45 {
46 node->prev = head->prev;
47 node->prev->next = node;
48 node->next = head;
49 head->prev = node;
50 }
51
ListRemoveNode(List * node)52 static inline void ListRemoveNode(List *node)
53 {
54 if (node == NULL) {
55 return;
56 }
57 node->next->prev = node->prev;
58 node->prev->next = node->next;
59 node->next = NULL;
60 node->prev = NULL;
61 }
62
ListIsEmpty(const List * head)63 static inline uint8_t ListIsEmpty(const List *head)
64 {
65 return (head == head->next);
66 }
67
ListGetFront(List * head)68 static inline List *ListGetFront(List *head)
69 {
70 return head->next;
71 }
72
ListPopFront(List * head)73 static inline List *ListPopFront(List *head)
74 {
75 List *element = NULL;
76 if (head == NULL || ListIsEmpty(head)) {
77 return NULL;
78 }
79
80 element = head->next;
81 ListRemoveNode(element);
82 return element;
83 }
84
ListInsertNewHead(List * prevHead,List * newHead)85 static inline void ListInsertNewHead(List *prevHead, List *newHead)
86 {
87 prevHead->prev->next = newHead->next;
88 newHead->next->prev = prevHead->prev;
89 newHead->prev->next = prevHead;
90 prevHead->prev = newHead->prev;
91 }
92
ListMove(List * from,List * to)93 static inline void ListMove(List *from, List *to)
94 {
95 List *first = from->next;
96 List *last = from->prev;
97
98 to->next = first;
99 to->prev = last;
100 first->prev = to;
101 last->next = to;
102 ListInitHead(from);
103 }
104
105 #define LIST_FOR_EACH(curr, head) \
106 for ((curr) = (head)->next; (curr) != (head); (curr) = (curr)->next)
107
108 #define LIST_FOR_EACH_SAFE(pos, tmp, head) \
109 for ((pos) = (head)->next, (tmp) = (pos)->next; (pos) != (head); \
110 (pos) = (tmp), (tmp) = (pos)->next)
111
112 #ifdef __cplusplus
113 }
114 #endif
115
116 #endif // NSTACKX_LIST_H
117