xref: /haiku/headers/private/kernel/util/list.h (revision 51978af14a173e7fae0563b562be5603bc652aeb)
1 /*
2 ** Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
3 ** Distributed under the terms of the OpenBeOS License.
4 */
5 #ifndef KERNEL_LIST_H
6 #define KERNEL_LIST_H
7 
8 
9 #include <SupportDefs.h>
10 
11 
12 /* This header defines a doubly-linked list. It differentiates between a link
13  * and an item.
14  * A link is what is put into and removed from a list, an item is the whole
15  * object that contains the link. The item doesn't have to be begin with a
16  * link; the offset to the link structure is given to init_list_etc(), so that
17  * list_get_next/prev_item() will work correctly.
18  * Note, the offset value is only needed for the *_item() functions. If the
19  * offset is 0, list_link and item are identical - if you use init_list(),
20  * you don't have to care about the difference between a link and an item.
21  */
22 
23 typedef struct list_link list_link;
24 
25 /* The object that is put into the list must begin with these
26  * fields, but it doesn't have to be this structure.
27  */
28 
29 struct list_link {
30 	list_link *next;
31 	list_link *prev;
32 };
33 
34 struct list {
35 	list_link	link;
36 	int32		offset;
37 };
38 
39 
40 #ifdef __cplusplus
41 extern "C" {
42 #endif
43 
44 extern void list_init(struct list *list);
45 extern void list_init_etc(struct list *list, int32 offset);
46 extern void list_add_link_to_head(struct list *list, void *_link);
47 extern void list_add_link_to_tail(struct list *list, void *_link);
48 extern void list_remove_link(void *_link);
49 extern void *list_get_next_item(struct list *list, void *item);
50 extern void *list_get_prev_item(struct list *list, void *item);
51 extern void list_add_item(struct list *list, void *item);
52 extern void list_remove_item(struct list *list, void *item);
53 extern void *list_remove_head_item(struct list *list);
54 extern void *list_remove_tail_item(struct list *list);
55 
56 static inline bool
57 list_is_empty(struct list *list)
58 {
59 	return list->link.next == (list_link *)list;
60 }
61 
62 static inline void *
63 list_get_first_item(struct list *list)
64 {
65 	return list_get_next_item(list, NULL);
66 }
67 
68 #ifdef __cplusplus
69 }
70 #endif
71 
72 #endif	/* KERNEL_LIST_H */
73