aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/eina/src/include/eina_clist.h
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/eina/src/include/eina_clist.h')
-rw-r--r--libraries/eina/src/include/eina_clist.h160
1 files changed, 41 insertions, 119 deletions
diff --git a/libraries/eina/src/include/eina_clist.h b/libraries/eina/src/include/eina_clist.h
index 68f15df..096a4b7 100644
--- a/libraries/eina/src/include/eina_clist.h
+++ b/libraries/eina/src/include/eina_clist.h
@@ -23,7 +23,22 @@
23#define __EINA_CLIST_H__ 23#define __EINA_CLIST_H__
24 24
25/** 25/**
26 * @addtogroup Eina_CList_Group Compact inline list 26 * @addtogroup Eina_Data_Types_Group Data Types
27 *
28 * @{
29 */
30
31/**
32 * @addtogroup Eina_Containers_Group Containers
33 *
34 * @{
35 */
36
37/**
38 * @defgroup Eina_CList_Group Compact List
39 *
40 * @{
41 *
27 * @brief Eina_Clist is a compact (inline) list implementation 42 * @brief Eina_Clist is a compact (inline) list implementation
28 * 43 *
29 * Elements of this list are members of the structs stored in the list 44 * Elements of this list are members of the structs stored in the list
@@ -42,9 +57,8 @@
42 * @note There's no NULL at the end of the list, the last item points to the head. 57 * @note There's no NULL at the end of the list, the last item points to the head.
43 * 58 *
44 * @note List heads must be initialized with EINA_CLIST_INIT or by calling eina_clist_element_init 59 * @note List heads must be initialized with EINA_CLIST_INIT or by calling eina_clist_element_init
45 */ 60 *
46 61 * Define a list like so:
47/* Define a list like so:
48 * 62 *
49 * @code 63 * @code
50 * struct gadget 64 * struct gadget
@@ -88,24 +102,6 @@
88 */ 102 */
89 103
90/** 104/**
91 * @addtogroup Eina_Data_Types_Group Data Types
92 *
93 * @{
94 */
95
96/**
97 * @addtogroup Eina_Containers_Group Containers
98 *
99 * @{
100 */
101
102/**
103 * @defgroup Eina_CList_Group Compact list
104 *
105 * @{
106 */
107
108/**
109 * @typedef Eina_Clist 105 * @typedef Eina_Clist
110 * This is the list head and the list entry. 106 * This is the list head and the list entry.
111 * @since 1.1.0 107 * @since 1.1.0
@@ -135,13 +131,7 @@ struct _Eina_Clist
135 * @note There's no need to initialize an element before adding it to the list. 131 * @note There's no need to initialize an element before adding it to the list.
136 * @since 1.1.0 132 * @since 1.1.0
137 */ 133 */
138static inline void eina_clist_add_after(Eina_Clist *elem, Eina_Clist *to_add) 134static inline void eina_clist_add_after(Eina_Clist *elem, Eina_Clist *to_add);
139{
140 to_add->next = elem->next;
141 to_add->prev = elem;
142 elem->next->prev = to_add;
143 elem->next = to_add;
144}
145 135
146/** 136/**
147 * Add an element before the specified one. 137 * Add an element before the specified one.
@@ -154,13 +144,7 @@ static inline void eina_clist_add_after(Eina_Clist *elem, Eina_Clist *to_add)
154 * @note There's no need to initialize an element before adding it to the list. 144 * @note There's no need to initialize an element before adding it to the list.
155 * @since 1.1.0 145 * @since 1.1.0
156 */ 146 */
157static inline void eina_clist_add_before(Eina_Clist *elem, Eina_Clist *to_add) 147static inline void eina_clist_add_before(Eina_Clist *elem, Eina_Clist *to_add);
158{
159 to_add->next = elem;
160 to_add->prev = elem->prev;
161 elem->prev->next = to_add;
162 elem->prev = to_add;
163}
164 148
165/** 149/**
166 * Add element at the head of the list. 150 * Add element at the head of the list.
@@ -173,10 +157,7 @@ static inline void eina_clist_add_before(Eina_Clist *elem, Eina_Clist *to_add)
173 * @note There's no need to initialize an element before adding it to the list. 157 * @note There's no need to initialize an element before adding it to the list.
174 * @since 1.1.0 158 * @since 1.1.0
175 */ 159 */
176static inline void eina_clist_add_head(Eina_Clist *list, Eina_Clist *elem) 160static inline void eina_clist_add_head(Eina_Clist *list, Eina_Clist *elem);
177{
178 eina_clist_add_after(list, elem);
179}
180 161
181/** 162/**
182 * Add element at the tail of the list. 163 * Add element at the tail of the list.
@@ -189,10 +170,7 @@ static inline void eina_clist_add_head(Eina_Clist *list, Eina_Clist *elem)
189 * @note There's no need to initialize an element before adding it to the list. 170 * @note There's no need to initialize an element before adding it to the list.
190 * @since 1.1.0 171 * @since 1.1.0
191 */ 172 */
192static inline void eina_clist_add_tail(Eina_Clist *list, Eina_Clist *elem) 173static inline void eina_clist_add_tail(Eina_Clist *list, Eina_Clist *elem);
193{
194 eina_clist_add_before(list, elem);
195}
196 174
197/** 175/**
198 * Init an (unlinked) element. 176 * Init an (unlinked) element.
@@ -207,11 +185,7 @@ static inline void eina_clist_add_tail(Eina_Clist *list, Eina_Clist *elem)
207 * @note It is not necessary to call this before adding an element to this list. 185 * @note It is not necessary to call this before adding an element to this list.
208 * @since 1.1.0 186 * @since 1.1.0
209 */ 187 */
210static inline void eina_clist_element_init(Eina_Clist *elem) 188static inline void eina_clist_element_init(Eina_Clist *elem);
211{
212 elem->next = NULL;
213 elem->prev = NULL;
214}
215 189
216/** 190/**
217 * Check if an element is in a list or not. 191 * Check if an element is in a list or not.
@@ -222,10 +196,7 @@ static inline void eina_clist_element_init(Eina_Clist *elem)
222 * it has been added to a list or remove from a list. 196 * it has been added to a list or remove from a list.
223 * @since 1.1.0 197 * @since 1.1.0
224 */ 198 */
225static inline int eina_clist_element_is_linked(Eina_Clist *elem) 199static inline int eina_clist_element_is_linked(Eina_Clist *elem);
226{
227 return (elem->next != NULL && elem->prev != NULL);
228}
229 200
230/** 201/**
231 * Remove an element from its list. 202 * Remove an element from its list.
@@ -235,12 +206,7 @@ static inline int eina_clist_element_is_linked(Eina_Clist *elem)
235 * @post The element is marked as not being in any list 206 * @post The element is marked as not being in any list
236 * @since 1.1.0 207 * @since 1.1.0
237 */ 208 */
238static inline void eina_clist_remove(Eina_Clist *elem) 209static inline void eina_clist_remove(Eina_Clist *elem);
239{
240 elem->next->prev = elem->prev;
241 elem->prev->next = elem->next;
242 eina_clist_element_init(elem);
243}
244 210
245/** 211/**
246 * Get the next element. 212 * Get the next element.
@@ -248,15 +214,10 @@ static inline void eina_clist_remove(Eina_Clist *elem)
248 * @param list The list 214 * @param list The list
249 * @param elem An element 215 * @param elem An element
250 * @pre @a elem is in @a list 216 * @pre @a elem is in @a list
251 * @return The element after @elem in @list or NULL if @a elem is last in @a list 217 * @return The element after @a elem in @a list or @c NULL if @a elem is last in @a list
252 * @since 1.1.0 218 * @since 1.1.0
253 */ 219 */
254static inline Eina_Clist *eina_clist_next(const Eina_Clist *list, const Eina_Clist *elem) 220static inline Eina_Clist *eina_clist_next(const Eina_Clist *list, const Eina_Clist *elem);
255{
256 Eina_Clist *ret = elem->next;
257 if (elem->next == list) ret = NULL;
258 return ret;
259}
260 221
261/** 222/**
262 * Get the previous element. 223 * Get the previous element.
@@ -267,12 +228,7 @@ static inline Eina_Clist *eina_clist_next(const Eina_Clist *list, const Eina_Cli
267 * @return The element before @a elem or NULL if @a elem is the first in the list 228 * @return The element before @a elem or NULL if @a elem is the first in the list
268 * @since 1.1.0 229 * @since 1.1.0
269 */ 230 */
270static inline Eina_Clist *eina_clist_prev(const Eina_Clist *list, const Eina_Clist *elem) 231static inline Eina_Clist *eina_clist_prev(const Eina_Clist *list, const Eina_Clist *elem);
271{
272 Eina_Clist *ret = elem->prev;
273 if (elem->prev == list) ret = NULL;
274 return ret;
275}
276 232
277/** 233/**
278 * Get the first element. 234 * Get the first element.
@@ -281,22 +237,16 @@ static inline Eina_Clist *eina_clist_prev(const Eina_Clist *list, const Eina_Cli
281 * @returns The first element in @a list or NULL if @a list is empty 237 * @returns The first element in @a list or NULL if @a list is empty
282 * @since 1.1.0 238 * @since 1.1.0
283 */ 239 */
284static inline Eina_Clist *eina_clist_head(const Eina_Clist *list) 240static inline Eina_Clist *eina_clist_head(const Eina_Clist *list);
285{
286 return eina_clist_next(list, list);
287}
288 241
289/** 242/**
290 * Get the last element. 243 * Get the last element.
291 * 244 *
292 * @param list The list 245 * @param list The list
293 * @returns The last element in @a list or NULL if @list is empty 246 * @returns The last element in @a list or NULL if @a list is empty
294 * @since 1.1.0 247 * @since 1.1.0
295 */ 248 */
296static inline Eina_Clist *eina_clist_tail(const Eina_Clist *list) 249static inline Eina_Clist *eina_clist_tail(const Eina_Clist *list);
297{
298 return eina_clist_prev(list, list);
299}
300 250
301/** 251/**
302 * Check if a list is empty. 252 * Check if a list is empty.
@@ -305,10 +255,7 @@ static inline Eina_Clist *eina_clist_tail(const Eina_Clist *list)
305 * @returns non-zero if @a list is empty, zero if it is not 255 * @returns non-zero if @a list is empty, zero if it is not
306 * @since 1.1.0 256 * @since 1.1.0
307 */ 257 */
308static inline int eina_clist_empty(const Eina_Clist *list) 258static inline int eina_clist_empty(const Eina_Clist *list);
309{
310 return list->next == list;
311}
312 259
313/** 260/**
314 * Initialize a list 261 * Initialize a list
@@ -322,10 +269,7 @@ static inline int eina_clist_empty(const Eina_Clist *list)
322 * initialize the list by zero'ing out the list head. 269 * initialize the list by zero'ing out the list head.
323 * @since 1.1.0 270 * @since 1.1.0
324 */ 271 */
325static inline void eina_clist_init(Eina_Clist *list) 272static inline void eina_clist_init(Eina_Clist *list);
326{
327 list->next = list->prev = list;
328}
329 273
330/** 274/**
331 * Count the elements of a list 275 * Count the elements of a list
@@ -334,13 +278,7 @@ static inline void eina_clist_init(Eina_Clist *list)
334 * @returns The number of items in the list 278 * @returns The number of items in the list
335 * @since 1.1.0 279 * @since 1.1.0
336 */ 280 */
337static inline unsigned int eina_clist_count(const Eina_Clist *list) 281static inline unsigned int eina_clist_count(const Eina_Clist *list);
338{
339 unsigned count = 0;
340 const Eina_Clist *ptr;
341 for (ptr = list->next; ptr != list; ptr = ptr->next) count++;
342 return count;
343}
344 282
345/** 283/**
346 * Move all elements from src to the tail of dst 284 * Move all elements from src to the tail of dst
@@ -351,16 +289,7 @@ static inline unsigned int eina_clist_count(const Eina_Clist *list)
351 * @post @a src is initialized but empty after this operation 289 * @post @a src is initialized but empty after this operation
352 * @since 1.1.0 290 * @since 1.1.0
353 */ 291 */
354static inline void eina_clist_move_tail(Eina_Clist *dst, Eina_Clist *src) 292static inline void eina_clist_move_tail(Eina_Clist *dst, Eina_Clist *src);
355{
356 if (eina_clist_empty(src)) return;
357
358 dst->prev->next = src->next;
359 src->next->prev = dst->prev;
360 dst->prev = src->prev;
361 src->prev->next = dst;
362 eina_clist_init(src);
363}
364 293
365/** 294/**
366 * move all elements from src to the head of dst 295 * move all elements from src to the head of dst
@@ -371,16 +300,7 @@ static inline void eina_clist_move_tail(Eina_Clist *dst, Eina_Clist *src)
371 * @post @a src is initialized but empty after this operation 300 * @post @a src is initialized but empty after this operation
372 * @since 1.1.0 301 * @since 1.1.0
373 */ 302 */
374static inline void eina_clist_move_head(Eina_Clist *dst, Eina_Clist *src) 303static inline void eina_clist_move_head(Eina_Clist *dst, Eina_Clist *src);
375{
376 if (eina_clist_empty(src)) return;
377
378 dst->next->prev = src->prev;
379 src->prev->next = dst->next;
380 dst->next = src->next;
381 src->next->prev = dst;
382 eina_clist_init(src);
383}
384 304
385/** 305/**
386 * iterate through the list 306 * iterate through the list
@@ -441,15 +361,17 @@ static inline void eina_clist_move_head(Eina_Clist *dst, Eina_Clist *src)
441#define EINA_CLIST_ENTRY(elem, type, field) \ 361#define EINA_CLIST_ENTRY(elem, type, field) \
442 ((type *)((char *)(elem) - (unsigned long)(&((type *)0)->field))) 362 ((type *)((char *)(elem) - (unsigned long)(&((type *)0)->field)))
443 363
444/* 364#include "eina_inline_clist.x"
365
366/**
445 * @} 367 * @}
446 */ 368 */
447 369
448/* 370/**
449 * @} 371 * @}
450 */ 372 */
451 373
452/* 374/**
453 * @} 375 * @}
454 */ 376 */
455 377