]> git.sur5r.net Git - i3/i3/blob - tests/swap.c
format **/*.c with clang-format-3.5
[i3/i3] / tests / swap.c
1 /*
2  * vim:ts=4:sw=4:expandtab
3  */
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <string.h>
7 #include <unistd.h>
8 #include <stdbool.h>
9 #include <stdint.h>
10
11 #include "queue.h"
12
13 struct obj {
14     int abc;
15     TAILQ_ENTRY(obj) entry;
16 };
17
18 TAILQ_HEAD(objhead, obj) head;
19
20 void dump() {
21     struct obj *e;
22     printf("dump:\n");
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);
29     }
30     printf("again, but reverse:\n");
31     TAILQ_FOREACH_REVERSE (e, &head, objhead, entry) {
32         printf("  %d\n", e->abc);
33     }
34     printf("done\n\n");
35 }
36
37 #define TAILQ_SWAP(first, second, head, field)                                     \
38     do {                                                                           \
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);                         \
48     } while (0)
49
50 void _TAILQ_SWAP(struct obj *first, struct obj *second, struct objhead *head) {
51     struct obj **tqe_prev = first->entry.tqe_prev;
52     *tqe_prev = second;
53
54     second->entry.tqe_prev = first->entry.tqe_prev;
55
56     first->entry.tqe_prev = &(second->entry.tqe_next);
57
58     first->entry.tqe_next = second->entry.tqe_next;
59
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);
63     }
64
65     second->entry.tqe_next = first;
66
67     if (head->tqh_last == &(second->entry.tqe_next))
68         head->tqh_last = &(first->entry.tqe_next);
69 }
70
71 int main() {
72     printf("hello\n");
73
74     TAILQ_INIT(&head);
75
76     struct obj first;
77     first.abc = 123;
78
79     struct obj second;
80     second.abc = 456;
81
82     struct obj third;
83     third.abc = 789;
84
85     struct obj fourth;
86     fourth.abc = 999;
87
88     struct obj fifth;
89     fifth.abc = 5555;
90
91     /*
92      * ************************************************
93      */
94     printf("swapping first two elements:\n");
95
96     TAILQ_INSERT_TAIL(&head, &first, entry);
97     TAILQ_INSERT_TAIL(&head, &second, entry);
98     TAILQ_INSERT_TAIL(&head, &third, entry);
99
100     dump();
101
102     TAILQ_SWAP(&first, &second, &head, entry);
103
104     dump();
105
106     /*
107      * ************************************************
108      */
109     printf("swapping last two elements:\n");
110
111     TAILQ_INIT(&head);
112
113     TAILQ_INSERT_TAIL(&head, &first, entry);
114     TAILQ_INSERT_TAIL(&head, &second, entry);
115     TAILQ_INSERT_TAIL(&head, &third, entry);
116
117     dump();
118
119     TAILQ_SWAP(&second, &third, &head, entry);
120
121     dump();
122
123     /*
124      * ************************************************
125      */
126     printf("longer list:\n");
127
128     TAILQ_INIT(&head);
129
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);
134
135     dump();
136
137     TAILQ_SWAP(&first, &second, &head, entry);
138
139     dump();
140
141     /*
142      * ************************************************
143      */
144     printf("longer list 2:\n");
145
146     TAILQ_INIT(&head);
147
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);
152
153     dump();
154
155     TAILQ_SWAP(&second, &third, &head, entry);
156
157     dump();
158
159     /*
160      * ************************************************
161      */
162     printf("longer list, swap, then insert:\n");
163
164     TAILQ_INIT(&head);
165
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);
170
171     dump();
172
173     TAILQ_SWAP(&second, &third, &head, entry);
174
175     dump();
176
177     TAILQ_INSERT_AFTER(&head, &third, &fifth, entry);
178
179     dump();
180
181     /*
182      * ************************************************
183      */
184     printf("longer list, swap, then append:\n");
185
186     TAILQ_INIT(&head);
187
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);
192
193     dump();
194
195     TAILQ_SWAP(&second, &third, &head, entry);
196
197     dump();
198
199     TAILQ_INSERT_TAIL(&head, &fifth, entry);
200
201     dump();
202
203     /*
204      * ************************************************
205      */
206     printf("longer list, swap, then remove:\n");
207
208     TAILQ_INIT(&head);
209
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);
214
215     dump();
216
217     TAILQ_SWAP(&second, &third, &head, entry);
218
219     dump();
220
221     TAILQ_REMOVE(&head, &second, entry);
222
223     dump();
224 }