1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 This file is part of systemd
5 Copyright 2013 Jan Janssen
11 int main(int argc, const char *argv[]) {
13 typedef struct list_item {
14 LIST_FIELDS(struct list_item, item);
16 LIST_HEAD(list_item, head);
21 assert_se(head == NULL);
23 for (i = 0; i < ELEMENTSOF(items); i++) {
24 LIST_INIT(item, &items[i]);
25 assert_se(LIST_JUST_US(item, &items[i]));
26 LIST_PREPEND(item, head, &items[i]);
30 LIST_FOREACH_OTHERS(item, cursor, &items[2]) {
32 assert_se(cursor != &items[2]);
34 assert_se(i == ELEMENTSOF(items)-1);
37 LIST_FOREACH_OTHERS(item, cursor, &items[0]) {
39 assert_se(cursor != &items[0]);
41 assert_se(i == ELEMENTSOF(items)-1);
44 LIST_FOREACH_OTHERS(item, cursor, &items[3]) {
46 assert_se(cursor != &items[3]);
48 assert_se(i == ELEMENTSOF(items)-1);
50 assert_se(!LIST_JUST_US(item, head));
52 assert_se(items[0].item_next == NULL);
53 assert_se(items[1].item_next == &items[0]);
54 assert_se(items[2].item_next == &items[1]);
55 assert_se(items[3].item_next == &items[2]);
57 assert_se(items[0].item_prev == &items[1]);
58 assert_se(items[1].item_prev == &items[2]);
59 assert_se(items[2].item_prev == &items[3]);
60 assert_se(items[3].item_prev == NULL);
62 LIST_FIND_HEAD(item, &items[0], cursor);
63 assert_se(cursor == &items[3]);
65 LIST_FIND_TAIL(item, &items[3], cursor);
66 assert_se(cursor == &items[0]);
68 LIST_REMOVE(item, head, &items[1]);
69 assert_se(LIST_JUST_US(item, &items[1]));
71 assert_se(items[0].item_next == NULL);
72 assert_se(items[2].item_next == &items[0]);
73 assert_se(items[3].item_next == &items[2]);
75 assert_se(items[0].item_prev == &items[2]);
76 assert_se(items[2].item_prev == &items[3]);
77 assert_se(items[3].item_prev == NULL);
79 LIST_INSERT_AFTER(item, head, &items[3], &items[1]);
80 assert_se(items[0].item_next == NULL);
81 assert_se(items[2].item_next == &items[0]);
82 assert_se(items[1].item_next == &items[2]);
83 assert_se(items[3].item_next == &items[1]);
85 assert_se(items[0].item_prev == &items[2]);
86 assert_se(items[2].item_prev == &items[1]);
87 assert_se(items[1].item_prev == &items[3]);
88 assert_se(items[3].item_prev == NULL);
90 LIST_REMOVE(item, head, &items[1]);
91 assert_se(LIST_JUST_US(item, &items[1]));
93 assert_se(items[0].item_next == NULL);
94 assert_se(items[2].item_next == &items[0]);
95 assert_se(items[3].item_next == &items[2]);
97 assert_se(items[0].item_prev == &items[2]);
98 assert_se(items[2].item_prev == &items[3]);
99 assert_se(items[3].item_prev == NULL);
101 LIST_INSERT_BEFORE(item, head, &items[2], &items[1]);
102 assert_se(items[0].item_next == NULL);
103 assert_se(items[2].item_next == &items[0]);
104 assert_se(items[1].item_next == &items[2]);
105 assert_se(items[3].item_next == &items[1]);
107 assert_se(items[0].item_prev == &items[2]);
108 assert_se(items[2].item_prev == &items[1]);
109 assert_se(items[1].item_prev == &items[3]);
110 assert_se(items[3].item_prev == NULL);
112 LIST_REMOVE(item, head, &items[0]);
113 assert_se(LIST_JUST_US(item, &items[0]));
115 assert_se(items[2].item_next == NULL);
116 assert_se(items[1].item_next == &items[2]);
117 assert_se(items[3].item_next == &items[1]);
119 assert_se(items[2].item_prev == &items[1]);
120 assert_se(items[1].item_prev == &items[3]);
121 assert_se(items[3].item_prev == NULL);
123 LIST_INSERT_BEFORE(item, head, &items[3], &items[0]);
124 assert_se(items[2].item_next == NULL);
125 assert_se(items[1].item_next == &items[2]);
126 assert_se(items[3].item_next == &items[1]);
127 assert_se(items[0].item_next == &items[3]);
129 assert_se(items[2].item_prev == &items[1]);
130 assert_se(items[1].item_prev == &items[3]);
131 assert_se(items[3].item_prev == &items[0]);
132 assert_se(items[0].item_prev == NULL);
133 assert_se(head == &items[0]);
135 LIST_REMOVE(item, head, &items[0]);
136 assert_se(LIST_JUST_US(item, &items[0]));
138 assert_se(items[2].item_next == NULL);
139 assert_se(items[1].item_next == &items[2]);
140 assert_se(items[3].item_next == &items[1]);
142 assert_se(items[2].item_prev == &items[1]);
143 assert_se(items[1].item_prev == &items[3]);
144 assert_se(items[3].item_prev == NULL);
146 LIST_INSERT_BEFORE(item, head, NULL, &items[0]);
147 assert_se(items[0].item_next == NULL);
148 assert_se(items[2].item_next == &items[0]);
149 assert_se(items[1].item_next == &items[2]);
150 assert_se(items[3].item_next == &items[1]);
152 assert_se(items[0].item_prev == &items[2]);
153 assert_se(items[2].item_prev == &items[1]);
154 assert_se(items[1].item_prev == &items[3]);
155 assert_se(items[3].item_prev == NULL);
157 LIST_REMOVE(item, head, &items[0]);
158 assert_se(LIST_JUST_US(item, &items[0]));
160 assert_se(items[2].item_next == NULL);
161 assert_se(items[1].item_next == &items[2]);
162 assert_se(items[3].item_next == &items[1]);
164 assert_se(items[2].item_prev == &items[1]);
165 assert_se(items[1].item_prev == &items[3]);
166 assert_se(items[3].item_prev == NULL);
168 LIST_REMOVE(item, head, &items[1]);
169 assert_se(LIST_JUST_US(item, &items[1]));
171 assert_se(items[2].item_next == NULL);
172 assert_se(items[3].item_next == &items[2]);
174 assert_se(items[2].item_prev == &items[3]);
175 assert_se(items[3].item_prev == NULL);
177 LIST_REMOVE(item, head, &items[2]);
178 assert_se(LIST_JUST_US(item, &items[2]));
179 assert_se(LIST_JUST_US(item, head));
181 LIST_REMOVE(item, head, &items[3]);
182 assert_se(LIST_JUST_US(item, &items[3]));
184 assert_se(head == NULL);
186 for (i = 0; i < ELEMENTSOF(items); i++) {
187 assert_se(LIST_JUST_US(item, &items[i]));
188 LIST_APPEND(item, head, &items[i]);
191 assert_se(!LIST_JUST_US(item, head));
193 assert_se(items[0].item_next == &items[1]);
194 assert_se(items[1].item_next == &items[2]);
195 assert_se(items[2].item_next == &items[3]);
196 assert_se(items[3].item_next == NULL);
198 assert_se(items[0].item_prev == NULL);
199 assert_se(items[1].item_prev == &items[0]);
200 assert_se(items[2].item_prev == &items[1]);
201 assert_se(items[3].item_prev == &items[2]);
203 for (i = 0; i < ELEMENTSOF(items); i++)
204 LIST_REMOVE(item, head, &items[i]);
206 assert_se(head == NULL);