31f5608c50e3421af4ef5fc91dbe90332531cfdd
[libside.git] / src / list.h
1 // SPDX-License-Identifier: MIT
2 /*
3 * Copyright 2022 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 */
5
6 #ifndef _TGIF_LIST_H
7 #define _TGIF_LIST_H
8
9 struct tgif_list_node {
10 struct tgif_list_node *next;
11 struct tgif_list_node *prev;
12 };
13
14 struct tgif_list_head {
15 struct tgif_list_node node;
16 };
17
18 #define DEFINE_TGIF_LIST_HEAD(_identifier) \
19 struct tgif_list_head _identifier = { \
20 .node = { \
21 .next = &(_identifier).node, \
22 .prev = &(_identifier).node, \
23 }, \
24 }
25
26 static inline
27 void tgif_list_insert_node_tail(struct tgif_list_head *head, struct tgif_list_node *node)
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
36 void tgif_list_insert_node_head(struct tgif_list_head *head, struct tgif_list_node *node)
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
45 void tgif_list_remove_node(struct tgif_list_node *node)
46 {
47 node->next->prev = node->prev;
48 node->prev->next = node->next;
49 }
50
51 #define tgif_list_for_each_entry(_entry, _head, _member) \
52 for ((_entry) = tgif_container_of((_head)->node.next, __typeof__(*(_entry)), _member); \
53 &(_entry)->_member != &(_head)->node; \
54 (_entry) = tgif_container_of((_entry)->_member.next, __typeof__(*(_entry)), _member))
55
56 /* List iteration, safe against node reclaim while iterating. */
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); \
60 &(_entry)->_member != &(_head)->node; \
61 (_entry) = tgif_container_of((_next_entry)->_member.next, __typeof__(*(_entry)), _member), \
62 (_next_entry) = tgif_container_of((_entry)->_member.next, __typeof__(*(_entry)), _member))
63
64 #endif /* _TGIF_LIST_H */
This page took 0.030973 seconds and 3 git commands to generate.