1 /*
2 * Linked lists support
3 *
4 * Copyright (C) 2002 Alexandre Julliard
5 * Copyright (C) 2011 Mike McCormack (adapted for Eina)
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 */
21
22 #ifndef __EINA_CLIST_INLINE_H__
23 #define __EINA_CLIST_INLINE_H__
24
25 #include <stddef.h>
26
eina_clist_add_after(Eina_Clist * elem,Eina_Clist * to_add)27 static inline void eina_clist_add_after(Eina_Clist *elem, Eina_Clist *to_add)
28 {
29 to_add->next = elem->next;
30 to_add->prev = elem;
31 elem->next->prev = to_add;
32 elem->next = to_add;
33 }
34
eina_clist_add_before(Eina_Clist * elem,Eina_Clist * to_add)35 static inline void eina_clist_add_before(Eina_Clist *elem, Eina_Clist *to_add)
36 {
37 to_add->next = elem;
38 to_add->prev = elem->prev;
39 elem->prev->next = to_add;
40 elem->prev = to_add;
41 }
42
eina_clist_add_head(Eina_Clist * list,Eina_Clist * elem)43 static inline void eina_clist_add_head(Eina_Clist *list, Eina_Clist *elem)
44 {
45 eina_clist_add_after(list, elem);
46 }
47
eina_clist_add_tail(Eina_Clist * list,Eina_Clist * elem)48 static inline void eina_clist_add_tail(Eina_Clist *list, Eina_Clist *elem)
49 {
50 eina_clist_add_before(list, elem);
51 }
52
eina_clist_element_init(Eina_Clist * elem)53 static inline void eina_clist_element_init(Eina_Clist *elem)
54 {
55 elem->next = NULL;
56 elem->prev = NULL;
57 }
58
eina_clist_element_is_linked(Eina_Clist * elem)59 static inline int eina_clist_element_is_linked(Eina_Clist *elem)
60 {
61 return (elem->next != NULL && elem->prev != NULL);
62 }
63
eina_clist_remove(Eina_Clist * elem)64 static inline void eina_clist_remove(Eina_Clist *elem)
65 {
66 elem->next->prev = elem->prev;
67 elem->prev->next = elem->next;
68 eina_clist_element_init(elem);
69 }
70
eina_clist_next(const Eina_Clist * list,const Eina_Clist * elem)71 static inline Eina_Clist *eina_clist_next(const Eina_Clist *list, const Eina_Clist *elem)
72 {
73 Eina_Clist *ret = elem->next;
74 if (elem->next == list) ret = NULL;
75 return ret;
76 }
77
eina_clist_prev(const Eina_Clist * list,const Eina_Clist * elem)78 static inline Eina_Clist *eina_clist_prev(const Eina_Clist *list, const Eina_Clist *elem)
79 {
80 Eina_Clist *ret = elem->prev;
81 if (elem->prev == list) ret = NULL;
82 return ret;
83 }
84
eina_clist_head(const Eina_Clist * list)85 static inline Eina_Clist *eina_clist_head(const Eina_Clist *list)
86 {
87 return eina_clist_next(list, list);
88 }
89
eina_clist_tail(const Eina_Clist * list)90 static inline Eina_Clist *eina_clist_tail(const Eina_Clist *list)
91 {
92 return eina_clist_prev(list, list);
93 }
94
eina_clist_empty(const Eina_Clist * list)95 static inline int eina_clist_empty(const Eina_Clist *list)
96 {
97 return list->next == list;
98 }
99
eina_clist_init(Eina_Clist * list)100 static inline void eina_clist_init(Eina_Clist *list)
101 {
102 list->next = list->prev = list;
103 }
104
eina_clist_count(const Eina_Clist * list)105 static inline unsigned int eina_clist_count(const Eina_Clist *list)
106 {
107 unsigned count = 0;
108 const Eina_Clist *ptr;
109 for (ptr = list->next; ptr != list; ptr = ptr->next) count++;
110 return count;
111 }
112
eina_clist_move_tail(Eina_Clist * dst,Eina_Clist * src)113 static inline void eina_clist_move_tail(Eina_Clist *dst, Eina_Clist *src)
114 {
115 if (eina_clist_empty(src)) return;
116
117 dst->prev->next = src->next;
118 src->next->prev = dst->prev;
119 dst->prev = src->prev;
120 src->prev->next = dst;
121 eina_clist_init(src);
122 }
123
eina_clist_move_head(Eina_Clist * dst,Eina_Clist * src)124 static inline void eina_clist_move_head(Eina_Clist *dst, Eina_Clist *src)
125 {
126 if (eina_clist_empty(src)) return;
127
128 dst->next->prev = src->prev;
129 src->prev->next = dst->next;
130 dst->next = src->next;
131 src->next->prev = dst;
132 eina_clist_init(src);
133 }
134
135 #endif
136