Commit | Line | Data |
---|---|---|
b59abc69 MD |
1 | // SPDX-License-Identifier: MIT |
2 | /* | |
3 | * Copyright 2022 Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | |
4 | */ | |
5 | ||
d04d4903 MD |
6 | #ifndef _TGIF_LIST_H |
7 | #define _TGIF_LIST_H | |
b59abc69 | 8 | |
d04d4903 MD |
9 | struct tgif_list_node { |
10 | struct tgif_list_node *next; | |
11 | struct tgif_list_node *prev; | |
b59abc69 MD |
12 | }; |
13 | ||
d04d4903 MD |
14 | struct tgif_list_head { |
15 | struct tgif_list_node node; | |
b59abc69 MD |
16 | }; |
17 | ||
d04d4903 MD |
18 | #define DEFINE_TGIF_LIST_HEAD(_identifier) \ |
19 | struct tgif_list_head _identifier = { \ | |
b59abc69 MD |
20 | .node = { \ |
21 | .next = &(_identifier).node, \ | |
22 | .prev = &(_identifier).node, \ | |
23 | }, \ | |
24 | } | |
25 | ||
26 | static inline | |
d04d4903 | 27 | void tgif_list_insert_node_tail(struct tgif_list_head *head, struct tgif_list_node *node) |
b59abc69 MD |
28 | { |
29 | node->next = &head->node; | |
30 | node->prev = head->node.prev; | |
31 | node->prev->next = node; | |
32 | head->node.prev = node; | |
33 | } | |
34 | ||
35 | static inline | |
d04d4903 | 36 | void tgif_list_insert_node_head(struct tgif_list_head *head, struct tgif_list_node *node) |
b59abc69 MD |
37 | { |
38 | node->next = head->node.next; | |
39 | node->prev = &head->node; | |
40 | node->next->prev = node; | |
41 | head->node.next = node; | |
42 | } | |
43 | ||
44 | static inline | |
d04d4903 | 45 | void tgif_list_remove_node(struct tgif_list_node *node) |
b59abc69 MD |
46 | { |
47 | node->next->prev = node->prev; | |
48 | node->prev->next = node->next; | |
49 | } | |
50 | ||
d04d4903 MD |
51 | #define tgif_list_for_each_entry(_entry, _head, _member) \ |
52 | for ((_entry) = tgif_container_of((_head)->node.next, __typeof__(*(_entry)), _member); \ | |
a13c9d2e | 53 | &(_entry)->_member != &(_head)->node; \ |
d04d4903 | 54 | (_entry) = tgif_container_of((_entry)->_member.next, __typeof__(*(_entry)), _member)) |
b59abc69 MD |
55 | |
56 | /* List iteration, safe against node reclaim while iterating. */ | |
d04d4903 MD |
57 | #define tgif_list_for_each_entry_safe(_entry, _next_entry, _head, _member) \ |
58 | for ((_entry) = tgif_container_of((_head)->node.next, __typeof__(*(_entry)), _member), \ | |
59 | (_next_entry) = tgif_container_of((_entry)->_member.next, __typeof__(*(_entry)), _member); \ | |
6e46f5e6 | 60 | &(_entry)->_member != &(_head)->node; \ |
d04d4903 MD |
61 | (_entry) = tgif_container_of((_next_entry)->_member.next, __typeof__(*(_entry)), _member), \ |
62 | (_next_entry) = tgif_container_of((_entry)->_member.next, __typeof__(*(_entry)), _member)) | |
b59abc69 | 63 | |
d04d4903 | 64 | #endif /* _TGIF_LIST_H */ |