Commit | Line | Data |
---|---|---|
b59abc69 MD |
1 | // SPDX-License-Identifier: MIT |
2 | /* | |
3 | * Copyright 2022 Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | |
4 | */ | |
5 | ||
67337c4a MD |
6 | #ifndef _SIDE_LIST_H |
7 | #define _SIDE_LIST_H | |
b59abc69 | 8 | |
e1672a0c | 9 | #include "list_types.h" |
b59abc69 | 10 | |
bffe9ae3 MD |
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 | ||
b59abc69 | 17 | static inline |
67337c4a | 18 | void side_list_insert_node_tail(struct side_list_head *head, struct side_list_node *node) |
b59abc69 MD |
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 | |
67337c4a | 27 | void side_list_insert_node_head(struct side_list_head *head, struct side_list_node *node) |
b59abc69 MD |
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 | |
67337c4a | 36 | void side_list_remove_node(struct side_list_node *node) |
b59abc69 MD |
37 | { |
38 | node->next->prev = node->prev; | |
39 | node->prev->next = node->next; | |
40 | } | |
41 | ||
bffe9ae3 MD |
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 | ||
67337c4a MD |
62 | #define side_list_for_each_entry(_entry, _head, _member) \ |
63 | for ((_entry) = side_container_of((_head)->node.next, __typeof__(*(_entry)), _member); \ | |
a13c9d2e | 64 | &(_entry)->_member != &(_head)->node; \ |
67337c4a | 65 | (_entry) = side_container_of((_entry)->_member.next, __typeof__(*(_entry)), _member)) |
b59abc69 MD |
66 | |
67 | /* List iteration, safe against node reclaim while iterating. */ | |
67337c4a MD |
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); \ | |
6e46f5e6 | 71 | &(_entry)->_member != &(_head)->node; \ |
67337c4a MD |
72 | (_entry) = side_container_of((_next_entry)->_member.next, __typeof__(*(_entry)), _member), \ |
73 | (_next_entry) = side_container_of((_entry)->_member.next, __typeof__(*(_entry)), _member)) | |
b59abc69 | 74 | |
67337c4a | 75 | #endif /* _SIDE_LIST_H */ |