attribute for ‘struct XXXX’ must follow the ‘struct’ keyword
[AROS.git] / compiler / include / exec / lists.h
blob4ec4fb5c0918c0392f5bcbaffed8ba5ccecd5514
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 #ifndef __GNUC__
24 /* Normal list */
25 struct List
27 struct Node * lh_Head,
28 * lh_Tail,
29 * lh_TailPred;
30 UBYTE lh_Type;
31 UBYTE l_pad;
34 /* Minimal list */
35 struct MinList
37 struct MinNode * mlh_Head,
38 * mlh_Tail,
39 * mlh_TailPred;
41 #else
42 /* Normal list */
43 struct List __mayalias;
44 struct List
46 struct Node * lh_Head,
47 * lh_Tail;
48 union
50 struct Node * lh_TailPred;
51 struct List * lh_TailPred_;
53 UBYTE lh_Type;
54 UBYTE l_pad;
57 /* Minimal list */
58 struct MinList __mayalias;
59 struct MinList
61 struct MinNode * mlh_Head,
62 * mlh_Tail;
63 union
65 struct MinNode * mlh_TailPred;
66 struct MinList * mlh_TailPred_;
69 #endif /* __GNUC__ */
71 /**************************************
72 Macros
73 **************************************/
74 #define IsListEmpty(l) \
75 ( (((struct List *)l)->lh_TailPred) == (struct Node *)(l) )
77 #define IsMinListEmpty(l) \
78 ( (((struct MinList *)l)->mlh_TailPred) == (struct MinNode *)(l) )
80 #define IsMsgPortEmpty(mp) \
81 ( (((struct MsgPort *)(mp))->mp_MsgList.lh_TailPred) \
82 == (struct Node *)(&(((struct MsgPort *)(mp))->mp_MsgList)) )
84 #ifndef __GNUC__
85 #define NEWLIST(_l) \
86 do \
87 { \
88 struct List *__aros_list_tmp = (struct List *)(_l), \
89 *l = __aros_list_tmp; \
91 l->lh_TailPred = (struct Node *)l; \
92 l->lh_Tail = 0; \
93 l->lh_Head = (struct Node *)&l->lh_Tail; \
94 } while (0)
95 #else /* __GNUC__ */
96 #define NEWLIST(_l) \
97 do \
98 { \
99 struct List *__aros_list_tmp = (struct List *)(_l), \
100 *l = __aros_list_tmp; \
102 l->lh_TailPred_= l; \
103 l->lh_Tail = 0; \
104 l->lh_Head = (struct Node *)&l->lh_Tail; \
105 } while (0)
106 #endif /* __GNUC__ */
108 #define ADDHEAD(_l,_n) \
109 do \
111 struct Node *__aros_node_tmp = (struct Node *)(_n), \
112 *n = __aros_node_tmp; \
113 struct List *__aros_list_tmp = (struct List *)(_l), \
114 *l = __aros_list_tmp; \
116 n->ln_Succ = l->lh_Head; \
117 n->ln_Pred = (struct Node *)&l->lh_Head; \
118 l->lh_Head->ln_Pred = n; \
119 l->lh_Head = n; \
120 } while (0)
122 #define ADDTAIL(_l,_n) \
123 do \
125 struct Node *__aros_node_tmp = (struct Node *)(_n), \
126 *n = __aros_node_tmp; \
127 struct List *__aros_list_tmp = (struct List *)(_l), \
128 *l = __aros_list_tmp; \
130 n->ln_Succ = (struct Node *)&l->lh_Tail; \
131 n->ln_Pred = l->lh_TailPred; \
132 l->lh_TailPred->ln_Succ = n; \
133 l->lh_TailPred = n; \
134 } while (0)
136 #define REMOVE(_n) \
137 ({ \
138 struct Node *__aros_node_tmp = (struct Node *)(_n), \
139 *n = __aros_node_tmp; \
141 n->ln_Pred->ln_Succ = n->ln_Succ; \
142 n->ln_Succ->ln_Pred = n->ln_Pred; \
144 n; \
147 #define GetHead(_l) \
148 ({ \
149 struct List *__aros_list_tmp = (struct List *)(_l), \
150 *l = __aros_list_tmp; \
152 l->lh_Head->ln_Succ ? l->lh_Head : (struct Node *)0; \
155 #define GetTail(_l) \
156 ({ \
157 struct List *__aros_list_tmp = (struct List *)(_l), \
158 *l = __aros_list_tmp; \
160 l->lh_TailPred->ln_Pred ? l->lh_TailPred : (struct Node *)0; \
163 #define GetSucc(_n) \
164 ({ \
165 struct Node *__aros_node_tmp = (struct Node *)(_n), \
166 *n = __aros_node_tmp; \
168 (n && n->ln_Succ && n->ln_Succ->ln_Succ) ? n->ln_Succ : (struct Node *)0; \
171 #define GetPred(_n) \
172 ({ \
173 struct Node *__aros_node_tmp = (struct Node *)(_n), \
174 *n = __aros_node_tmp; \
176 (n && n->ln_Pred && n->ln_Pred->ln_Pred) ? n->ln_Pred : (struct Node *)0; \
179 #define REMHEAD(_l) \
180 ({ \
181 struct List *__aros_list_tmp = (struct List *)(_l), \
182 *l = __aros_list_tmp; \
184 l->lh_Head->ln_Succ ? REMOVE(l->lh_Head) : (struct Node *)0; \
187 #define REMTAIL(_l) \
188 ({ \
189 struct List *__aros_list_tmp = (struct List *)(_l), \
190 *l = __aros_list_tmp; \
192 l->lh_TailPred->ln_Pred ? REMOVE(l->lh_TailPred) : (struct Node *)0; \
195 #define ForeachNode(list, node) \
196 for \
198 node = (void *)(((struct List *)(list))->lh_Head); \
199 ((struct Node *)(node))->ln_Succ; \
200 node = (void *)(((struct Node *)(node))->ln_Succ) \
203 #define ForeachNodeSafe(list, current, next) \
204 for \
206 current = (void *)(((struct List *)(list))->lh_Head); \
207 (next = (void *)((struct Node *)(current))->ln_Succ); \
208 current = (void *)next \
211 #define ListLength(list,count) \
212 do { \
213 struct Node * __n; \
214 count = 0; \
215 ForeachNode (list,__n) count ++; \
216 } while (0)
218 #endif /* EXEC_LISTS_H */