]>
git.proxmox.com Git - mirror_lxc.git/blob - src/lxc/list.h
2 * lxc: linux Container library
4 * (C) Copyright IBM Corp. 2007, 2008
7 * Daniel Lezcano <daniel.lezcano at free.fr>
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29 struct lxc_list
*next
;
30 struct lxc_list
*prev
;
33 #define lxc_init_list(l) { .next = l, .prev = l }
36 * Iterate through an lxc list. An example for an idiom would be:
38 * struct lxc_list *iterator;
39 * type *tmp; // where "type" can be an int, char * etc.
40 * lxc_list_for_each(iterator, list) {
41 * tmp = iterator->elem;
42 * // Do stuff with tmp.
46 #define lxc_list_for_each(__iterator, __list) \
47 for (__iterator = (__list)->next; \
48 __iterator != __list; \
49 __iterator = __iterator->next)
52 * Iterate safely through an lxc list. An example for an appropriate use case
55 * struct lxc_list *iterator;
56 * lxc_list_for_each_safe(iterator, list, list->next) {
57 * tmp = iterator->elem;
58 * // Do stuff with tmp.
62 #define lxc_list_for_each_safe(__iterator, __list, __next) \
63 for (__iterator = (__list)->next, __next = __iterator->next; \
64 __iterator != __list; \
65 __iterator = __next, __next = __next->next)
68 static inline void lxc_list_init(struct lxc_list
*list
)
71 list
->next
= list
->prev
= list
;
74 /* Add an element to a list. See lxc_list_add() and lxc_list_add_tail() for an
76 static inline void lxc_list_add_elem(struct lxc_list
*list
, void *elem
)
81 /* Retrieve first element of list. */
82 static inline void *lxc_list_first_elem(struct lxc_list
*list
)
84 return list
->next
->elem
;
87 /* Retrieve last element of list. */
88 static inline void *lxc_list_last_elem(struct lxc_list
*list
)
90 return list
->prev
->elem
;
93 /* Determine if list is empty. */
94 static inline int lxc_list_empty(struct lxc_list
*list
)
96 return list
== list
->next
;
99 /* Workhorse to be called from lxc_list_add() and lxc_list_add_tail(). */
100 static inline void __lxc_list_add(struct lxc_list
*new,
101 struct lxc_list
*prev
,
102 struct lxc_list
*next
)
111 * Idiom to add an element to the beginning of an lxc list:
113 * struct lxc_list *tmp = malloc(sizeof(*tmp));
116 * lxc_list_add_elem(tmp, elem);
117 * lxc_list_add(list, tmp);
119 static inline void lxc_list_add(struct lxc_list
*head
, struct lxc_list
*list
)
121 __lxc_list_add(list
, head
, head
->next
);
125 * Idiom to add an element to the end of an lxc list:
127 * struct lxc_list *tmp = malloc(sizeof(*tmp));
130 * lxc_list_add_elem(tmp, elem);
131 * lxc_list_add_tail(list, tmp);
133 static inline void lxc_list_add_tail(struct lxc_list
*head
,
134 struct lxc_list
*list
)
136 __lxc_list_add(list
, head
->prev
, head
);
140 * Idiom to free an lxc list:
142 * lxc_list_for_each_safe(iterator, list, list->next) {
143 * lxc_list_del(iterator);
148 static inline void lxc_list_del(struct lxc_list
*list
)
150 struct lxc_list
*next
, *prev
;
158 /* Return length of the list. */
159 static inline size_t lxc_list_len(struct lxc_list
*list
)
162 struct lxc_list
*iter
;
163 lxc_list_for_each(iter
, list
) {