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 
4 struct gtg_list {
5  struct gtg_list *prev;
6  struct gtg_list *next;
7 };
8 
9 typedef 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  */
49 static inline void __gtg_list_add(gtg_list_t lnew,
50  gtg_list_t prev,
51  gtg_list_t next)
52 {
53  next->prev = lnew;
54  lnew->next = next;
55  lnew->prev = prev;
56  prev->next = lnew;
57 }
58 
65 static inline void gtg_list_add(gtg_list_t lnew, gtg_list_t head)
66 {
67  __gtg_list_add(lnew, head, head->next);
68 }
69 
76 static 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 
88 static inline void __gtg_list_del(gtg_list_t prev, gtg_list_t next)
89 {
90  next->prev = prev;
91  prev->next = next;
92 }
93 
99 static 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 
164 static 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 */
Definition: GTGList.h:4
#define GTG_LIST_INIT(ptr)
initialize a list.
Definition: GTGList.h:16
#define gtg_list_for_each(pos, head)
Definition: GTGList.h:112
static void __gtg_list_del(gtg_list_t prev, gtg_list_t next)
Definition: GTGList.h:88
struct gtg_list * prev
Definition: GTGList.h:5
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_del(gtg_list_t entry)
delete an entry from its list and reinitialize it.
Definition: GTGList.h:99
struct gtg_list * gtg_list_t
Definition: GTGList.h:9
struct gtg_list * next
Definition: GTGList.h:6
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
static int gtg_list_size(gtg_list_t l)
Definition: GTGList.h:164
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