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) \
39 *((first)->field.tqe_prev) = (second); \
40 (second)->field.tqe_prev = (first)->field.tqe_prev; \
41 (first)->field.tqe_prev = &((second)->field.tqe_next); \
42 (first)->field.tqe_next = (second)->field.tqe_next; \
43 if ((second)->field.tqe_next) \
44 (second)->field.tqe_next->field.tqe_prev = &((first)->field.tqe_next); \
45 (second)->field.tqe_next = first; \
46 if ((head)->tqh_last == &((second)->field.tqe_next)) \
47 (head)->tqh_last = &((first)->field.tqe_next); \
50 void _TAILQ_SWAP(struct obj *first, struct obj *second, struct objhead *head) {
51 struct obj **tqe_prev = first->entry.tqe_prev;
54 second->entry.tqe_prev = first->entry.tqe_prev;
56 first->entry.tqe_prev = &(second->entry.tqe_next);
58 first->entry.tqe_next = second->entry.tqe_next;
60 if (second->entry.tqe_next) {
61 struct obj *tqe_next = second->entry.tqe_next;
62 tqe_next->entry.tqe_prev = &(first->entry.tqe_next);
65 second->entry.tqe_next = first;
67 if (head->tqh_last == &(second->entry.tqe_next))
68 head->tqh_last = &(first->entry.tqe_next);
92 * ************************************************
94 printf("swapping first two elements:\n");
96 TAILQ_INSERT_TAIL(&head, &first, entry);
97 TAILQ_INSERT_TAIL(&head, &second, entry);
98 TAILQ_INSERT_TAIL(&head, &third, entry);
102 TAILQ_SWAP(&first, &second, &head, entry);
107 * ************************************************
109 printf("swapping last two elements:\n");
113 TAILQ_INSERT_TAIL(&head, &first, entry);
114 TAILQ_INSERT_TAIL(&head, &second, entry);
115 TAILQ_INSERT_TAIL(&head, &third, entry);
119 TAILQ_SWAP(&second, &third, &head, entry);
124 * ************************************************
126 printf("longer list:\n");
130 TAILQ_INSERT_TAIL(&head, &first, entry);
131 TAILQ_INSERT_TAIL(&head, &second, entry);
132 TAILQ_INSERT_TAIL(&head, &third, entry);
133 TAILQ_INSERT_TAIL(&head, &fourth, entry);
137 TAILQ_SWAP(&first, &second, &head, entry);
142 * ************************************************
144 printf("longer list 2:\n");
148 TAILQ_INSERT_TAIL(&head, &first, entry);
149 TAILQ_INSERT_TAIL(&head, &second, entry);
150 TAILQ_INSERT_TAIL(&head, &third, entry);
151 TAILQ_INSERT_TAIL(&head, &fourth, entry);
155 TAILQ_SWAP(&second, &third, &head, entry);
160 * ************************************************
162 printf("longer list, swap, then insert:\n");
166 TAILQ_INSERT_TAIL(&head, &first, entry);
167 TAILQ_INSERT_TAIL(&head, &second, entry);
168 TAILQ_INSERT_TAIL(&head, &third, entry);
169 TAILQ_INSERT_TAIL(&head, &fourth, entry);
173 TAILQ_SWAP(&second, &third, &head, entry);
177 TAILQ_INSERT_AFTER(&head, &third, &fifth, entry);
182 * ************************************************
184 printf("longer list, swap, then append:\n");
188 TAILQ_INSERT_TAIL(&head, &first, entry);
189 TAILQ_INSERT_TAIL(&head, &second, entry);
190 TAILQ_INSERT_TAIL(&head, &third, entry);
191 TAILQ_INSERT_TAIL(&head, &fourth, entry);
195 TAILQ_SWAP(&second, &third, &head, entry);
199 TAILQ_INSERT_TAIL(&head, &fifth, entry);
204 * ************************************************
206 printf("longer list, swap, then remove:\n");
210 TAILQ_INSERT_TAIL(&head, &first, entry);
211 TAILQ_INSERT_TAIL(&head, &second, entry);
212 TAILQ_INSERT_TAIL(&head, &third, entry);
213 TAILQ_INSERT_TAIL(&head, &fourth, entry);
217 TAILQ_SWAP(&second, &third, &head, entry);
221 TAILQ_REMOVE(&head, &second, entry);