Introduce list_types.h
[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_insert_node_tail(struct side_list_head *head, struct side_list_node *node)
13 {
14 node->next = &head->node;
15 node->prev = head->node.prev;
16 node->prev->next = node;
17 head->node.prev = node;
18 }
19
20 static inline
21 void side_list_insert_node_head(struct side_list_head *head, struct side_list_node *node)
22 {
23 node->next = head->node.next;
24 node->prev = &head->node;
25 node->next->prev = node;
26 head->node.next = node;
27 }
28
29 static inline
30 void side_list_remove_node(struct side_list_node *node)
31 {
32 node->next->prev = node->prev;
33 node->prev->next = node->next;
34 }
35
36 #define side_list_for_each_entry(_entry, _head, _member) \
37 for ((_entry) = side_container_of((_head)->node.next, __typeof__(*(_entry)), _member); \
38 &(_entry)->_member != &(_head)->node; \
39 (_entry) = side_container_of((_entry)->_member.next, __typeof__(*(_entry)), _member))
40
41 /* List iteration, safe against node reclaim while iterating. */
42 #define side_list_for_each_entry_safe(_entry, _next_entry, _head, _member) \
43 for ((_entry) = side_container_of((_head)->node.next, __typeof__(*(_entry)), _member), \
44 (_next_entry) = side_container_of((_entry)->_member.next, __typeof__(*(_entry)), _member); \
45 &(_entry)->_member != &(_head)->node; \
46 (_entry) = side_container_of((_next_entry)->_member.next, __typeof__(*(_entry)), _member), \
47 (_next_entry) = side_container_of((_entry)->_member.next, __typeof__(*(_entry)), _member))
48
49 #endif /* _SIDE_LIST_H */
This page took 0.029362 seconds and 4 git commands to generate.