router: get routing group from classmap
[staging/agl-audio-plugin.git] / list.h
1 #ifndef paagllist
2 #define paagllist
3
4 #define AGL_DLIST_INIT(self)                                            \
5     do {                                                                \
6         (&(self))->prev = &(self);                                      \
7         (&(self))->next = &(self);                                      \
8     } while(0)
9
10 #define AGL_OFFSET(structure, member)                                    \
11     ((int)((char *)((&((structure *)0)->member)) - (char *)0))
12
13 #define AGL_LIST_RELOCATE(structure, member, ptr)                       \
14     ((structure *)(void *)((char *)ptr - AGL_OFFSET(structure, member)))
15
16 #define AGL_DLIST_FOR_EACH(structure, member, pos, head)                \
17     for (pos = AGL_LIST_RELOCATE(structure, member, (head)->next);      \
18          &pos->member != (head);                                        \
19          pos = AGL_LIST_RELOCATE(structure, member, pos->member.next))
20
21 #define AGL_DLIST_FOR_EACH_SAFE(structure, member, pos, n, head)        \
22     for (pos = AGL_LIST_RELOCATE(structure, member, (head)->next),      \
23            n = AGL_LIST_RELOCATE(structure, member, pos->member.next);  \
24          &pos->member != (head);                                        \
25          pos = n,                                                       \
26            n = AGL_LIST_RELOCATE(structure, member, pos->member.next))
27
28 #define AGL_DLIST_FOR_EACH_BACKWARDS(structure, member, pos, head)       \
29     for (pos = AGL_LIST_RELOCATE(structure, member, (head)->prev);      \
30          &pos->member != (head);                                        \
31          pos = AGL_LIST_RELOCATE(structure, member, pos->member.prev))
32
33 #define AGL_DLIST_UNLINK(structure, member, elem)                       \
34     do {                                                                \
35         agl_dlist *after  = (elem)->member.prev;                        \
36         agl_dlist *before = (elem)->member.next;                        \
37         after->next = before;                                           \
38         before->prev = after;                                           \
39         (elem)->member.prev = (elem)->member.next = &(elem)->member;    \
40     } while(0)
41
42
43 typedef struct agl_dlist {
44         struct agl_dlist *prev;
45         struct agl_dlist *next;
46 } agl_dlist;
47
48 #endif