1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2 
3 #include "list.h"
4 #include "util.h"
5 
main(int argc,const char * argv[])6 int main(int argc, const char *argv[]) {
7         size_t i;
8         typedef struct list_item {
9                 LIST_FIELDS(struct list_item, item);
10         } list_item;
11         LIST_HEAD(list_item, head);
12         LIST_HEAD(list_item, head2);
13         list_item items[4];
14 
15         LIST_HEAD_INIT(head);
16         LIST_HEAD_INIT(head2);
17         assert_se(head == NULL);
18         assert_se(head2 == NULL);
19 
20         for (i = 0; i < ELEMENTSOF(items); i++) {
21                 LIST_INIT(item, &items[i]);
22                 assert_se(LIST_JUST_US(item, &items[i]));
23                 LIST_PREPEND(item, head, &items[i]);
24         }
25 
26         i = 0;
27         LIST_FOREACH_OTHERS(item, cursor, &items[2]) {
28                 i++;
29                 assert_se(cursor != &items[2]);
30         }
31         assert_se(i == ELEMENTSOF(items)-1);
32 
33         i = 0;
34         LIST_FOREACH_OTHERS(item, cursor, &items[0]) {
35                 i++;
36                 assert_se(cursor != &items[0]);
37         }
38         assert_se(i == ELEMENTSOF(items)-1);
39 
40         i = 0;
41         LIST_FOREACH_OTHERS(item, cursor, &items[3]) {
42                 i++;
43                 assert_se(cursor != &items[3]);
44         }
45         assert_se(i == ELEMENTSOF(items)-1);
46 
47         assert_se(!LIST_JUST_US(item, head));
48 
49         assert_se(items[0].item_next == NULL);
50         assert_se(items[1].item_next == &items[0]);
51         assert_se(items[2].item_next == &items[1]);
52         assert_se(items[3].item_next == &items[2]);
53 
54         assert_se(items[0].item_prev == &items[1]);
55         assert_se(items[1].item_prev == &items[2]);
56         assert_se(items[2].item_prev == &items[3]);
57         assert_se(items[3].item_prev == NULL);
58 
59         list_item *cursor;
60         LIST_FIND_HEAD(item, &items[0], cursor);
61         assert_se(cursor == &items[3]);
62 
63         LIST_FIND_TAIL(item, &items[3], cursor);
64         assert_se(cursor == &items[0]);
65 
66         LIST_REMOVE(item, head, &items[1]);
67         assert_se(LIST_JUST_US(item, &items[1]));
68 
69         assert_se(items[0].item_next == NULL);
70         assert_se(items[2].item_next == &items[0]);
71         assert_se(items[3].item_next == &items[2]);
72 
73         assert_se(items[0].item_prev == &items[2]);
74         assert_se(items[2].item_prev == &items[3]);
75         assert_se(items[3].item_prev == NULL);
76 
77         LIST_INSERT_AFTER(item, head, &items[3], &items[1]);
78         assert_se(items[0].item_next == NULL);
79         assert_se(items[2].item_next == &items[0]);
80         assert_se(items[1].item_next == &items[2]);
81         assert_se(items[3].item_next == &items[1]);
82 
83         assert_se(items[0].item_prev == &items[2]);
84         assert_se(items[2].item_prev == &items[1]);
85         assert_se(items[1].item_prev == &items[3]);
86         assert_se(items[3].item_prev == NULL);
87 
88         LIST_REMOVE(item, head, &items[1]);
89         assert_se(LIST_JUST_US(item, &items[1]));
90 
91         assert_se(items[0].item_next == NULL);
92         assert_se(items[2].item_next == &items[0]);
93         assert_se(items[3].item_next == &items[2]);
94 
95         assert_se(items[0].item_prev == &items[2]);
96         assert_se(items[2].item_prev == &items[3]);
97         assert_se(items[3].item_prev == NULL);
98 
99         LIST_INSERT_BEFORE(item, head, &items[2], &items[1]);
100         assert_se(items[0].item_next == NULL);
101         assert_se(items[2].item_next == &items[0]);
102         assert_se(items[1].item_next == &items[2]);
103         assert_se(items[3].item_next == &items[1]);
104 
105         assert_se(items[0].item_prev == &items[2]);
106         assert_se(items[2].item_prev == &items[1]);
107         assert_se(items[1].item_prev == &items[3]);
108         assert_se(items[3].item_prev == NULL);
109 
110         LIST_REMOVE(item, head, &items[0]);
111         assert_se(LIST_JUST_US(item, &items[0]));
112 
113         assert_se(items[2].item_next == NULL);
114         assert_se(items[1].item_next == &items[2]);
115         assert_se(items[3].item_next == &items[1]);
116 
117         assert_se(items[2].item_prev == &items[1]);
118         assert_se(items[1].item_prev == &items[3]);
119         assert_se(items[3].item_prev == NULL);
120 
121         LIST_INSERT_BEFORE(item, head, &items[3], &items[0]);
122         assert_se(items[2].item_next == NULL);
123         assert_se(items[1].item_next == &items[2]);
124         assert_se(items[3].item_next == &items[1]);
125         assert_se(items[0].item_next == &items[3]);
126 
127         assert_se(items[2].item_prev == &items[1]);
128         assert_se(items[1].item_prev == &items[3]);
129         assert_se(items[3].item_prev == &items[0]);
130         assert_se(items[0].item_prev == NULL);
131         assert_se(head == &items[0]);
132 
133         LIST_REMOVE(item, head, &items[0]);
134         assert_se(LIST_JUST_US(item, &items[0]));
135 
136         assert_se(items[2].item_next == NULL);
137         assert_se(items[1].item_next == &items[2]);
138         assert_se(items[3].item_next == &items[1]);
139 
140         assert_se(items[2].item_prev == &items[1]);
141         assert_se(items[1].item_prev == &items[3]);
142         assert_se(items[3].item_prev == NULL);
143 
144         LIST_INSERT_BEFORE(item, head, NULL, &items[0]);
145         assert_se(items[0].item_next == NULL);
146         assert_se(items[2].item_next == &items[0]);
147         assert_se(items[1].item_next == &items[2]);
148         assert_se(items[3].item_next == &items[1]);
149 
150         assert_se(items[0].item_prev == &items[2]);
151         assert_se(items[2].item_prev == &items[1]);
152         assert_se(items[1].item_prev == &items[3]);
153         assert_se(items[3].item_prev == NULL);
154 
155         LIST_REMOVE(item, head, &items[0]);
156         assert_se(LIST_JUST_US(item, &items[0]));
157 
158         assert_se(items[2].item_next == NULL);
159         assert_se(items[1].item_next == &items[2]);
160         assert_se(items[3].item_next == &items[1]);
161 
162         assert_se(items[2].item_prev == &items[1]);
163         assert_se(items[1].item_prev == &items[3]);
164         assert_se(items[3].item_prev == NULL);
165 
166         LIST_REMOVE(item, head, &items[1]);
167         assert_se(LIST_JUST_US(item, &items[1]));
168 
169         assert_se(items[2].item_next == NULL);
170         assert_se(items[3].item_next == &items[2]);
171 
172         assert_se(items[2].item_prev == &items[3]);
173         assert_se(items[3].item_prev == NULL);
174 
175         LIST_REMOVE(item, head, &items[2]);
176         assert_se(LIST_JUST_US(item, &items[2]));
177         assert_se(LIST_JUST_US(item, head));
178 
179         LIST_REMOVE(item, head, &items[3]);
180         assert_se(LIST_JUST_US(item, &items[3]));
181 
182         assert_se(head == NULL);
183 
184         for (i = 0; i < ELEMENTSOF(items); i++) {
185                 assert_se(LIST_JUST_US(item, &items[i]));
186                 LIST_APPEND(item, head, &items[i]);
187         }
188 
189         assert_se(!LIST_JUST_US(item, head));
190 
191         assert_se(items[0].item_next == &items[1]);
192         assert_se(items[1].item_next == &items[2]);
193         assert_se(items[2].item_next == &items[3]);
194         assert_se(items[3].item_next == NULL);
195 
196         assert_se(items[0].item_prev == NULL);
197         assert_se(items[1].item_prev == &items[0]);
198         assert_se(items[2].item_prev == &items[1]);
199         assert_se(items[3].item_prev == &items[2]);
200 
201         for (i = 0; i < ELEMENTSOF(items); i++)
202                 LIST_REMOVE(item, head, &items[i]);
203 
204         assert_se(head == NULL);
205 
206         for (i = 0; i < ELEMENTSOF(items) / 2; i++) {
207                 LIST_INIT(item, &items[i]);
208                 assert_se(LIST_JUST_US(item, &items[i]));
209                 LIST_PREPEND(item, head, &items[i]);
210         }
211 
212         for (i = ELEMENTSOF(items) / 2; i < ELEMENTSOF(items); i++) {
213                 LIST_INIT(item, &items[i]);
214                 assert_se(LIST_JUST_US(item, &items[i]));
215                 LIST_PREPEND(item, head2, &items[i]);
216         }
217 
218         assert_se(items[0].item_next == NULL);
219         assert_se(items[1].item_next == &items[0]);
220         assert_se(items[2].item_next == NULL);
221         assert_se(items[3].item_next == &items[2]);
222 
223         assert_se(items[0].item_prev == &items[1]);
224         assert_se(items[1].item_prev == NULL);
225         assert_se(items[2].item_prev == &items[3]);
226         assert_se(items[3].item_prev == NULL);
227 
228         LIST_JOIN(item, head2, head);
229         assert_se(head == NULL);
230 
231         assert_se(items[0].item_next == NULL);
232         assert_se(items[1].item_next == &items[0]);
233         assert_se(items[2].item_next == &items[1]);
234         assert_se(items[3].item_next == &items[2]);
235 
236         assert_se(items[0].item_prev == &items[1]);
237         assert_se(items[1].item_prev == &items[2]);
238         assert_se(items[2].item_prev == &items[3]);
239         assert_se(items[3].item_prev == NULL);
240 
241         LIST_JOIN(item, head, head2);
242         assert_se(head2 == NULL);
243         assert_se(!LIST_IS_EMPTY(head));
244 
245         for (i = 0; i < ELEMENTSOF(items); i++)
246                 LIST_REMOVE(item, head, &items[i]);
247 
248         assert_se(head == NULL);
249 
250         LIST_PREPEND(item, head, items + 0);
251         LIST_PREPEND(item, head, items + 1);
252         LIST_PREPEND(item, head, items + 2);
253 
254         assert_se(LIST_POP(item, head) == items + 2);
255         assert_se(LIST_POP(item, head) == items + 1);
256         assert_se(LIST_POP(item, head) == items + 0);
257         assert_se(LIST_POP(item, head) == NULL);
258 
259         return 0;
260 }
261