blob: c0962c56212b22b2dc519b7027d0905474032caa [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
Mingyang Sune5c151d2021-05-25 21:04:12 +080010/********* Bi-directional list operations ********/
Ken Liu2c47f7f2021-01-22 11:06:04 +080011/* Bi-directional list structure */
12struct bi_list_node_t {
Mingyang Sune5c151d2021-05-25 21:04:12 +080013 struct bi_list_node_t *bprev;
14 struct bi_list_node_t *bnext;
Ken Liu2c47f7f2021-01-22 11:06:04 +080015};
16
17/* Init an empty node. */
18#define BI_LIST_INIT_NODE(node) do { \
Mingyang Sune5c151d2021-05-25 21:04:12 +080019 (node)->bnext = node; \
20 (node)->bprev = node; \
21} while (0)
Ken Liu2c47f7f2021-01-22 11:06:04 +080022
Mingyang Sune5c151d2021-05-25 21:04:12 +080023/* Insert a new node after current node: (bnext) of current. */
Ken Liu2c47f7f2021-01-22 11:06:04 +080024#define BI_LIST_INSERT_AFTER(curr, node) do { \
Mingyang Sune5c151d2021-05-25 21:04:12 +080025 (node)->bnext = (curr)->bnext; \
26 (node)->bprev = curr; \
27 (curr)->bnext->bprev = node; \
28 (curr)->bnext = node; \
29} while (0)
Ken Liu2c47f7f2021-01-22 11:06:04 +080030
Mingyang Sune5c151d2021-05-25 21:04:12 +080031/* Add one node into list as the tail: (bprev) of head. */
Ken Liu2c47f7f2021-01-22 11:06:04 +080032#define BI_LIST_INSERT_BEFORE(curr, node) do { \
Mingyang Sune5c151d2021-05-25 21:04:12 +080033 (curr)->bprev->bnext = node; \
34 (node)->bprev = (curr)->bprev; \
35 (curr)->bprev = node; \
36 (node)->bnext = curr; \
37} while (0)
Ken Liu2c47f7f2021-01-22 11:06:04 +080038
39/* Remove one node from the list. */
Mingyang Sune5c151d2021-05-25 21:04:12 +080040#define BI_LIST_REMOVE_NODE(node) do { \
41 (node)->bprev->bnext = (node)->bnext; \
42 (node)->bnext->bprev = (node)->bprev; \
43} while (0)
Ken Liu2c47f7f2021-01-22 11:06:04 +080044
45/* Is the head empty? */
Mingyang Sune5c151d2021-05-25 21:04:12 +080046#define BI_LIST_IS_EMPTY(head) ((head)->bnext == (head))
Ken Liu2c47f7f2021-01-22 11:06:04 +080047
48/* The node's next node */
Mingyang Sune5c151d2021-05-25 21:04:12 +080049#define BI_LIST_NEXT_NODE(node) ((node)->bnext)
Ken Liu2c47f7f2021-01-22 11:06:04 +080050
51/* Go through each node of a list */
52#define BI_LIST_FOR_EACH(node, head) \
Mingyang Sune5c151d2021-05-25 21:04:12 +080053 for (node = (head)->bnext; node != head; node = (node)->bnext)
54
55/********* Uni-directional list operations ********/
56/*
57 * To use these single linked list operations, a head node must have been
58 * defined already, and the "next" pointer initialized to "NULL". Like:
59 * struct head_t {
60 * uint32_t data;
61 * User_Type *next;
62 * } head;
63 */
64
65/* Initialize the head node */
66#define UNI_LISI_INIT_HEAD(head) do { \
Mingyang Sun40c63592021-06-30 19:08:48 +080067 if ((head) != NULL) { \
Mingyang Sune5c151d2021-05-25 21:04:12 +080068 (head)->next = NULL; \
69 } \
70} while (0)
71
72/* Insert a node after current node */
73#define UNI_LIST_INSERT_AFTER(curr, node) do { \
74 (node)->next = (curr)->next; \
75 (curr)->next = node; \
76} while (0)
77
78/* Go through each node of a list */
79#define UNI_LIST_FOR_EACH(node, head) \
80 for (node = (head)->next; node != NULL; node = (node)->next)
Ken Liu2c47f7f2021-01-22 11:06:04 +080081
82#endif /* __LISTS_H__ */