blob: bfd92a747b9618f9387a8e6df444eb195d865c88 [file] [log] [blame]
Patrick Georgiafd4c872020-05-05 23:43:18 +02001/* Taken from depthcharge: src/base/list.h */
Patrick Georgiac959032020-05-05 22:49:26 +02002/* SPDX-License-Identifier: GPL-2.0-or-later */
Patrick Rudolph67aca3e2018-04-12 11:44:43 +02003
Patrick Rudolph666c1722018-04-03 09:57:33 +02004#ifndef __LIST_H__
5#define __LIST_H__
Patrick Rudolph67aca3e2018-04-12 11:44:43 +02006
Patrick Rudolph666c1722018-04-03 09:57:33 +02007struct list_node {
8 struct list_node *next;
9 struct list_node *prev;
10};
Patrick Rudolph67aca3e2018-04-12 11:44:43 +020011
Patrick Rudolph666c1722018-04-03 09:57:33 +020012// Remove list_node node from the doubly linked list it's a part of.
13void list_remove(struct list_node *node);
14// Insert list_node node after list_node after in a doubly linked list.
15void list_insert_after(struct list_node *node, struct list_node *after);
16// Insert list_node node before list_node before in a doubly linked list.
17void list_insert_before(struct list_node *node, struct list_node *before);
Raul E Rangel4c8c8442021-11-01 13:40:14 -060018// Appends the node to the end of the list.
19void list_append(struct list_node *node, struct list_node *head);
Patrick Rudolph67aca3e2018-04-12 11:44:43 +020020
Patrick Rudolph88991ca2020-08-19 08:40:31 +020021#define list_for_each(ptr, head, member) \
22 for ((ptr) = container_of((head).next, typeof(*(ptr)), member); \
23 (uintptr_t)ptr + (uintptr_t)offsetof(typeof(*(ptr)), member); \
24 (ptr) = container_of((ptr)->member.next, \
Patrick Rudolph67aca3e2018-04-12 11:44:43 +020025 typeof(*(ptr)), member))
26
Patrick Rudolph666c1722018-04-03 09:57:33 +020027#endif /* __LIST_H__ */