1 /* Copyright (c) 2013, Ben Noordhuis <info@bnoordhuis.nl>
3 * Permission to use, copy, modify, and/or distribute this software for any
4 * purpose with or without fee is hereby granted, provided that the above
5 * copyright notice and this permission notice appear in all copies.
7 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
10 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
12 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
13 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 typedef void *QUEUE[2];
22 #define QUEUE_NEXT(q) (*(QUEUE **) &((*(q))[0]))
23 #define QUEUE_PREV(q) (*(QUEUE **) &((*(q))[1]))
24 #define QUEUE_PREV_NEXT(q) (QUEUE_NEXT(QUEUE_PREV(q)))
25 #define QUEUE_NEXT_PREV(q) (QUEUE_PREV(QUEUE_NEXT(q)))
28 #define QUEUE_DATA(ptr, type, field) \
29 ((type *) ((char *) (ptr) - ((char *) &((type *) 0)->field)))
31 #define QUEUE_FOREACH(q, h) \
32 for ((q) = QUEUE_NEXT(h); (q) != (h); (q) = QUEUE_NEXT(q))
34 #define QUEUE_EMPTY(q) \
35 ((const QUEUE *) (q) == (const QUEUE *) QUEUE_NEXT(q))
37 #define QUEUE_HEAD(q) \
40 #define QUEUE_INIT(q) \
42 QUEUE_NEXT(q) = (q); \
43 QUEUE_PREV(q) = (q); \
47 #define QUEUE_ADD(h, n) \
49 QUEUE_PREV_NEXT(h) = QUEUE_NEXT(n); \
50 QUEUE_NEXT_PREV(n) = QUEUE_PREV(h); \
51 QUEUE_PREV(h) = QUEUE_PREV(n); \
52 QUEUE_PREV_NEXT(h) = (h); \
56 #define QUEUE_SPLIT(h, q, n) \
58 QUEUE_PREV(n) = QUEUE_PREV(h); \
59 QUEUE_PREV_NEXT(n) = (n); \
60 QUEUE_NEXT(n) = (q); \
61 QUEUE_PREV(h) = QUEUE_PREV(q); \
62 QUEUE_PREV_NEXT(h) = (h); \
63 QUEUE_PREV(q) = (n); \
67 #define QUEUE_INSERT_HEAD(h, q) \
69 QUEUE_NEXT(q) = QUEUE_NEXT(h); \
70 QUEUE_PREV(q) = (h); \
71 QUEUE_NEXT_PREV(q) = (q); \
72 QUEUE_NEXT(h) = (q); \
76 #define QUEUE_INSERT_TAIL(h, q) \
78 QUEUE_NEXT(q) = (h); \
79 QUEUE_PREV(q) = QUEUE_PREV(h); \
80 QUEUE_PREV_NEXT(q) = (q); \
81 QUEUE_PREV(h) = (q); \
85 #define QUEUE_REMOVE(q) \
87 QUEUE_PREV_NEXT(q) = QUEUE_NEXT(q); \
88 QUEUE_NEXT_PREV(q) = QUEUE_PREV(q); \
92 #endif /* SRC_QUEUE_H_ */