5 #include "ul_listbase.h"
12 typedef struct list_head ul_list_node_t;
13 typedef struct list_head ul_list_head_t;
15 #define UL_LIST_CUST_DEC(cust_prefix, cust_head_t, cust_item_t, \
16 cust_head_field, cust_node_field) \
18 static inline cust_item_t * \
19 cust_prefix##_node2item(const cust_head_t *head, const ul_list_node_t *node) \
20 {return UL_CONTAINEROF(node, cust_item_t, cust_node_field);} \
23 cust_prefix##_init_head(cust_head_t *head) \
25 INIT_LIST_HEAD(&head->cust_head_field); \
28 cust_prefix##_init_detached(cust_item_t *item){ \
29 INIT_LIST_HEAD(&item->cust_node_field); \
31 static inline cust_item_t * \
32 cust_prefix##_first(const cust_head_t *head) \
34 ul_list_node_t *n=head->cust_head_field.next; \
35 return (n!=&head->cust_head_field)?cust_prefix##_node2item(head,n):NULL; \
37 static inline cust_item_t * \
38 cust_prefix##_last(const cust_head_t *head) \
40 ul_list_node_t *n=head->cust_head_field.prev; \
41 return (n!=&head->cust_head_field)?cust_prefix##_node2item(head,n):NULL; \
43 static inline cust_item_t * \
44 cust_prefix##_next(const cust_head_t *head, const cust_item_t *item) \
46 ul_list_node_t *n=item->cust_node_field.next; \
47 return (n!=&head->cust_head_field)?cust_prefix##_node2item(head,n):NULL; \
49 static inline cust_item_t * \
50 cust_prefix##_prev(const cust_head_t *head, const cust_item_t *item) \
52 ul_list_node_t *n=item->cust_node_field.prev; \
53 return (n!=&head->cust_head_field)?cust_prefix##_node2item(head,n):NULL; \
56 cust_prefix##_is_empty(const cust_head_t *head) \
58 return head->cust_head_field.next==&head->cust_head_field; \
61 cust_prefix##_ins_head(cust_head_t *head, cust_item_t *item) \
63 list_add(&item->cust_node_field, &head->cust_head_field); \
66 cust_prefix##_ins_tail(cust_head_t *head, cust_item_t *item) \
68 list_add_tail(&item->cust_node_field, &head->cust_head_field); \
71 cust_prefix##_insert(cust_head_t *head, cust_item_t *item) \
73 cust_prefix##_ins_tail(head, item); \
76 cust_prefix##_delete(cust_head_t *head, cust_item_t *item) \
78 list_del_init(&item->cust_node_field); \
81 cust_prefix##_del_item(cust_item_t *item) \
83 list_del_init(&item->cust_node_field); \
85 static inline cust_item_t * \
86 cust_prefix##_cut_first(cust_head_t *head) \
88 ul_list_node_t *n=head->cust_head_field.next; \
89 if(n==&head->cust_head_field) return NULL; \
91 return cust_prefix##_node2item(head,n); \
94 UL_ITBASE_UL_DEC(cust_prefix, cust_head_t, cust_item_t)
97 #define ul_list_for_each(cust_prefix, head, ptr) \
98 for(ptr=cust_prefix##_first(head);ptr;ptr=cust_prefix##_next((head),ptr))
100 #define ul_list_for_each_rev(cust_prefix, head, ptr) \
101 for(ptr=cust_prefix##_last(head);ptr;ptr=cust_prefix##_prev((head),ptr))
103 #define ul_list_for_each_cut(cust_prefix, head, ptr) \
104 for(;(ptr=cust_prefix##_cut_first(head));)
110 #endif /* _UL_LISTS_H */