Marked struct (Node|MinNode|List|MinList) as __mayalias.
[AROS.git] / compiler / include / exec / lists.h
blob929ddecdcad24d43273693b4443db54ae2e673e5
1 #ifndef EXEC_LISTS_H
2 #define EXEC_LISTS_H
4 /*
5 Copyright © 1995-2011, The AROS Development Team. All rights reserved.
6 $Id$
8 Structures and macros for exec lists.
9 */
12 /**************************************
13 Includes
14 **************************************/
15 #ifndef EXEC_NODES_H
16 # include <exec/nodes.h>
17 #endif
20 /**************************************
21 Structures
22 **************************************/
23 /* Normal list */
24 struct List
26 struct Node * lh_Head,
27 * lh_Tail,
28 * lh_TailPred;
29 UBYTE lh_Type;
30 UBYTE l_pad;
31 } __mayalias;
33 /* Minimal list */
34 struct MinList
36 struct MinNode * mlh_Head,
37 * mlh_Tail,
38 * mlh_TailPred;
39 } __mayalias;
42 /**************************************
43 Macros
44 **************************************/
45 #define IsListEmpty(l) \
46 ( (((struct List *)l)->lh_TailPred) == (struct Node *)(l) )
48 #define IsMinListEmpty(l) \
49 ( (((struct MinList *)l)->mlh_TailPred) == (struct MinList *)(l) )
51 #define IsMsgPortEmpty(mp) \
52 ( (((struct MsgPort *)(mp))->mp_MsgList.lh_TailPred) \
53 == (struct Node *)(&(((struct MsgPort *)(mp))->mp_MsgList)) )
55 #define NEWLIST(_l) \
56 do \
57 { \
58 struct List *__aros_list_tmp = (struct List *)(_l), \
59 *l = __aros_list_tmp; \
61 l->lh_TailPred = (struct Node *)l; \
62 l->lh_Tail = 0; \
63 l->lh_Head = (struct Node *)&l->lh_Tail; \
64 } while (0)
66 #define ADDHEAD(_l,_n) \
67 do \
68 { \
69 struct Node *__aros_node_tmp = (struct Node *)(_n), \
70 *n = __aros_node_tmp; \
71 struct List *__aros_list_tmp = (struct List *)(_l), \
72 *l = __aros_list_tmp; \
74 n->ln_Succ = l->lh_Head; \
75 n->ln_Pred = (struct Node *)&l->lh_Head; \
76 l->lh_Head->ln_Pred = n; \
77 l->lh_Head = n; \
78 } while (0)
80 #define ADDTAIL(_l,_n) \
81 do \
82 { \
83 struct Node *__aros_node_tmp = (struct Node *)(_n), \
84 *n = __aros_node_tmp; \
85 struct List *__aros_list_tmp = (struct List *)(_l), \
86 *l = __aros_list_tmp; \
88 n->ln_Succ = (struct Node *)&l->lh_Tail; \
89 n->ln_Pred = l->lh_TailPred; \
90 l->lh_TailPred->ln_Succ = n; \
91 l->lh_TailPred = n; \
92 } while (0)
94 #define REMOVE(_n) \
95 ({ \
96 struct Node *__aros_node_tmp = (struct Node *)(_n), \
97 *n = __aros_node_tmp; \
99 n->ln_Pred->ln_Succ = n->ln_Succ; \
100 n->ln_Succ->ln_Pred = n->ln_Pred; \
102 n; \
105 #define GetHead(_l) \
106 ({ \
107 struct List *__aros_list_tmp = (struct List *)(_l), \
108 *l = __aros_list_tmp; \
110 l->lh_Head->ln_Succ ? l->lh_Head : (struct Node *)0; \
113 #define GetTail(_l) \
114 ({ \
115 struct List *__aros_list_tmp = (struct List *)(_l), \
116 *l = __aros_list_tmp; \
118 l->lh_TailPred->ln_Pred ? l->lh_TailPred : (struct Node *)0; \
121 #define GetSucc(_n) \
122 ({ \
123 struct Node *__aros_node_tmp = (struct Node *)(_n), \
124 *n = __aros_node_tmp; \
126 (n && n->ln_Succ && n->ln_Succ->ln_Succ) ? n->ln_Succ : (struct Node *)0; \
129 #define GetPred(_n) \
130 ({ \
131 struct Node *__aros_node_tmp = (struct Node *)(_n), \
132 *n = __aros_node_tmp; \
134 (n && n->ln_Pred && n->ln_Pred->ln_Pred) ? n->ln_Pred : (struct Node *)0; \
137 #define REMHEAD(_l) \
138 ({ \
139 struct List *__aros_list_tmp = (struct List *)(_l), \
140 *l = __aros_list_tmp; \
142 l->lh_Head->ln_Succ ? REMOVE(l->lh_Head) : (struct Node *)0; \
145 #define REMTAIL(_l) \
146 ({ \
147 struct List *__aros_list_tmp = (struct List *)(_l), \
148 *l = __aros_list_tmp; \
150 l->lh_TailPred->ln_Pred ? REMOVE(l->lh_TailPred) : (struct Node *)0; \
153 #define ForeachNode(list, node) \
154 for \
156 node = (void *)(((struct List *)(list))->lh_Head); \
157 ((struct Node *)(node))->ln_Succ; \
158 node = (void *)(((struct Node *)(node))->ln_Succ) \
161 #define ForeachNodeSafe(list, current, next) \
162 for \
164 current = (void *)(((struct List *)(list))->lh_Head); \
165 (next = (void *)((struct Node *)(current))->ln_Succ); \
166 current = (void *)next \
169 #define ListLength(list,count) \
170 do { \
171 struct Node * __n; \
172 count = 0; \
173 ForeachNode (list,__n) count ++; \
174 } while (0)
176 #endif /* EXEC_LISTS_H */