4 #define MIR_DIM(a) (sizeof(a)/sizeof((a)[0]))
6 #define MIR_OFFSET(structure, member) \
7 ((int)((void *)((&((structure *)0)->member)) - (void *)0))
9 #define MIR_LIST_RELOCATE(structure, member, ptr) \
10 ((structure *)((void *)ptr - MIR_OFFSET(structure, member)))
13 #define MIR_DLIST_HEAD(name) mir_dlist name = { &(name), &(name) }
15 #define MIR_DLIST_INIT(self) \
17 (&(self))->prev = &(self); \
18 (&(self))->next = &(self); \
21 #define MIR_DLIST_EMPTY(name) ((&(name))->next == &(name))
23 #define MIR_DLIST_FOR_EACH(structure, member, pos, head) \
24 for (pos = MIR_LIST_RELOCATE(structure, member, (head)->next); \
25 &pos->member != (head); \
26 pos = MIR_LIST_RELOCATE(structure, member, pos->member.next))
28 #define MIR_DLIST_FOR_EACH_SAFE(structure, member, pos, n, head) \
29 for (pos = MIR_LIST_RELOCATE(structure, member, (head)->next), \
30 n = MIR_LIST_RELOCATE(structure, member, pos->member.next); \
31 &pos->member != (head); \
33 n = MIR_LIST_RELOCATE(structure, member, pos->member.next))
35 #define MIR_DLIST_FOR_EACH_BACKWARD(structure, member, pos, head) \
36 for (pos = MIR_LIST_RELOCATE(structure, member, (head)->prev); \
37 &pos->member != (head); \
38 pos = MIR_LIST_RELOCATE(structure, member, pos->member.prev))
40 #define MIR_DLIST_FOR_EACH_NOHEAD(structure, member, pos, start) \
42 &(pos)->member != &(start)->member; \
43 pos = MIR_LIST_RELOCATE(structure, member, pos->member.next))
45 #define MIR_DLIST_FOR_EACH_NOHEAD_SAFE(structure, member, pos,n, start) \
47 n = MIR_LIST_RELOCATE(structure, member, pos->member.next); \
48 &pos->member != &(start)->member; \
50 n = MIR_LIST_RELOCATE(structure, member, pos->member.next))
52 #define MIR_DLIST_INSERT_BEFORE(structure, member, new, before) \
54 mir_dlist *after = (before)->prev; \
55 after->next = &(new)->member; \
56 (new)->member.next = before; \
57 (before)->prev = &(new)->member; \
58 (new)->member.prev = after; \
60 #define MIR_DLIST_APPEND(structure, member, new, head) \
61 MIR_DLIST_INSERT_BEFORE(structure, member, new, head)
63 #define MIR_DLIST_INSERT_AFTER(structure, member, new, after) \
65 mir_dlist *before = (after)->next; \
66 (after)->next = &((new)->member); \
67 (new)->member.next = before; \
68 before->prev = &((new)->member); \
69 (new)->member.prev = after; \
71 #define MIR_DLIST_PREPEND(structure, member, new, head) \
72 MIR_DLIST_INSERT_AFTER(structure, member, new, head)
75 #define MIR_DLIST_UNLINK(structure, member, elem) \
77 mir_dlist *after = (elem)->member.prev; \
78 mir_dlist *before = (elem)->member.next; \
79 after->next = before; \
80 before->prev = after; \
81 (elem)->member.prev = (elem)->member.next = &(elem)->member; \
85 typedef struct mir_dlist {
86 struct mir_dlist *prev;
87 struct mir_dlist *next;
90 #endif /* foomirlistfoo */
96 * indent-tabs-mode: nil