xref: /aosp_15_r20/external/iproute2/include/list.h (revision de1e4e894b0c224df933550f0afdecc354b238c4)
1*de1e4e89SAndroid Build Coastguard Worker #ifndef __LIST_H__
2*de1e4e89SAndroid Build Coastguard Worker #define __LIST_H__ 1
3*de1e4e89SAndroid Build Coastguard Worker /* List and hash list stuff from kernel */
4*de1e4e89SAndroid Build Coastguard Worker 
5*de1e4e89SAndroid Build Coastguard Worker #include <stddef.h>
6*de1e4e89SAndroid Build Coastguard Worker 
7*de1e4e89SAndroid Build Coastguard Worker #define container_of(ptr, type, member) ({			\
8*de1e4e89SAndroid Build Coastguard Worker 	const typeof( ((type *)0)->member ) *__mptr = (ptr);	\
9*de1e4e89SAndroid Build Coastguard Worker 	(type *)( (char *)__mptr - offsetof(type,member) );})
10*de1e4e89SAndroid Build Coastguard Worker 
11*de1e4e89SAndroid Build Coastguard Worker struct list_head {
12*de1e4e89SAndroid Build Coastguard Worker 	struct list_head *next, *prev;
13*de1e4e89SAndroid Build Coastguard Worker };
14*de1e4e89SAndroid Build Coastguard Worker 
INIT_LIST_HEAD(struct list_head * list)15*de1e4e89SAndroid Build Coastguard Worker static inline void INIT_LIST_HEAD(struct list_head *list)
16*de1e4e89SAndroid Build Coastguard Worker {
17*de1e4e89SAndroid Build Coastguard Worker 	list->next = list;
18*de1e4e89SAndroid Build Coastguard Worker 	list->prev = list;
19*de1e4e89SAndroid Build Coastguard Worker }
20*de1e4e89SAndroid Build Coastguard Worker 
__list_add(struct list_head * new,struct list_head * prev,struct list_head * next)21*de1e4e89SAndroid Build Coastguard Worker static inline void __list_add(struct list_head *new,
22*de1e4e89SAndroid Build Coastguard Worker 			      struct list_head *prev,
23*de1e4e89SAndroid Build Coastguard Worker 			      struct list_head *next)
24*de1e4e89SAndroid Build Coastguard Worker {
25*de1e4e89SAndroid Build Coastguard Worker 	next->prev = new;
26*de1e4e89SAndroid Build Coastguard Worker 	new->next = next;
27*de1e4e89SAndroid Build Coastguard Worker 	new->prev = prev;
28*de1e4e89SAndroid Build Coastguard Worker 	prev->next = new;
29*de1e4e89SAndroid Build Coastguard Worker }
30*de1e4e89SAndroid Build Coastguard Worker 
list_add(struct list_head * new,struct list_head * head)31*de1e4e89SAndroid Build Coastguard Worker static inline void list_add(struct list_head *new, struct list_head *head)
32*de1e4e89SAndroid Build Coastguard Worker {
33*de1e4e89SAndroid Build Coastguard Worker 	__list_add(new, head, head->next);
34*de1e4e89SAndroid Build Coastguard Worker }
35*de1e4e89SAndroid Build Coastguard Worker 
list_add_tail(struct list_head * new,struct list_head * head)36*de1e4e89SAndroid Build Coastguard Worker static inline void list_add_tail(struct list_head *new, struct list_head *head)
37*de1e4e89SAndroid Build Coastguard Worker {
38*de1e4e89SAndroid Build Coastguard Worker 	__list_add(new, head->prev, head);
39*de1e4e89SAndroid Build Coastguard Worker }
40*de1e4e89SAndroid Build Coastguard Worker 
__list_del(struct list_head * prev,struct list_head * next)41*de1e4e89SAndroid Build Coastguard Worker static inline void __list_del(struct list_head *prev, struct list_head *next)
42*de1e4e89SAndroid Build Coastguard Worker {
43*de1e4e89SAndroid Build Coastguard Worker 	next->prev = prev;
44*de1e4e89SAndroid Build Coastguard Worker 	prev->next = next;
45*de1e4e89SAndroid Build Coastguard Worker }
46*de1e4e89SAndroid Build Coastguard Worker 
list_del(struct list_head * entry)47*de1e4e89SAndroid Build Coastguard Worker static inline void list_del(struct list_head *entry)
48*de1e4e89SAndroid Build Coastguard Worker {
49*de1e4e89SAndroid Build Coastguard Worker 	__list_del(entry->prev, entry->next);
50*de1e4e89SAndroid Build Coastguard Worker }
51*de1e4e89SAndroid Build Coastguard Worker 
52*de1e4e89SAndroid Build Coastguard Worker #define list_entry(ptr, type, member) \
53*de1e4e89SAndroid Build Coastguard Worker 	container_of(ptr, type, member)
54*de1e4e89SAndroid Build Coastguard Worker 
55*de1e4e89SAndroid Build Coastguard Worker #define list_first_entry(ptr, type, member) \
56*de1e4e89SAndroid Build Coastguard Worker 	list_entry((ptr)->next, type, member)
57*de1e4e89SAndroid Build Coastguard Worker 
58*de1e4e89SAndroid Build Coastguard Worker #define list_last_entry(ptr, type, member) \
59*de1e4e89SAndroid Build Coastguard Worker 	list_entry((ptr)->prev, type, member)
60*de1e4e89SAndroid Build Coastguard Worker 
61*de1e4e89SAndroid Build Coastguard Worker #define list_next_entry(pos, member) \
62*de1e4e89SAndroid Build Coastguard Worker 	list_entry((pos)->member.next, typeof(*(pos)), member)
63*de1e4e89SAndroid Build Coastguard Worker 
64*de1e4e89SAndroid Build Coastguard Worker #define list_prev_entry(pos, member) \
65*de1e4e89SAndroid Build Coastguard Worker 	list_entry((pos)->member.prev, typeof(*(pos)), member)
66*de1e4e89SAndroid Build Coastguard Worker 
67*de1e4e89SAndroid Build Coastguard Worker #define list_for_each_entry(pos, head, member)				\
68*de1e4e89SAndroid Build Coastguard Worker 	for (pos = list_first_entry(head, typeof(*pos), member);	\
69*de1e4e89SAndroid Build Coastguard Worker 	     &pos->member != (head);					\
70*de1e4e89SAndroid Build Coastguard Worker 	     pos = list_next_entry(pos, member))
71*de1e4e89SAndroid Build Coastguard Worker 
72*de1e4e89SAndroid Build Coastguard Worker #define list_for_each_entry_safe(pos, n, head, member)			\
73*de1e4e89SAndroid Build Coastguard Worker 	for (pos = list_first_entry(head, typeof(*pos), member),	\
74*de1e4e89SAndroid Build Coastguard Worker 		n = list_next_entry(pos, member);			\
75*de1e4e89SAndroid Build Coastguard Worker 	     &pos->member != (head);					\
76*de1e4e89SAndroid Build Coastguard Worker 	     pos = n, n = list_next_entry(n, member))
77*de1e4e89SAndroid Build Coastguard Worker 
78*de1e4e89SAndroid Build Coastguard Worker #define list_for_each_entry_reverse(pos, head, member)			\
79*de1e4e89SAndroid Build Coastguard Worker 	for (pos = list_last_entry(head, typeof(*pos), member);		\
80*de1e4e89SAndroid Build Coastguard Worker 	     &pos->member != (head);					\
81*de1e4e89SAndroid Build Coastguard Worker 	     pos = list_prev_entry(pos, member))
82*de1e4e89SAndroid Build Coastguard Worker 
83*de1e4e89SAndroid Build Coastguard Worker struct hlist_head {
84*de1e4e89SAndroid Build Coastguard Worker 	struct hlist_node *first;
85*de1e4e89SAndroid Build Coastguard Worker };
86*de1e4e89SAndroid Build Coastguard Worker 
87*de1e4e89SAndroid Build Coastguard Worker struct hlist_node {
88*de1e4e89SAndroid Build Coastguard Worker 	struct hlist_node *next, **pprev;
89*de1e4e89SAndroid Build Coastguard Worker };
90*de1e4e89SAndroid Build Coastguard Worker 
hlist_del(struct hlist_node * n)91*de1e4e89SAndroid Build Coastguard Worker static inline void hlist_del(struct hlist_node *n)
92*de1e4e89SAndroid Build Coastguard Worker {
93*de1e4e89SAndroid Build Coastguard Worker 	struct hlist_node *next = n->next;
94*de1e4e89SAndroid Build Coastguard Worker 	struct hlist_node **pprev = n->pprev;
95*de1e4e89SAndroid Build Coastguard Worker 	*pprev = next;
96*de1e4e89SAndroid Build Coastguard Worker 	if (next)
97*de1e4e89SAndroid Build Coastguard Worker 		next->pprev = pprev;
98*de1e4e89SAndroid Build Coastguard Worker }
99*de1e4e89SAndroid Build Coastguard Worker 
hlist_add_head(struct hlist_node * n,struct hlist_head * h)100*de1e4e89SAndroid Build Coastguard Worker static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h)
101*de1e4e89SAndroid Build Coastguard Worker {
102*de1e4e89SAndroid Build Coastguard Worker 	struct hlist_node *first = h->first;
103*de1e4e89SAndroid Build Coastguard Worker 	n->next = first;
104*de1e4e89SAndroid Build Coastguard Worker 	if (first)
105*de1e4e89SAndroid Build Coastguard Worker 		first->pprev = &n->next;
106*de1e4e89SAndroid Build Coastguard Worker 	h->first = n;
107*de1e4e89SAndroid Build Coastguard Worker 	n->pprev = &h->first;
108*de1e4e89SAndroid Build Coastguard Worker }
109*de1e4e89SAndroid Build Coastguard Worker 
110*de1e4e89SAndroid Build Coastguard Worker #define hlist_for_each(pos, head) \
111*de1e4e89SAndroid Build Coastguard Worker 	for (pos = (head)->first; pos ; pos = pos->next)
112*de1e4e89SAndroid Build Coastguard Worker 
113*de1e4e89SAndroid Build Coastguard Worker 
114*de1e4e89SAndroid Build Coastguard Worker #define hlist_for_each_safe(pos, n, head) \
115*de1e4e89SAndroid Build Coastguard Worker 	for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \
116*de1e4e89SAndroid Build Coastguard Worker 	     pos = n)
117*de1e4e89SAndroid Build Coastguard Worker 
118*de1e4e89SAndroid Build Coastguard Worker #define hlist_entry_safe(ptr, type, member) \
119*de1e4e89SAndroid Build Coastguard Worker 	({ typeof(ptr) ____ptr = (ptr); \
120*de1e4e89SAndroid Build Coastguard Worker 	   ____ptr ? hlist_entry(____ptr, type, member) : NULL; \
121*de1e4e89SAndroid Build Coastguard Worker 	})
122*de1e4e89SAndroid Build Coastguard Worker 
123*de1e4e89SAndroid Build Coastguard Worker #define hlist_for_each_entry(pos, head, member)				\
124*de1e4e89SAndroid Build Coastguard Worker 	for (pos = hlist_entry_safe((head)->first, typeof(*(pos)), member);\
125*de1e4e89SAndroid Build Coastguard Worker 	     pos;							\
126*de1e4e89SAndroid Build Coastguard Worker 	     pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))
127*de1e4e89SAndroid Build Coastguard Worker 
128*de1e4e89SAndroid Build Coastguard Worker #endif /* __LIST_H__ */
129