2 * vim:ts=4:sw=4:expandtab
15 TAILQ_ENTRY(obj) entry;
18 TAILQ_HEAD(objhead, obj) head;
23 e = TAILQ_FIRST(&head);
24 printf("first: %d\n", e->abc);
25 e = TAILQ_LAST(&head, objhead);
26 printf("last: %d\n", e->abc);
27 TAILQ_FOREACH(e, &head, entry) {
28 printf(" %d\n", e->abc);
30 printf("again, but reverse:\n");
31 TAILQ_FOREACH_REVERSE(e, &head, objhead, entry) {
32 printf(" %d\n", e->abc);
37 #define TAILQ_SWAP(first, second, head, field) do { \
38 *((first)->field.tqe_prev) = (second); \
39 (second)->field.tqe_prev = (first)->field.tqe_prev; \
40 (first)->field.tqe_prev = &((second)->field.tqe_next); \
41 (first)->field.tqe_next = (second)->field.tqe_next; \
42 if ((second)->field.tqe_next) \
43 (second)->field.tqe_next->field.tqe_prev = &((first)->field.tqe_next); \
44 (second)->field.tqe_next = first; \
45 if ((head)->tqh_last == &((second)->field.tqe_next)) \
46 (head)->tqh_last = &((first)->field.tqe_next); \
49 void _TAILQ_SWAP(struct obj *first, struct obj *second, struct objhead *head) {
50 struct obj **tqe_prev = first->entry.tqe_prev;
53 second->entry.tqe_prev = first->entry.tqe_prev;
55 first->entry.tqe_prev = &(second->entry.tqe_next);
57 first->entry.tqe_next = second->entry.tqe_next;
59 if (second->entry.tqe_next) {
60 struct obj *tqe_next = second->entry.tqe_next;
61 tqe_next->entry.tqe_prev = &(first->entry.tqe_next);
64 second->entry.tqe_next = first;
66 if (head->tqh_last == &(second->entry.tqe_next))
67 head->tqh_last = &(first->entry.tqe_next);
93 * ************************************************
95 printf("swapping first two elements:\n");
97 TAILQ_INSERT_TAIL(&head, &first, entry);
98 TAILQ_INSERT_TAIL(&head, &second, entry);
99 TAILQ_INSERT_TAIL(&head, &third, entry);
103 TAILQ_SWAP(&first, &second, &head, entry);
108 * ************************************************
110 printf("swapping last two elements:\n");
114 TAILQ_INSERT_TAIL(&head, &first, entry);
115 TAILQ_INSERT_TAIL(&head, &second, entry);
116 TAILQ_INSERT_TAIL(&head, &third, entry);
120 TAILQ_SWAP(&second, &third, &head, entry);
125 * ************************************************
127 printf("longer list:\n");
131 TAILQ_INSERT_TAIL(&head, &first, entry);
132 TAILQ_INSERT_TAIL(&head, &second, entry);
133 TAILQ_INSERT_TAIL(&head, &third, entry);
134 TAILQ_INSERT_TAIL(&head, &fourth, entry);
138 TAILQ_SWAP(&first, &second, &head, entry);
143 * ************************************************
145 printf("longer list 2:\n");
149 TAILQ_INSERT_TAIL(&head, &first, entry);
150 TAILQ_INSERT_TAIL(&head, &second, entry);
151 TAILQ_INSERT_TAIL(&head, &third, entry);
152 TAILQ_INSERT_TAIL(&head, &fourth, entry);
156 TAILQ_SWAP(&second, &third, &head, entry);
162 * ************************************************
164 printf("longer list, swap, then insert:\n");
168 TAILQ_INSERT_TAIL(&head, &first, entry);
169 TAILQ_INSERT_TAIL(&head, &second, entry);
170 TAILQ_INSERT_TAIL(&head, &third, entry);
171 TAILQ_INSERT_TAIL(&head, &fourth, entry);
175 TAILQ_SWAP(&second, &third, &head, entry);
179 TAILQ_INSERT_AFTER(&head, &third, &fifth, entry);
185 * ************************************************
187 printf("longer list, swap, then append:\n");
191 TAILQ_INSERT_TAIL(&head, &first, entry);
192 TAILQ_INSERT_TAIL(&head, &second, entry);
193 TAILQ_INSERT_TAIL(&head, &third, entry);
194 TAILQ_INSERT_TAIL(&head, &fourth, entry);
198 TAILQ_SWAP(&second, &third, &head, entry);
202 TAILQ_INSERT_TAIL(&head, &fifth, entry);
208 * ************************************************
210 printf("longer list, swap, then remove:\n");
214 TAILQ_INSERT_TAIL(&head, &first, entry);
215 TAILQ_INSERT_TAIL(&head, &second, entry);
216 TAILQ_INSERT_TAIL(&head, &third, entry);
217 TAILQ_INSERT_TAIL(&head, &fourth, entry);
221 TAILQ_SWAP(&second, &third, &head, entry);
225 TAILQ_REMOVE(&head, &second, entry);