]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/shared/list.h
use #pragma once instead of foo*foo #define guards
[thirdparty/systemd.git] / src / shared / list.h
CommitLineData
03467c88 1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
60918275 2
c2f1db8f 3#pragma once
60918275 4
a7334b09
LP
5/***
6 This file is part of systemd.
7
8 Copyright 2010 Lennart Poettering
9
10 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
11 under the terms of the GNU Lesser General Public License as published by
12 the Free Software Foundation; either version 2.1 of the License, or
a7334b09
LP
13 (at your option) any later version.
14
15 systemd is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 18 Lesser General Public License for more details.
a7334b09 19
5430f7f2 20 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
21 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22***/
23
60918275
LP
24/* The head of the linked list. Use this in the structure that shall
25 * contain the head of the linked list */
26#define LIST_HEAD(t,name) \
034c6ed7 27 t *name
60918275
LP
28
29/* The pointers in the linked list's items. Use this in the item structure */
034c6ed7
LP
30#define LIST_FIELDS(t,name) \
31 t *name##_next, *name##_prev
60918275
LP
32
33/* Initialize the list's head */
034c6ed7 34#define LIST_HEAD_INIT(t,head) \
60918275 35 do { \
034c6ed7 36 (head) = NULL; } \
60918275
LP
37 while(false)
38
39/* Initialize a list item */
034c6ed7 40#define LIST_INIT(t,name,item) \
60918275
LP
41 do { \
42 t *_item = (item); \
43 assert(_item); \
034c6ed7 44 _item->name##_prev = _item->name##_next = NULL; \
60918275
LP
45 } while(false)
46
47/* Prepend an item to the list */
034c6ed7 48#define LIST_PREPEND(t,name,head,item) \
60918275
LP
49 do { \
50 t **_head = &(head), *_item = (item); \
51 assert(_item); \
034c6ed7
LP
52 if ((_item->name##_next = *_head)) \
53 _item->name##_next->name##_prev = _item; \
54 _item->name##_prev = NULL; \
60918275
LP
55 *_head = _item; \
56 } while(false)
57
58/* Remove an item from the list */
034c6ed7 59#define LIST_REMOVE(t,name,head,item) \
60918275
LP
60 do { \
61 t **_head = &(head), *_item = (item); \
62 assert(_item); \
034c6ed7
LP
63 if (_item->name##_next) \
64 _item->name##_next->name##_prev = _item->name##_prev; \
65 if (_item->name##_prev) \
66 _item->name##_prev->name##_next = _item->name##_next; \
60918275
LP
67 else { \
68 assert(*_head == _item); \
034c6ed7 69 *_head = _item->name##_next; \
60918275 70 } \
034c6ed7 71 _item->name##_next = _item->name##_prev = NULL; \
60918275
LP
72 } while(false)
73
74/* Find the head of the list */
034c6ed7 75#define LIST_FIND_HEAD(t,name,item,head) \
60918275 76 do { \
034c6ed7
LP
77 t *_item = (item); \
78 assert(_item); \
95e26a69 79 while (_item->name##_prev) \
034c6ed7
LP
80 _item = _item->name##_prev; \
81 (head) = _item; \
82 } while (false)
83
84/* Find the head of the list */
85#define LIST_FIND_TAIL(t,name,item,tail) \
86 do { \
87 t *_item = (item); \
88 assert(_item); \
89 while (_item->name##_next) \
90 _item = _item->name##_next; \
91 (tail) = _item; \
60918275
LP
92 } while (false)
93
94/* Insert an item after another one (a = where, b = what) */
034c6ed7 95#define LIST_INSERT_AFTER(t,name,head,a,b) \
60918275
LP
96 do { \
97 t **_head = &(head), *_a = (a), *_b = (b); \
98 assert(_b); \
99 if (!_a) { \
034c6ed7
LP
100 if ((_b->name##_next = *_head)) \
101 _b->name##_next->name##_prev = _b; \
102 _b->name##_prev = NULL; \
60918275
LP
103 *_head = _b; \
104 } else { \
034c6ed7
LP
105 if ((_b->name##_next = _a->name##_next)) \
106 _b->name##_next->name##_prev = _b; \
107 _b->name##_prev = _a; \
108 _a->name##_next = _b; \
60918275
LP
109 } \
110 } while(false)
111
6210e7fc
LP
112#define LIST_JUST_US(name,item) \
113 (!(item)->name##_prev && !(item)->name##_next) \
114
034c6ed7
LP
115#define LIST_FOREACH(name,i,head) \
116 for ((i) = (head); (i); (i) = (i)->name##_next)
60918275 117
034c6ed7
LP
118#define LIST_FOREACH_SAFE(name,i,n,head) \
119 for ((i) = (head); (i) && (((n) = (i)->name##_next), 1); (i) = (n))
60918275 120
e04aad61
LP
121#define LIST_FOREACH_BEFORE(name,i,p) \
122 for ((i) = (p)->name##_prev; (i); (i) = (i)->name##_prev)
123
124#define LIST_FOREACH_AFTER(name,i,p) \
125 for ((i) = (p)->name##_next; (i); (i) = (i)->name##_next)