Use Client_find_by_session() instead of a few open-coded loops.
[umurmur.git] / src / list.h
1 #ifndef LIST_H_87698769870987
2 #define LIST_H_87698769870987
3
4 struct dlist {
5         struct dlist *next, *prev;
6 };
7
8 #define init_list_entry(ptr) \
9         do { \
10             (ptr)->prev = ptr; (ptr)->next = ptr; } \
11         while(0);
12 #define declare_list(_name_) struct dlist _name_ = {&(_name_), &(_name_) }
13
14 static inline void list_add_head(struct dlist *new, struct dlist *list)
15 {
16         list->next->prev = new;
17         new->prev = list;
18         new->next = list->next;
19         list->next = new;
20 }
21
22 static inline void list_add_tail(struct dlist *new, struct dlist *list)
23 {
24         list->prev->next = new;
25         new->prev = list->prev;
26         new->next = list;
27         list->prev = new;
28 }
29 static inline void list_del(struct dlist *entry)
30 {
31         entry->next->prev = entry->prev;
32         entry->prev->next = entry->next;
33 }
34
35 static inline int list_empty(struct dlist *list)
36 {
37         return list->next == list;
38 }
39
40 #define list_get_first(listhead) \
41         ((listhead)->next)
42
43 #define list_get_next(_entry_) \
44         ((_entry_)->next)
45
46 #define list_get_entry(entry, type, structmember) \
47         ((type *) ((char *)(entry) - (unsigned long)(&((type *)0)->structmember)))
48
49 #define list_iterate(entry, listhead) \
50         for(entry = (listhead)->next; entry != (listhead); entry = entry->next)
51
52 #define list_iterate_safe(entry, save, listhead) \
53         for(entry = (listhead)->next, save = entry->next; entry != (listhead); \
54             entry = save, save = save->next)
55
56
57 #endif /* #ifndef LIST_H_87698769870987 */