Patrick Georgi | afd4c87 | 2020-05-05 23:43:18 +0200 | [diff] [blame] | 1 | /* Taken from depthcharge: src/base/list.h */ |
Patrick Georgi | ac95903 | 2020-05-05 22:49:26 +0200 | [diff] [blame] | 2 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
Patrick Rudolph | 67aca3e | 2018-04-12 11:44:43 +0200 | [diff] [blame] | 3 | |
Patrick Rudolph | 666c172 | 2018-04-03 09:57:33 +0200 | [diff] [blame] | 4 | #ifndef __LIST_H__ |
| 5 | #define __LIST_H__ |
Patrick Rudolph | 67aca3e | 2018-04-12 11:44:43 +0200 | [diff] [blame] | 6 | |
| 7 | #include <stddef.h> |
| 8 | #include <stdint.h> |
| 9 | |
Patrick Rudolph | 666c172 | 2018-04-03 09:57:33 +0200 | [diff] [blame] | 10 | struct list_node { |
| 11 | struct list_node *next; |
| 12 | struct list_node *prev; |
| 13 | }; |
Patrick Rudolph | 67aca3e | 2018-04-12 11:44:43 +0200 | [diff] [blame] | 14 | |
Patrick Rudolph | 666c172 | 2018-04-03 09:57:33 +0200 | [diff] [blame] | 15 | // Remove list_node node from the doubly linked list it's a part of. |
| 16 | void list_remove(struct list_node *node); |
| 17 | // Insert list_node node after list_node after in a doubly linked list. |
| 18 | void list_insert_after(struct list_node *node, struct list_node *after); |
| 19 | // Insert list_node node before list_node before in a doubly linked list. |
| 20 | void list_insert_before(struct list_node *node, struct list_node *before); |
Patrick Rudolph | 67aca3e | 2018-04-12 11:44:43 +0200 | [diff] [blame] | 21 | |
| 22 | #define list_for_each(ptr, head, member) \ |
| 23 | for ((ptr) = container_of((head).next, typeof(*(ptr)), member); \ |
| 24 | &((ptr)->member); \ |
| 25 | (ptr) = container_of((ptr)->member.next, \ |
| 26 | typeof(*(ptr)), member)) |
| 27 | |
Patrick Rudolph | 666c172 | 2018-04-03 09:57:33 +0200 | [diff] [blame] | 28 | #endif /* __LIST_H__ */ |