xref: /aosp_15_r20/external/igt-gpu-tools/lib/igt_list.h (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker  * Copyright © 2015 Intel Corporation
3*d83cc019SAndroid Build Coastguard Worker  *
4*d83cc019SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*d83cc019SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*d83cc019SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*d83cc019SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*d83cc019SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*d83cc019SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*d83cc019SAndroid Build Coastguard Worker  *
11*d83cc019SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*d83cc019SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*d83cc019SAndroid Build Coastguard Worker  * Software.
14*d83cc019SAndroid Build Coastguard Worker  *
15*d83cc019SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*d83cc019SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*d83cc019SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*d83cc019SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*d83cc019SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*d83cc019SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*d83cc019SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*d83cc019SAndroid Build Coastguard Worker  *
23*d83cc019SAndroid Build Coastguard Worker  */
24*d83cc019SAndroid Build Coastguard Worker 
25*d83cc019SAndroid Build Coastguard Worker #ifndef IGT_LIST_H
26*d83cc019SAndroid Build Coastguard Worker #define IGT_LIST_H
27*d83cc019SAndroid Build Coastguard Worker 
28*d83cc019SAndroid Build Coastguard Worker #include <stdbool.h>
29*d83cc019SAndroid Build Coastguard Worker #include <stddef.h>
30*d83cc019SAndroid Build Coastguard Worker 
31*d83cc019SAndroid Build Coastguard Worker /*
32*d83cc019SAndroid Build Coastguard Worker  * This list data structure is a verbatim copy from wayland-util.h from the
33*d83cc019SAndroid Build Coastguard Worker  * Wayland project; except that wl_ prefix has been removed.
34*d83cc019SAndroid Build Coastguard Worker  */
35*d83cc019SAndroid Build Coastguard Worker 
36*d83cc019SAndroid Build Coastguard Worker struct igt_list {
37*d83cc019SAndroid Build Coastguard Worker 	struct igt_list *prev;
38*d83cc019SAndroid Build Coastguard Worker 	struct igt_list *next;
39*d83cc019SAndroid Build Coastguard Worker };
40*d83cc019SAndroid Build Coastguard Worker 
41*d83cc019SAndroid Build Coastguard Worker #define __IGT_INIT_LIST(name) { &(name), &(name) }
42*d83cc019SAndroid Build Coastguard Worker #define IGT_LIST(name) struct igt_list name = __IGT_INIT_LIST(name)
43*d83cc019SAndroid Build Coastguard Worker 
igt_list_init(struct igt_list * list)44*d83cc019SAndroid Build Coastguard Worker static inline void igt_list_init(struct igt_list *list)
45*d83cc019SAndroid Build Coastguard Worker {
46*d83cc019SAndroid Build Coastguard Worker 	list->prev = list;
47*d83cc019SAndroid Build Coastguard Worker 	list->next = list;
48*d83cc019SAndroid Build Coastguard Worker }
49*d83cc019SAndroid Build Coastguard Worker 
__igt_list_add(struct igt_list * list,struct igt_list * prev,struct igt_list * next)50*d83cc019SAndroid Build Coastguard Worker static inline void __igt_list_add(struct igt_list *list,
51*d83cc019SAndroid Build Coastguard Worker 				  struct igt_list *prev,
52*d83cc019SAndroid Build Coastguard Worker 				  struct igt_list *next)
53*d83cc019SAndroid Build Coastguard Worker {
54*d83cc019SAndroid Build Coastguard Worker 	next->prev = list;
55*d83cc019SAndroid Build Coastguard Worker 	list->next = next;
56*d83cc019SAndroid Build Coastguard Worker 	list->prev = prev;
57*d83cc019SAndroid Build Coastguard Worker 	prev->next = list;
58*d83cc019SAndroid Build Coastguard Worker }
59*d83cc019SAndroid Build Coastguard Worker 
igt_list_add(struct igt_list * elm,struct igt_list * list)60*d83cc019SAndroid Build Coastguard Worker static inline void igt_list_add(struct igt_list *elm, struct igt_list *list)
61*d83cc019SAndroid Build Coastguard Worker {
62*d83cc019SAndroid Build Coastguard Worker 	__igt_list_add(elm, list, list->next);
63*d83cc019SAndroid Build Coastguard Worker }
64*d83cc019SAndroid Build Coastguard Worker 
igt_list_add_tail(struct igt_list * elm,struct igt_list * list)65*d83cc019SAndroid Build Coastguard Worker static inline void igt_list_add_tail(struct igt_list *elm,
66*d83cc019SAndroid Build Coastguard Worker 				     struct igt_list *list)
67*d83cc019SAndroid Build Coastguard Worker {
68*d83cc019SAndroid Build Coastguard Worker 	__igt_list_add(elm, list->prev, list);
69*d83cc019SAndroid Build Coastguard Worker }
70*d83cc019SAndroid Build Coastguard Worker 
__igt_list_del(struct igt_list * prev,struct igt_list * next)71*d83cc019SAndroid Build Coastguard Worker static inline void __igt_list_del(struct igt_list *prev, struct igt_list *next)
72*d83cc019SAndroid Build Coastguard Worker {
73*d83cc019SAndroid Build Coastguard Worker 	next->prev = prev;
74*d83cc019SAndroid Build Coastguard Worker 	prev->next = next;
75*d83cc019SAndroid Build Coastguard Worker }
76*d83cc019SAndroid Build Coastguard Worker 
igt_list_del(struct igt_list * elm)77*d83cc019SAndroid Build Coastguard Worker static inline void igt_list_del(struct igt_list *elm)
78*d83cc019SAndroid Build Coastguard Worker {
79*d83cc019SAndroid Build Coastguard Worker 	__igt_list_del(elm->prev, elm->next);
80*d83cc019SAndroid Build Coastguard Worker }
81*d83cc019SAndroid Build Coastguard Worker 
igt_list_move(struct igt_list * elm,struct igt_list * list)82*d83cc019SAndroid Build Coastguard Worker static inline void igt_list_move(struct igt_list *elm, struct igt_list *list)
83*d83cc019SAndroid Build Coastguard Worker {
84*d83cc019SAndroid Build Coastguard Worker 	igt_list_del(elm);
85*d83cc019SAndroid Build Coastguard Worker 	igt_list_add(elm, list);
86*d83cc019SAndroid Build Coastguard Worker }
87*d83cc019SAndroid Build Coastguard Worker 
igt_list_move_tail(struct igt_list * elm,struct igt_list * list)88*d83cc019SAndroid Build Coastguard Worker static inline void igt_list_move_tail(struct igt_list *elm,
89*d83cc019SAndroid Build Coastguard Worker 				      struct igt_list *list)
90*d83cc019SAndroid Build Coastguard Worker {
91*d83cc019SAndroid Build Coastguard Worker 	igt_list_del(elm);
92*d83cc019SAndroid Build Coastguard Worker 	igt_list_add_tail(elm, list);
93*d83cc019SAndroid Build Coastguard Worker }
94*d83cc019SAndroid Build Coastguard Worker 
igt_list_empty(const struct igt_list * list)95*d83cc019SAndroid Build Coastguard Worker static inline bool igt_list_empty(const struct igt_list *list)
96*d83cc019SAndroid Build Coastguard Worker {
97*d83cc019SAndroid Build Coastguard Worker 	return list->next == list;
98*d83cc019SAndroid Build Coastguard Worker }
99*d83cc019SAndroid Build Coastguard Worker 
100*d83cc019SAndroid Build Coastguard Worker #define container_of(ptr, sample, member)				\
101*d83cc019SAndroid Build Coastguard Worker 	(typeof(sample))((char *)(ptr) - offsetof(typeof(*sample), member))
102*d83cc019SAndroid Build Coastguard Worker 
103*d83cc019SAndroid Build Coastguard Worker #define igt_list_first_entry(head, pos, member) \
104*d83cc019SAndroid Build Coastguard Worker 	container_of((head)->next, (pos), member)
105*d83cc019SAndroid Build Coastguard Worker #define igt_list_last_entry(head, pos, member) \
106*d83cc019SAndroid Build Coastguard Worker 	container_of((head)->prev, (pos), member)
107*d83cc019SAndroid Build Coastguard Worker 
108*d83cc019SAndroid Build Coastguard Worker #define igt_list_next_entry(pos, member) \
109*d83cc019SAndroid Build Coastguard Worker 	container_of((pos)->member.next, (pos), member)
110*d83cc019SAndroid Build Coastguard Worker #define igt_list_prev_entry(pos, member) \
111*d83cc019SAndroid Build Coastguard Worker 	container_of((pos)->member.prev, (pos), member)
112*d83cc019SAndroid Build Coastguard Worker 
113*d83cc019SAndroid Build Coastguard Worker #define igt_list_for_each(pos, head, member)				\
114*d83cc019SAndroid Build Coastguard Worker 	for (pos = igt_list_first_entry(head, pos, member);		\
115*d83cc019SAndroid Build Coastguard Worker 	     &pos->member != (head);					\
116*d83cc019SAndroid Build Coastguard Worker 	     pos = igt_list_next_entry(pos, member))
117*d83cc019SAndroid Build Coastguard Worker 
118*d83cc019SAndroid Build Coastguard Worker #define igt_list_for_each_reverse(pos, head, member)			\
119*d83cc019SAndroid Build Coastguard Worker 	for (pos = igt_list_last_entry(head, pos, member);		\
120*d83cc019SAndroid Build Coastguard Worker 	     &pos->member != (head);					\
121*d83cc019SAndroid Build Coastguard Worker 	     pos = igt_list_prev_entry(pos, member))
122*d83cc019SAndroid Build Coastguard Worker 
123*d83cc019SAndroid Build Coastguard Worker #define igt_list_for_each_safe(pos, tmp, head, member)			\
124*d83cc019SAndroid Build Coastguard Worker 	for (pos = igt_list_first_entry(head, pos, member),		\
125*d83cc019SAndroid Build Coastguard Worker 	     tmp = igt_list_next_entry(pos, member);			\
126*d83cc019SAndroid Build Coastguard Worker 	     &pos->member != (head);					\
127*d83cc019SAndroid Build Coastguard Worker 	     pos = tmp, tmp = igt_list_next_entry(pos, member))
128*d83cc019SAndroid Build Coastguard Worker 
129*d83cc019SAndroid Build Coastguard Worker #endif /* IGT_LIST_H */
130