xref: /freebsd/sys/contrib/ncsw/inc/etc/list_ext.h (revision 0957b409)
1 /* Copyright (c) 2008-2012 Freescale Semiconductor, Inc
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *     * Redistributions of source code must retain the above copyright
7  *       notice, this list of conditions and the following disclaimer.
8  *     * Redistributions in binary form must reproduce the above copyright
9  *       notice, this list of conditions and the following disclaimer in the
10  *       documentation and/or other materials provided with the distribution.
11  *     * Neither the name of Freescale Semiconductor nor the
12  *       names of its contributors may be used to endorse or promote products
13  *       derived from this software without specific prior written permission.
14  *
15  *
16  * ALTERNATIVELY, this software may be distributed under the terms of the
17  * GNU General Public License ("GPL") as published by the Free Software
18  * Foundation, either version 2 of that License or (at your option) any
19  * later version.
20  *
21  * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
22  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24  * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
25  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 
34 /**************************************************************************//**
35 
36  @File          list_ext.h
37 
38  @Description   External prototypes for list.c
39 *//***************************************************************************/
40 
41 #ifndef __LIST_EXT_H
42 #define __LIST_EXT_H
43 
44 
45 #include "std_ext.h"
46 
47 
48 /**************************************************************************//**
49  @Group         etc_id   Utility Library Application Programming Interface
50 
51  @Description   External routines.
52 
53  @{
54 *//***************************************************************************/
55 
56 /**************************************************************************//**
57  @Group         list_id List
58 
59  @Description   List module functions,definitions and enums.
60 
61  @{
62 *//***************************************************************************/
63 
64 /**************************************************************************//**
65  @Description   List structure.
66 *//***************************************************************************/
67 typedef struct List
68 {
69     struct List *p_Next;  /**< A pointer to the next list object     */
70     struct List *p_Prev;  /**< A pointer to the previous list object */
71 } t_List;
72 
73 
74 /**************************************************************************//**
75  @Function      NCSW_LIST_FIRST/NCSW_LIST_LAST/NCSW_LIST_NEXT/NCSW_LIST_PREV
76 
77  @Description   Macro to get first/last/next/previous entry in a list.
78 
79  @Param[in]     p_List - A pointer to a list.
80 *//***************************************************************************/
81 #define NCSW_LIST_FIRST(p_List) (p_List)->p_Next
82 #define NCSW_LIST_LAST(p_List)  (p_List)->p_Prev
83 #define NCSW_LIST_NEXT          NCSW_LIST_FIRST
84 #define NCSW_LIST_PREV          NCSW_LIST_LAST
85 
86 
87 /**************************************************************************//**
88  @Function      NCSW_LIST_INIT
89 
90  @Description   Macro for initialization of a list struct.
91 
92  @Param[in]     lst - The t_List object to initialize.
93 *//***************************************************************************/
94 #define NCSW_LIST_INIT(lst) {&(lst), &(lst)}
95 
96 
97 /**************************************************************************//**
98  @Function      NCSW_LIST
99 
100  @Description   Macro to declare of a list.
101 
102  @Param[in]     listName - The list object name.
103 *//***************************************************************************/
104 #define NCSW_LIST(listName) t_List listName = NCSW_LIST_INIT(listName)
105 
106 
107 /**************************************************************************//**
108  @Function      INIT_LIST
109 
110  @Description   Macro to initialize a list pointer.
111 
112  @Param[in]     p_List - The list pointer.
113 *//***************************************************************************/
114 #define INIT_LIST(p_List)   NCSW_LIST_FIRST(p_List) = NCSW_LIST_LAST(p_List) = (p_List)
115 
116 
117 /**************************************************************************//**
118  @Function      NCSW_LIST_OBJECT
119 
120  @Description   Macro to get the struct (object) for this entry.
121 
122  @Param[in]     type   - The type of the struct (object) this list is embedded in.
123  @Param[in]     member - The name of the t_List object within the struct.
124 
125  @Return        The structure pointer for this entry.
126 *//***************************************************************************/
127 #define MEMBER_OFFSET(type, member) (PTR_TO_UINT(&((type *)0)->member))
128 #define NCSW_LIST_OBJECT(p_List, type, member) \
129     ((type *)((char *)(p_List)-MEMBER_OFFSET(type, member)))
130 
131 
132 /**************************************************************************//**
133  @Function      NCSW_LIST_FOR_EACH
134 
135  @Description   Macro to iterate over a list.
136 
137  @Param[in]     p_Pos  - A pointer to a list to use as a loop counter.
138  @Param[in]     p_Head - A pointer to the head for your list pointer.
139 
140  @Cautions      You can't delete items with this routine.
141                 For deletion use NCSW_LIST_FOR_EACH_SAFE().
142 *//***************************************************************************/
143 #define NCSW_LIST_FOR_EACH(p_Pos, p_Head) \
144     for (p_Pos = NCSW_LIST_FIRST(p_Head); p_Pos != (p_Head); p_Pos = NCSW_LIST_NEXT(p_Pos))
145 
146 
147 /**************************************************************************//**
148  @Function      NCSW_LIST_FOR_EACH_SAFE
149 
150  @Description   Macro to iterate over a list safe against removal of list entry.
151 
152  @Param[in]     p_Pos  - A pointer to a list to use as a loop counter.
153  @Param[in]     p_Tmp  - Another pointer to a list to use as temporary storage.
154  @Param[in]     p_Head - A pointer to the head for your list pointer.
155 *//***************************************************************************/
156 #define NCSW_LIST_FOR_EACH_SAFE(p_Pos, p_Tmp, p_Head)                \
157     for (p_Pos = NCSW_LIST_FIRST(p_Head), p_Tmp = NCSW_LIST_FIRST(p_Pos); \
158          p_Pos != (p_Head);                                     \
159          p_Pos = p_Tmp, p_Tmp = NCSW_LIST_NEXT(p_Pos))
160 
161 
162 /**************************************************************************//**
163  @Function      NCSW_LIST_FOR_EACH_OBJECT_SAFE
164 
165  @Description   Macro to iterate over list of given type safely.
166 
167  @Param[in]     p_Pos  - A pointer to a list to use as a loop counter.
168  @Param[in]     p_Tmp  - Another pointer to a list to use as temporary storage.
169  @Param[in]     type   - The type of the struct this is embedded in.
170  @Param[in]     p_Head - A pointer to the head for your list pointer.
171  @Param[in]     member - The name of the list_struct within the struct.
172 
173  @Cautions      You can't delete items with this routine.
174                 For deletion use NCSW_LIST_FOR_EACH_SAFE().
175 *//***************************************************************************/
176 #define NCSW_LIST_FOR_EACH_OBJECT_SAFE(p_Pos, p_Tmp, p_Head, type, member)      \
177     for (p_Pos = NCSW_LIST_OBJECT(NCSW_LIST_FIRST(p_Head), type, member),            \
178          p_Tmp = NCSW_LIST_OBJECT(NCSW_LIST_FIRST(&p_Pos->member), type, member);    \
179          &p_Pos->member != (p_Head);                                       \
180          p_Pos = p_Tmp,                                                    \
181          p_Tmp = NCSW_LIST_OBJECT(NCSW_LIST_FIRST(&p_Pos->member), type, member))
182 
183 /**************************************************************************//**
184  @Function      NCSW_LIST_FOR_EACH_OBJECT
185 
186  @Description   Macro to iterate over list of given type.
187 
188  @Param[in]     p_Pos  - A pointer to a list to use as a loop counter.
189  @Param[in]     type   - The type of the struct this is embedded in.
190  @Param[in]     p_Head - A pointer to the head for your list pointer.
191  @Param[in]     member - The name of the list_struct within the struct.
192 
193  @Cautions      You can't delete items with this routine.
194                 For deletion use NCSW_LIST_FOR_EACH_SAFE().
195 *//***************************************************************************/
196 #define NCSW_LIST_FOR_EACH_OBJECT(p_Pos, type, p_Head, member)                  \
197     for (p_Pos = NCSW_LIST_OBJECT(NCSW_LIST_FIRST(p_Head), type, member);            \
198          &p_Pos->member != (p_Head);                                       \
199          p_Pos = NCSW_LIST_OBJECT(NCSW_LIST_FIRST(&(p_Pos->member)), type, member))
200 
201 
202 /**************************************************************************//**
203  @Function      NCSW_LIST_Add
204 
205  @Description   Add a new entry to a list.
206 
207                 Insert a new entry after the specified head.
208                 This is good for implementing stacks.
209 
210  @Param[in]     p_New  - A pointer to a new list entry to be added.
211  @Param[in]     p_Head - A pointer to a list head to add it after.
212 
213  @Return        none.
214 *//***************************************************************************/
215 static __inline__ void NCSW_LIST_Add(t_List *p_New, t_List *p_Head)
216 {
217     NCSW_LIST_PREV(NCSW_LIST_NEXT(p_Head)) = p_New;
218     NCSW_LIST_NEXT(p_New)             = NCSW_LIST_NEXT(p_Head);
219     NCSW_LIST_PREV(p_New)             = p_Head;
220     NCSW_LIST_NEXT(p_Head)            = p_New;
221 }
222 
223 
224 /**************************************************************************//**
225  @Function      NCSW_LIST_AddToTail
226 
227  @Description   Add a new entry to a list.
228 
229                 Insert a new entry before the specified head.
230                 This is useful for implementing queues.
231 
232  @Param[in]     p_New  - A pointer to a new list entry to be added.
233  @Param[in]     p_Head - A pointer to a list head to add it before.
234 
235  @Return        none.
236 *//***************************************************************************/
237 static __inline__ void NCSW_LIST_AddToTail(t_List *p_New, t_List *p_Head)
238 {
239     NCSW_LIST_NEXT(NCSW_LIST_PREV(p_Head)) = p_New;
240     NCSW_LIST_PREV(p_New)             = NCSW_LIST_PREV(p_Head);
241     NCSW_LIST_NEXT(p_New)             = p_Head;
242     NCSW_LIST_PREV(p_Head)            = p_New;
243 }
244 
245 
246 /**************************************************************************//**
247  @Function      NCSW_LIST_Del
248 
249  @Description   Deletes entry from a list.
250 
251  @Param[in]     p_Entry - A pointer to the element to delete from the list.
252 
253  @Return        none.
254 
255  @Cautions      NCSW_LIST_IsEmpty() on entry does not return true after this,
256                 the entry is in an undefined state.
257 *//***************************************************************************/
258 static __inline__ void NCSW_LIST_Del(t_List *p_Entry)
259 {
260     NCSW_LIST_PREV(NCSW_LIST_NEXT(p_Entry)) = NCSW_LIST_PREV(p_Entry);
261     NCSW_LIST_NEXT(NCSW_LIST_PREV(p_Entry)) = NCSW_LIST_NEXT(p_Entry);
262 }
263 
264 
265 /**************************************************************************//**
266  @Function      NCSW_LIST_DelAndInit
267 
268  @Description   Deletes entry from list and reinitialize it.
269 
270  @Param[in]     p_Entry - A pointer to the element to delete from the list.
271 
272  @Return        none.
273 *//***************************************************************************/
274 static __inline__ void NCSW_LIST_DelAndInit(t_List *p_Entry)
275 {
276     NCSW_LIST_Del(p_Entry);
277     INIT_LIST(p_Entry);
278 }
279 
280 
281 /**************************************************************************//**
282  @Function      NCSW_LIST_Move
283 
284  @Description   Delete from one list and add as another's head.
285 
286  @Param[in]     p_Entry - A pointer to the list entry to move.
287  @Param[in]     p_Head  - A pointer to the list head that will precede our entry.
288 
289  @Return        none.
290 *//***************************************************************************/
291 static __inline__ void NCSW_LIST_Move(t_List *p_Entry, t_List *p_Head)
292 {
293     NCSW_LIST_Del(p_Entry);
294     NCSW_LIST_Add(p_Entry, p_Head);
295 }
296 
297 
298 /**************************************************************************//**
299  @Function      NCSW_LIST_MoveToTail
300 
301  @Description   Delete from one list and add as another's tail.
302 
303  @Param[in]     p_Entry - A pointer to the entry to move.
304  @Param[in]     p_Head  - A pointer to the list head that will follow our entry.
305 
306  @Return        none.
307 *//***************************************************************************/
308 static __inline__ void NCSW_LIST_MoveToTail(t_List *p_Entry, t_List *p_Head)
309 {
310     NCSW_LIST_Del(p_Entry);
311     NCSW_LIST_AddToTail(p_Entry, p_Head);
312 }
313 
314 
315 /**************************************************************************//**
316  @Function      NCSW_LIST_IsEmpty
317 
318  @Description   Tests whether a list is empty.
319 
320  @Param[in]     p_List - A pointer to the list to test.
321 
322  @Return        1 if the list is empty, 0 otherwise.
323 *//***************************************************************************/
324 static __inline__ int NCSW_LIST_IsEmpty(t_List *p_List)
325 {
326     return (NCSW_LIST_FIRST(p_List) == p_List);
327 }
328 
329 
330 /**************************************************************************//**
331  @Function      NCSW_LIST_Append
332 
333  @Description   Join two lists.
334 
335  @Param[in]     p_NewList - A pointer to the new list to add.
336  @Param[in]     p_Head    - A pointer to the place to add it in the first list.
337 
338  @Return        none.
339 *//***************************************************************************/
340 void NCSW_LIST_Append(t_List *p_NewList, t_List *p_Head);
341 
342 
343 /**************************************************************************//**
344  @Function      NCSW_LIST_NumOfObjs
345 
346  @Description   Counts number of objects in the list
347 
348  @Param[in]     p_List - A pointer to the list which objects are to be counted.
349 
350  @Return        Number of objects in the list.
351 *//***************************************************************************/
352 int NCSW_LIST_NumOfObjs(t_List *p_List);
353 
354 /** @} */ /* end of list_id group */
355 /** @} */ /* end of etc_id group */
356 
357 
358 #endif /* __LIST_EXT_H */
359