Merge branch 'genivi-mir' of github.com:otcshare/policy-misc into genivi-mir
[profile/ivi/pulseaudio-module-murphy-ivi.git] / murphy / list.h
1 #ifndef foomirlistfoo
2 #define foomirlistfoo
3
4 #define MIR_DIM(a)  (sizeof(a)/sizeof((a)[0]))
5
6 #define MIR_OFFSET(structure, member)                                   \
7     ((int)((void *)((&((structure *)0)->member)) - (void *)0))
8
9 #define MIR_LIST_RELOCATE(structure, member, ptr)                       \
10     ((structure *)((void *)ptr - MIR_OFFSET(structure, member)))
11
12
13 #define MIR_DLIST_HEAD(name)   mir_dlist name = { &(name), &(name) }
14
15 #define MIR_DLIST_INIT(self)                                            \
16     do {                                                                \
17         (&(self))->prev = &(self);                                      \
18         (&(self))->next = &(self);                                      \
19     } while(0)
20
21 #define MIR_DLIST_EMPTY(name)  ((&(name))->next == &(name))
22
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))
27
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);                                        \
32          pos = n,                                                       \
33            n = MIR_LIST_RELOCATE(structure, member, pos->member.next))
34
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))
39
40 #define MIR_DLIST_FOR_EACH_NOHEAD(structure, member, pos, start)        \
41     for (pos = start;                                                   \
42          &(pos)->member != &(start)->member;                            \
43          pos = MIR_LIST_RELOCATE(structure, member, pos->member.next))
44
45 #define MIR_DLIST_FOR_EACH_NOHEAD_SAFE(structure, member, pos,n, start) \
46     for (pos = start,                                                   \
47            n = MIR_LIST_RELOCATE(structure, member, pos->member.next);  \
48          &pos->member != &(start)->member;                              \
49          pos = n,                                                       \
50            n = MIR_LIST_RELOCATE(structure, member, pos->member.next))
51
52 #define MIR_DLIST_INSERT_BEFORE(structure, member, new, before)         \
53     do {                                                                \
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;                                     \
59     } while(0)
60 #define MIR_DLIST_APPEND(structure, member, new, head)                  \
61     MIR_DLIST_INSERT_BEFORE(structure, member, new, head)
62
63 #define MIR_DLIST_INSERT_AFTER(structure, member, new, after)           \
64     do {                                                                \
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;                                     \
70     } while(0)
71 #define MIR_DLIST_PREPEND(structure, member, new, head)                 \
72     MIR_DLIST_INSERT_AFTER(structure, member, new, head)
73
74
75 #define MIR_DLIST_UNLINK(structure, member, elem)                       \
76     do {                                                                \
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;    \
82     } while(0)
83
84
85 typedef struct mir_dlist {
86     struct mir_dlist *prev;
87     struct mir_dlist *next;
88 } mir_dlist;
89
90 #endif /* foomirlistfoo */
91
92
93 /*
94  * Local Variables:
95  * c-basic-offset: 4
96  * indent-tabs-mode: nil
97  * End:
98  *
99  */