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) \
22 return UL_CONTAINEROF(node, cust_item_t, cust_node_field);\
26 cust_prefix##_init_head(cust_head_t *head)\
28 INIT_LIST_HEAD(&head->cust_head_field);\
31 cust_prefix##_init_detached(cust_item_t *item){\
32 INIT_LIST_HEAD(&item->cust_node_field);\
34 static inline cust_item_t *\
35 cust_prefix##_first(const cust_head_t *head)\
37 ul_list_node_t *n=head->cust_head_field.next;\
38 return (n!=&head->cust_head_field)?cust_prefix##_node2item(head,n):NULL;\
40 static inline cust_item_t *\
41 cust_prefix##_last(const cust_head_t *head)\
43 ul_list_node_t *n=head->cust_head_field.prev;\
44 return (n!=&head->cust_head_field)?cust_prefix##_node2item(head,n):NULL;\
46 static inline cust_item_t *\
47 cust_prefix##_next(const cust_head_t *head, const cust_item_t *item)\
49 ul_list_node_t *n=item->cust_node_field.next;\
50 return (n!=&head->cust_head_field)?cust_prefix##_node2item(head,n):NULL;\
52 static inline cust_item_t *\
53 cust_prefix##_prev(const cust_head_t *head, const cust_item_t *item)\
55 ul_list_node_t *n=item->cust_node_field.prev;\
56 return (n!=&head->cust_head_field)?cust_prefix##_node2item(head,n):NULL;\
59 cust_prefix##_is_empty(const cust_head_t *head)\
61 return head->cust_head_field.next==&head->cust_head_field;\
64 cust_prefix##_ins_head(cust_head_t *head, cust_item_t *item)\
66 list_add(&item->cust_node_field, &head->cust_head_field);\
69 cust_prefix##_ins_tail(cust_head_t *head, cust_item_t *item)\
71 list_add_tail(&item->cust_node_field, &head->cust_head_field);\
74 cust_prefix##_insert(cust_head_t *head, cust_item_t *item)\
76 cust_prefix##_ins_tail(head, item);\
79 cust_prefix##_delete(cust_head_t *head, cust_item_t *item)\
82 list_del_init(&item->cust_node_field);\
85 cust_prefix##_del_item(cust_item_t *item)\
87 list_del_init(&item->cust_node_field);\
89 static inline cust_item_t *\
90 cust_prefix##_cut_first(cust_head_t *head)\
92 ul_list_node_t *n=head->cust_head_field.next;\
93 if(n==&head->cust_head_field) return NULL;\
95 return cust_prefix##_node2item(head,n);\
98 UL_ITBASE_UL_DEC(cust_prefix, cust_head_t, cust_item_t)
101 #define ul_list_for_each(cust_prefix, head, ptr) \
102 for(ptr=cust_prefix##_first(head);ptr;ptr=cust_prefix##_next((head),ptr))
104 #define ul_list_for_each_rev(cust_prefix, head, ptr) \
105 for(ptr=cust_prefix##_last(head);ptr;ptr=cust_prefix##_prev((head),ptr))
107 #define ul_list_for_each_cut(cust_prefix, head, ptr) \
108 for(;(ptr=cust_prefix##_cut_first(head));)
114 #endif /* _UL_LISTS_H */