Generic Trace Generator (GTG) 0.1
GTGList.h
Go to the documentation of this file.
1#ifndef GTG_LIST_H
2#define GTG_LIST_H
3
4struct gtg_list {
5 struct gtg_list *prev;
6 struct gtg_list *next;
7};
8
9typedef struct gtg_list* gtg_list_t;
10
16#define GTG_LIST_INIT(ptr) \
17 do { \
18 (ptr)->prev = (ptr); \
19 (ptr)->next = (ptr); \
20 } while(0)
21
27#define GTG_LIST(name) \
28 struct gtg_list name; \
29 GTG_LIST_INIT(&name)
30
31
39#define gtg_list_entry(ptr, type, member) \
40 ((type *)((char *)(ptr) - (char *)(&((type *)0)->member)))
41
42
43/*
44 * Insert a new entry between two known consecutive entries.
45 *
46 * This is only for internal list manipulation where we know
47 * the prev/next entries already!
48 */
49static inline void __gtg_list_add(gtg_list_t lnew,
52{
53 next->prev = lnew;
54 lnew->next = next;
55 lnew->prev = prev;
56 prev->next = lnew;
57}
58
65static inline void gtg_list_add(gtg_list_t lnew, gtg_list_t head)
66{
67 __gtg_list_add(lnew, head, head->next);
68}
69
76static inline void gtg_list_add_tail(gtg_list_t lnew, gtg_list_t head)
77{
78 __gtg_list_add(lnew, head->prev, head);
79}
80
89{
90 next->prev = prev;
91 prev->next = next;
92}
93
99static inline void gtg_list_del(gtg_list_t entry)
100{
101 __gtg_list_del(entry->prev, entry->next);
102 GTG_LIST_INIT(entry);
103}
104
105
112#define gtg_list_for_each(pos, head) \
113 for (pos = (head)->next; pos != (head); pos = pos->next)
114
121#define gtg_list_for_each_reverse(pos, head) \
122 for (pos = (head)->prev; pos != (head); pos = pos->prev)
123
131#define gtg_list_for_each_safe(pos, n, head) \
132 for (pos = (head)->next, n = pos->next; pos != (head); \
133 pos = n, n = pos->next)
134
135
136
144#define gtg_list_for_each_entry(pos, head, member) \
145 for (pos = gtg_list_entry((head)->next, typeof(*pos), member); \
146 &pos->member != (head); \
147 pos = gtg_list_entry(pos->member.next, typeof(*pos), member))
148
157#define gtg_list_for_each_entry_safe(pos, n, head, member) \
158 for (pos = gtg_list_entry((head)->next, typeof(*pos), member), \
159 n = gtg_list_entry(pos->member.next, typeof(*pos), member); \
160 &pos->member != (head); \
161 pos = n, n = gtg_list_entry(n->member.next, typeof(*n), member))
162
163
164static inline int gtg_list_size(gtg_list_t l)
165{
166 int res = 0;
167 gtg_list_t ptr = NULL;
168 gtg_list_for_each(ptr, l)
169 res++;
170
171 return res;
172}
173
174#endif /* GTG_LIST_H */
#define GTG_LIST_INIT(ptr)
initialize a list.
Definition GTGList.h:16
struct gtg_list * gtg_list_t
Definition GTGList.h:9
static void __gtg_list_del(gtg_list_t prev, gtg_list_t next)
Definition GTGList.h:88
static void gtg_list_add_tail(gtg_list_t lnew, gtg_list_t head)
Insert a new entry before the specified head (ie. at the tail of the list).
Definition GTGList.h:76
static int gtg_list_size(gtg_list_t l)
Definition GTGList.h:164
static void __gtg_list_add(gtg_list_t lnew, gtg_list_t prev, gtg_list_t next)
Definition GTGList.h:49
static void gtg_list_add(gtg_list_t lnew, gtg_list_t head)
Insert a new entry after the specified head.
Definition GTGList.h:65
#define gtg_list_for_each(pos, head)
Definition GTGList.h:112
static void gtg_list_del(gtg_list_t entry)
delete an entry from its list and reinitialize it.
Definition GTGList.h:99
Definition GTGList.h:4
struct gtg_list * next
Definition GTGList.h:6
struct gtg_list * prev
Definition GTGList.h:5