xref: /aosp_15_r20/external/libnl/include/netlink/list.h (revision 4dc78e53d49367fa8e61b07018507c90983a077d)
1*4dc78e53SAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1-only */
2*4dc78e53SAndroid Build Coastguard Worker /*
3*4dc78e53SAndroid Build Coastguard Worker  * Copyright (c) 2003-2006 Thomas Graf <[email protected]>
4*4dc78e53SAndroid Build Coastguard Worker  */
5*4dc78e53SAndroid Build Coastguard Worker 
6*4dc78e53SAndroid Build Coastguard Worker #ifndef NETLINK_LIST_H_
7*4dc78e53SAndroid Build Coastguard Worker #define NETLINK_LIST_H_
8*4dc78e53SAndroid Build Coastguard Worker 
9*4dc78e53SAndroid Build Coastguard Worker #include <stddef.h>
10*4dc78e53SAndroid Build Coastguard Worker 
11*4dc78e53SAndroid Build Coastguard Worker #ifdef __cplusplus
12*4dc78e53SAndroid Build Coastguard Worker extern "C" {
13*4dc78e53SAndroid Build Coastguard Worker #endif
14*4dc78e53SAndroid Build Coastguard Worker 
15*4dc78e53SAndroid Build Coastguard Worker struct nl_list_head
16*4dc78e53SAndroid Build Coastguard Worker {
17*4dc78e53SAndroid Build Coastguard Worker 	struct nl_list_head *	next;
18*4dc78e53SAndroid Build Coastguard Worker 	struct nl_list_head *	prev;
19*4dc78e53SAndroid Build Coastguard Worker };
20*4dc78e53SAndroid Build Coastguard Worker 
NL_INIT_LIST_HEAD(struct nl_list_head * list)21*4dc78e53SAndroid Build Coastguard Worker static inline void NL_INIT_LIST_HEAD(struct nl_list_head *list)
22*4dc78e53SAndroid Build Coastguard Worker {
23*4dc78e53SAndroid Build Coastguard Worker 	list->next = list;
24*4dc78e53SAndroid Build Coastguard Worker 	list->prev = list;
25*4dc78e53SAndroid Build Coastguard Worker }
26*4dc78e53SAndroid Build Coastguard Worker 
__nl_list_add(struct nl_list_head * obj,struct nl_list_head * prev,struct nl_list_head * next)27*4dc78e53SAndroid Build Coastguard Worker static inline void __nl_list_add(struct nl_list_head *obj,
28*4dc78e53SAndroid Build Coastguard Worker 				 struct nl_list_head *prev,
29*4dc78e53SAndroid Build Coastguard Worker 				 struct nl_list_head *next)
30*4dc78e53SAndroid Build Coastguard Worker {
31*4dc78e53SAndroid Build Coastguard Worker 	prev->next = obj;
32*4dc78e53SAndroid Build Coastguard Worker 	obj->prev = prev;
33*4dc78e53SAndroid Build Coastguard Worker 	next->prev = obj;
34*4dc78e53SAndroid Build Coastguard Worker 	obj->next = next;
35*4dc78e53SAndroid Build Coastguard Worker }
36*4dc78e53SAndroid Build Coastguard Worker 
nl_list_add_tail(struct nl_list_head * obj,struct nl_list_head * head)37*4dc78e53SAndroid Build Coastguard Worker static inline void nl_list_add_tail(struct nl_list_head *obj,
38*4dc78e53SAndroid Build Coastguard Worker 				    struct nl_list_head *head)
39*4dc78e53SAndroid Build Coastguard Worker {
40*4dc78e53SAndroid Build Coastguard Worker 	__nl_list_add(obj, head->prev, head);
41*4dc78e53SAndroid Build Coastguard Worker }
42*4dc78e53SAndroid Build Coastguard Worker 
nl_list_add_head(struct nl_list_head * obj,struct nl_list_head * head)43*4dc78e53SAndroid Build Coastguard Worker static inline void nl_list_add_head(struct nl_list_head *obj,
44*4dc78e53SAndroid Build Coastguard Worker 				    struct nl_list_head *head)
45*4dc78e53SAndroid Build Coastguard Worker {
46*4dc78e53SAndroid Build Coastguard Worker 	__nl_list_add(obj, head, head->next);
47*4dc78e53SAndroid Build Coastguard Worker }
48*4dc78e53SAndroid Build Coastguard Worker 
nl_list_del(struct nl_list_head * obj)49*4dc78e53SAndroid Build Coastguard Worker static inline void nl_list_del(struct nl_list_head *obj)
50*4dc78e53SAndroid Build Coastguard Worker {
51*4dc78e53SAndroid Build Coastguard Worker 	obj->next->prev = obj->prev;
52*4dc78e53SAndroid Build Coastguard Worker 	obj->prev->next = obj->next;
53*4dc78e53SAndroid Build Coastguard Worker }
54*4dc78e53SAndroid Build Coastguard Worker 
nl_list_empty(struct nl_list_head * head)55*4dc78e53SAndroid Build Coastguard Worker static inline int nl_list_empty(struct nl_list_head *head)
56*4dc78e53SAndroid Build Coastguard Worker {
57*4dc78e53SAndroid Build Coastguard Worker 	return head->next == head;
58*4dc78e53SAndroid Build Coastguard Worker }
59*4dc78e53SAndroid Build Coastguard Worker 
60*4dc78e53SAndroid Build Coastguard Worker #define nl_container_of(ptr, type, member) ({			\
61*4dc78e53SAndroid Build Coastguard Worker         const __typeof__( ((type *)0)->member ) *__mptr = (ptr);\
62*4dc78e53SAndroid Build Coastguard Worker         (type *)( (char *)__mptr - (offsetof(type, member)));})
63*4dc78e53SAndroid Build Coastguard Worker 
64*4dc78e53SAndroid Build Coastguard Worker #define nl_list_entry(ptr, type, member) \
65*4dc78e53SAndroid Build Coastguard Worker 	nl_container_of(ptr, type, member)
66*4dc78e53SAndroid Build Coastguard Worker 
67*4dc78e53SAndroid Build Coastguard Worker #define nl_list_at_tail(pos, head, member) \
68*4dc78e53SAndroid Build Coastguard Worker 	((pos)->member.next == (head))
69*4dc78e53SAndroid Build Coastguard Worker 
70*4dc78e53SAndroid Build Coastguard Worker #define nl_list_at_head(pos, head, member) \
71*4dc78e53SAndroid Build Coastguard Worker 	((pos)->member.prev == (head))
72*4dc78e53SAndroid Build Coastguard Worker 
73*4dc78e53SAndroid Build Coastguard Worker #define NL_LIST_HEAD(name) \
74*4dc78e53SAndroid Build Coastguard Worker 	struct nl_list_head name = { &(name), &(name) }
75*4dc78e53SAndroid Build Coastguard Worker 
76*4dc78e53SAndroid Build Coastguard Worker #define nl_list_first_entry(head, type, member)			\
77*4dc78e53SAndroid Build Coastguard Worker 	nl_list_entry((head)->next, type, member)
78*4dc78e53SAndroid Build Coastguard Worker 
79*4dc78e53SAndroid Build Coastguard Worker #define nl_list_for_each_entry(pos, head, member)				\
80*4dc78e53SAndroid Build Coastguard Worker 	for (pos = nl_list_entry((head)->next, __typeof__(*pos), member);	\
81*4dc78e53SAndroid Build Coastguard Worker 	     &(pos)->member != (head); 	\
82*4dc78e53SAndroid Build Coastguard Worker 	     (pos) = nl_list_entry((pos)->member.next, __typeof__(*(pos)), member))
83*4dc78e53SAndroid Build Coastguard Worker 
84*4dc78e53SAndroid Build Coastguard Worker #define nl_list_for_each_entry_safe(pos, n, head, member)			\
85*4dc78e53SAndroid Build Coastguard Worker 	for (pos = nl_list_entry((head)->next, __typeof__(*pos), member),	\
86*4dc78e53SAndroid Build Coastguard Worker 		n = nl_list_entry(pos->member.next, __typeof__(*pos), member);	\
87*4dc78e53SAndroid Build Coastguard Worker 	     &(pos)->member != (head); 					\
88*4dc78e53SAndroid Build Coastguard Worker 	     pos = n, n = nl_list_entry(n->member.next, __typeof__(*n), member))
89*4dc78e53SAndroid Build Coastguard Worker 
90*4dc78e53SAndroid Build Coastguard Worker #define nl_init_list_head(head) \
91*4dc78e53SAndroid Build Coastguard Worker 	do { (head)->next = (head); (head)->prev = (head); } while (0)
92*4dc78e53SAndroid Build Coastguard Worker 
93*4dc78e53SAndroid Build Coastguard Worker #ifdef __cplusplus
94*4dc78e53SAndroid Build Coastguard Worker }
95*4dc78e53SAndroid Build Coastguard Worker #endif
96*4dc78e53SAndroid Build Coastguard Worker 
97*4dc78e53SAndroid Build Coastguard Worker #endif
98