blob: 41c540a0e11532db880deb366cc6bd5273f9458f [file] [log] [blame]
Ken Liu2c47f7f2021-01-22 11:06:04 +08001/*
2 * Copyright (c) 2018-2021, Arm Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7#ifndef __LISTS_H__
8#define __LISTS_H__
9
10/* Bi-directional list structure */
11struct bi_list_node_t {
12 struct bi_list_node_t *prev;
13 struct bi_list_node_t *next;
14};
15
16/* Init an empty node. */
17#define BI_LIST_INIT_NODE(node) do { \
18 (node)->next = node; \
19 (node)->prev = node; \
20} while(0)
21
22/* Insert a new node after (next) current. */
23#define BI_LIST_INSERT_AFTER(curr, node) do { \
24 (node)->next = (curr)->next; \
25 (node)->prev = curr; \
26 (curr)->next->prev = node; \
27 (curr)->next = node; \
28} while(0)
29
30/* Add one node into list as the tail (prev) of head. */
31#define BI_LIST_INSERT_BEFORE(curr, node) do { \
32 (curr)->prev->next = node; \
33 (node)->prev = (curr)->prev; \
34 (curr)->prev = node; \
35 (node)->next = curr; \
36} while(0)
37
38/* Remove one node from the list. */
39#define BI_LIST_REMOVE_NODE(node) do { \
40 (node)->prev->next = (node)->next; \
41 (node)->next->prev = (node)->prev; \
42} while(0)
43
44/* Is the head empty? */
45#define BI_LIST_IS_EMPTY(head) ((head)->next == (head))
46
47/* The node's next node */
48#define BI_LIST_NEXT_NODE(node) ((node)->next)
49
50/* Go through each node of a list */
51#define BI_LIST_FOR_EACH(node, head) \
52 for (node = (head)->next; node != head; node = (node)->next)
53
54#endif /* __LISTS_H__ */