Revert "Rename "libside" to "libtgif""
[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
67337c4a
MD
9struct side_list_node {
10 struct side_list_node *next;
11 struct side_list_node *prev;
b59abc69
MD
12};
13
67337c4a
MD
14struct side_list_head {
15 struct side_list_node node;
b59abc69
MD
16};
17
67337c4a
MD
18#define DEFINE_SIDE_LIST_HEAD(_identifier) \
19 struct side_list_head _identifier = { \
b59abc69
MD
20 .node = { \
21 .next = &(_identifier).node, \
22 .prev = &(_identifier).node, \
23 }, \
24 }
25
26static inline
67337c4a 27void side_list_insert_node_tail(struct side_list_head *head, struct side_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
35static inline
67337c4a 36void side_list_insert_node_head(struct side_list_head *head, struct side_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
44static inline
67337c4a 45void side_list_remove_node(struct side_list_node *node)
b59abc69
MD
46{
47 node->next->prev = node->prev;
48 node->prev->next = node->next;
49}
50
67337c4a
MD
51#define side_list_for_each_entry(_entry, _head, _member) \
52 for ((_entry) = side_container_of((_head)->node.next, __typeof__(*(_entry)), _member); \
a13c9d2e 53 &(_entry)->_member != &(_head)->node; \
67337c4a 54 (_entry) = side_container_of((_entry)->_member.next, __typeof__(*(_entry)), _member))
b59abc69
MD
55
56/* List iteration, safe against node reclaim while iterating. */
67337c4a
MD
57#define side_list_for_each_entry_safe(_entry, _next_entry, _head, _member) \
58 for ((_entry) = side_container_of((_head)->node.next, __typeof__(*(_entry)), _member), \
59 (_next_entry) = side_container_of((_entry)->_member.next, __typeof__(*(_entry)), _member); \
6e46f5e6 60 &(_entry)->_member != &(_head)->node; \
67337c4a
MD
61 (_entry) = side_container_of((_next_entry)->_member.next, __typeof__(*(_entry)), _member), \
62 (_next_entry) = side_container_of((_entry)->_member.next, __typeof__(*(_entry)), _member))
b59abc69 63
67337c4a 64#endif /* _SIDE_LIST_H */
This page took 0.02442 seconds and 4 git commands to generate.