5c1c37a522851428703888bae45e41a83e84f7f2
[libside.git] / src / list.h
1 // SPDX-License-Identifier: MIT
2 /*
3 * Copyright 2022 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 */
5
6 #ifndef _SIDE_LIST_H
7 #define _SIDE_LIST_H
8
9 #include "list_types.h"
10
11 static inline
12 void side_list_head_init(struct side_list_head *head)
13 {
14 head->node.next = head->node.prev = &head->node;
15 }
16
17 static inline
18 void side_list_insert_node_tail(struct side_list_head *head, struct side_list_node *node)
19 {
20 node->next = &head->node;
21 node->prev = head->node.prev;
22 node->prev->next = node;
23 head->node.prev = node;
24 }
25
26 static inline
27 void side_list_insert_node_head(struct side_list_head *head, struct side_list_node *node)
28 {
29 node->next = head->node.next;
30 node->prev = &head->node;
31 node->next->prev = node;
32 head->node.next = node;
33 }
34
35 static inline
36 void side_list_remove_node(struct side_list_node *node)
37 {
38 node->next->prev = node->prev;
39 node->prev->next = node->next;
40 }
41
42 static inline
43 bool side_list_empty(struct side_list_head *head)
44 {
45 return &head->node == head->node.next;
46 }
47
48 /*
49 * Splice "from" list at the beginning of "to" list.
50 */
51 static inline
52 void side_list_splice(struct side_list_head *from, struct side_list_head *to)
53 {
54 if (side_list_empty(from))
55 return;
56 from->node.next->prev = &to->node;
57 from->node.prev->next = to->node.next;
58 to->node.next->prev = from->node.prev;
59 to->node.next = from->node.next;
60 }
61
62 #define side_list_for_each_entry(_entry, _head, _member) \
63 for ((_entry) = side_container_of((_head)->node.next, __typeof__(*(_entry)), _member); \
64 &(_entry)->_member != &(_head)->node; \
65 (_entry) = side_container_of((_entry)->_member.next, __typeof__(*(_entry)), _member))
66
67 /* List iteration, safe against node reclaim while iterating. */
68 #define side_list_for_each_entry_safe(_entry, _next_entry, _head, _member) \
69 for ((_entry) = side_container_of((_head)->node.next, __typeof__(*(_entry)), _member), \
70 (_next_entry) = side_container_of((_entry)->_member.next, __typeof__(*(_entry)), _member); \
71 &(_entry)->_member != &(_head)->node; \
72 (_entry) = side_container_of((_next_entry)->_member.next, __typeof__(*(_entry)), _member), \
73 (_next_entry) = side_container_of((_entry)->_member.next, __typeof__(*(_entry)), _member))
74
75 #endif /* _SIDE_LIST_H */
This page took 0.032075 seconds and 3 git commands to generate.