5 Copyright © 1995-2011, The AROS Development Team. All rights reserved.
8 Structures and macros for exec lists.
12 /**************************************
14 **************************************/
16 # include <exec/nodes.h>
20 /**************************************
22 **************************************/
26 struct Node
* lh_Head
,
36 struct MinNode
* mlh_Head
,
42 /**************************************
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)) )
58 struct List *__aros_list_tmp = (struct List *)(_l), \
59 *l = __aros_list_tmp; \
61 l->lh_TailPred = (struct Node *)l; \
63 l->lh_Head = (struct Node *)&l->lh_Tail; \
66 #define ADDHEAD(_l,_n) \
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; \
80 #define ADDTAIL(_l,_n) \
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; \
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; \
105 #define GetHead(_l) \
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) \
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) \
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) \
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) \
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) \
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) \
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) \
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) \
173 ForeachNode (list,__n) count ++; \
176 #endif /* EXEC_LISTS_H */