1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 Copyright 2013 Jan Janssen
9 int main(int argc, const char *argv[]) {
11 typedef struct list_item {
12 LIST_FIELDS(struct list_item, item);
14 LIST_HEAD(list_item, head);
19 assert_se(head == NULL);
21 for (i = 0; i < ELEMENTSOF(items); i++) {
22 LIST_INIT(item, &items[i]);
23 assert_se(LIST_JUST_US(item, &items[i]));
24 LIST_PREPEND(item, head, &items[i]);
28 LIST_FOREACH_OTHERS(item, cursor, &items[2]) {
30 assert_se(cursor != &items[2]);
32 assert_se(i == ELEMENTSOF(items)-1);
35 LIST_FOREACH_OTHERS(item, cursor, &items[0]) {
37 assert_se(cursor != &items[0]);
39 assert_se(i == ELEMENTSOF(items)-1);
42 LIST_FOREACH_OTHERS(item, cursor, &items[3]) {
44 assert_se(cursor != &items[3]);
46 assert_se(i == ELEMENTSOF(items)-1);
48 assert_se(!LIST_JUST_US(item, head));
50 assert_se(items[0].item_next == NULL);
51 assert_se(items[1].item_next == &items[0]);
52 assert_se(items[2].item_next == &items[1]);
53 assert_se(items[3].item_next == &items[2]);
55 assert_se(items[0].item_prev == &items[1]);
56 assert_se(items[1].item_prev == &items[2]);
57 assert_se(items[2].item_prev == &items[3]);
58 assert_se(items[3].item_prev == NULL);
60 LIST_FIND_HEAD(item, &items[0], cursor);
61 assert_se(cursor == &items[3]);
63 LIST_FIND_TAIL(item, &items[3], cursor);
64 assert_se(cursor == &items[0]);
66 LIST_REMOVE(item, head, &items[1]);
67 assert_se(LIST_JUST_US(item, &items[1]));
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]);
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);
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]);
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);
88 LIST_REMOVE(item, head, &items[1]);
89 assert_se(LIST_JUST_US(item, &items[1]));
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]);
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);
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]);
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);
110 LIST_REMOVE(item, head, &items[0]);
111 assert_se(LIST_JUST_US(item, &items[0]));
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]);
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);
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]);
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]);
133 LIST_REMOVE(item, head, &items[0]);
134 assert_se(LIST_JUST_US(item, &items[0]));
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]);
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);
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]);
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);
155 LIST_REMOVE(item, head, &items[0]);
156 assert_se(LIST_JUST_US(item, &items[0]));
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]);
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);
166 LIST_REMOVE(item, head, &items[1]);
167 assert_se(LIST_JUST_US(item, &items[1]));
169 assert_se(items[2].item_next == NULL);
170 assert_se(items[3].item_next == &items[2]);
172 assert_se(items[2].item_prev == &items[3]);
173 assert_se(items[3].item_prev == NULL);
175 LIST_REMOVE(item, head, &items[2]);
176 assert_se(LIST_JUST_US(item, &items[2]));
177 assert_se(LIST_JUST_US(item, head));
179 LIST_REMOVE(item, head, &items[3]);
180 assert_se(LIST_JUST_US(item, &items[3]));
182 assert_se(head == NULL);
184 for (i = 0; i < ELEMENTSOF(items); i++) {
185 assert_se(LIST_JUST_US(item, &items[i]));
186 LIST_APPEND(item, head, &items[i]);
189 assert_se(!LIST_JUST_US(item, head));
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);
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]);
201 for (i = 0; i < ELEMENTSOF(items); i++)
202 LIST_REMOVE(item, head, &items[i]);
204 assert_se(head == NULL);