Statedump improvements
[libside.git] / src / list.h
CommitLineData
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
11static inline
12void side_list_head_init(struct side_list_head *head)
13{
14 head->node.next = head->node.prev = &head->node;
15}
16
b59abc69 17static inline
67337c4a 18void 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
26static inline
67337c4a 27void 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
35static inline
67337c4a 36void 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
42static inline
43bool 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 */
51static inline
52void 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 */
This page took 0.028017 seconds and 4 git commands to generate.