]> git.sur5r.net Git - i3/i3/blob - tests/swap.c
606b0f7175e3f1216512238d90d5c16d32722c6a
[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) 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); \
47 } while (0)
48
49 void _TAILQ_SWAP(struct obj *first, struct obj *second, struct objhead *head) {
50     struct obj **tqe_prev = first->entry.tqe_prev;
51     *tqe_prev = second;
52
53     second->entry.tqe_prev = first->entry.tqe_prev;
54
55     first->entry.tqe_prev = &(second->entry.tqe_next);
56
57     first->entry.tqe_next = second->entry.tqe_next;
58
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);
62     }
63
64     second->entry.tqe_next = first;
65
66     if (head->tqh_last == &(second->entry.tqe_next))
67         head->tqh_last = &(first->entry.tqe_next);
68
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
89     struct obj fifth;
90     fifth.abc = 5555;
91
92     /*
93      * ************************************************
94      */
95     printf("swapping first two elements:\n");
96
97     TAILQ_INSERT_TAIL(&head, &first, entry);
98     TAILQ_INSERT_TAIL(&head, &second, entry);
99     TAILQ_INSERT_TAIL(&head, &third, entry);
100
101     dump();
102
103     TAILQ_SWAP(&first, &second, &head, entry);
104
105     dump();
106
107     /*
108      * ************************************************
109      */
110     printf("swapping last two elements:\n");
111
112     TAILQ_INIT(&head);
113
114     TAILQ_INSERT_TAIL(&head, &first, entry);
115     TAILQ_INSERT_TAIL(&head, &second, entry);
116     TAILQ_INSERT_TAIL(&head, &third, entry);
117
118     dump();
119
120     TAILQ_SWAP(&second, &third, &head, entry);
121
122     dump();
123
124     /*
125      * ************************************************
126      */
127     printf("longer list:\n");
128
129     TAILQ_INIT(&head);
130
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);
135
136     dump();
137
138     TAILQ_SWAP(&first, &second, &head, entry);
139
140     dump();
141
142     /*
143      * ************************************************
144      */
145     printf("longer list 2:\n");
146
147     TAILQ_INIT(&head);
148
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);
153
154     dump();
155
156     TAILQ_SWAP(&second, &third, &head, entry);
157
158     dump();
159
160
161     /*
162      * ************************************************
163      */
164     printf("longer list, swap, then insert:\n");
165
166     TAILQ_INIT(&head);
167
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);
172
173     dump();
174
175     TAILQ_SWAP(&second, &third, &head, entry);
176
177     dump();
178
179     TAILQ_INSERT_AFTER(&head, &third, &fifth, entry);
180
181     dump();
182
183
184     /*
185      * ************************************************
186      */
187     printf("longer list, swap, then append:\n");
188
189     TAILQ_INIT(&head);
190
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);
195
196     dump();
197
198     TAILQ_SWAP(&second, &third, &head, entry);
199
200     dump();
201
202     TAILQ_INSERT_TAIL(&head, &fifth, entry);
203
204     dump();
205
206
207     /*
208      * ************************************************
209      */
210     printf("longer list, swap, then remove:\n");
211
212     TAILQ_INIT(&head);
213
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);
218
219     dump();
220
221     TAILQ_SWAP(&second, &third, &head, entry);
222
223     dump();
224
225     TAILQ_REMOVE(&head, &second, entry);
226
227     dump();
228
229 }