cctools
list.h
Go to the documentation of this file.
1 /*
2 Copyright (C) 2003-2004 Douglas Thain and the University of Wisconsin
3 Copyright (C) 2005- The University of Notre Dame
4 This software is distributed under the GNU General Public License.
5 See the file COPYING for details.
6 */
7 
8 #ifndef LIST_H
9 #define LIST_H
10 
13 /*
14 It turns out that many libraries and tools make use of
15 symbols like "debug" and "fatal". This causes strange
16 failures when we link against such codes. Rather than change
17 all of our code, we simply insert these defines to
18 transparently modify the linker namespace we are using.
19 */
20 
21 #define list_delete cctools_list_delete
22 #define list_free cctools_list_free
23 #define list_pop_head cctools_list_pop_head
24 #define list_peek_head cctools_list_peek_head
25 #define list_pop_tail cctools_list_pop_tail
26 #define list_peek_tail cctools_list_peek_tail
27 #define list_remove cctools_list_remove
28 #define list_find cctools_list_find
29 #define list_create cctools_list_create
30 #define list_splice cctools_list_splice
31 #define list_split cctools_list_split
32 #define list_size cctools_list_size
33 #define list_push_priority cctools_list_push_priority
34 #define list_push_head cctools_list_push_head
35 #define list_push_tail cctools_list_push_tail
36 #define list_iterate cctools_list_iterate
37 #define list_iterate_reverse cctools_list_iterate_reverse
38 #define list_first_item cctools_list_first_item
39 #define list_next_item cctools_list_next_item
40 
41 struct list_node {
42  void *data;
43  struct list_node *next;
44  struct list_node *prev;
45  int priority;
46 };
47 
48 struct list {
49  struct list_node *head;
50  struct list_node *tail;
51  struct list_node *iter;
52  int size;
53 };
54 
55 typedef int (*list_op_t) (void *item, const void *arg);
56 
61 struct list *list_create();
62 
70 struct list *list_duplicate(struct list *list);
71 
78 void list_delete(struct list *list);
79 
85 void list_free(struct list *list);
86 
93 struct list *list_splice(struct list *top, struct list *bottom);
94 
104 struct list *list_split(struct list *src, list_op_t cmp, const void *arg);
105 
111 int list_size(struct list *list);
112 
119 int list_push_priority(struct list *list, void *item, int prio);
120 
126 int list_push_head(struct list *list, void *item);
127 
132 void *list_pop_head(struct list *list);
133 
138 void *list_peek_head(struct list *list);
139 
145 int list_push_tail(struct list *list, void *item);
146 
151 void *list_pop_tail(struct list *list);
152 
157 void *list_peek_tail(struct list *list);
158 
167 void *list_find(struct list *list, list_op_t cmp, const void *arg);
168 
176 void *list_remove(struct list *list, const void *value);
177 
184 void list_first_item(struct list *list);
185 
193 void *list_next_item(struct list *list);
194 
202 int list_iterate(struct list *list, list_op_t op, const void *arg);
203 
210 int list_iterate_reverse(struct list *list, list_op_t op, const void *arg);
211 
217 struct list *list_sort(struct list *list, int (*comparator) (const void *, const void *));
218 
219 #endif