]> rtime.felk.cvut.cz Git - can-usb1.git/blob - ulan/host/libs4c/ulut/ul_itbase.h
Initializing repo
[can-usb1.git] / ulan / host / libs4c / ulut / ul_itbase.h
1 #ifndef _UL_ITBASE_H
2 #define _UL_ITBASE_H
3
4 #include "ul_utdefs.h"
5
6 #ifdef __cplusplus
7 extern "C" {
8 #endif
9
10 #define UL_ITBASE_UL_DEC(cust_prefix, cust_container_t, cust_item_t) \
11 typedef struct { cust_container_t *container; cust_item_t *item;}\
12         cust_prefix##_it_t;\
13 static inline cust_item_t * \
14 cust_prefix##_it2item(const cust_prefix##_it_t *it)\
15 {\
16   return it->item;\
17 }\
18 static inline void \
19 cust_prefix##_first_it(cust_container_t *container, cust_prefix##_it_t *it)\
20 {\
21   it->container=container;\
22   it->item=cust_prefix##_first(container);\
23 }\
24 static inline void \
25 cust_prefix##_last_it(cust_container_t *container, cust_prefix##_it_t *it)\
26 {\
27   it->container=container;\
28   it->item=cust_prefix##_last(container);\
29 }\
30 static inline void \
31 cust_prefix##_next_it(cust_prefix##_it_t *it)\
32 {\
33   if(it->item) it->item=cust_prefix##_next(it->container,it->item);\
34   else it->item=cust_prefix##_first(it->container);\
35 }\
36 static inline void \
37 cust_prefix##_prev_it(cust_prefix##_it_t *it)\
38 {\
39   if(it->item) it->item=cust_prefix##_prev(it->container,it->item);\
40   else it->item=cust_prefix##_last(it->container);\
41 }\
42 static inline int \
43 cust_prefix##_is_end_it(cust_prefix##_it_t *it)\
44 {\
45   return !it->item;\
46 }\
47 static inline void \
48 cust_prefix##_delete_it(cust_prefix##_it_t *it)\
49 {\
50   cust_item_t *p;\
51   if(!(p=it->item)) return;\
52   it->item=cust_prefix##_next(it->container,it->item);\
53   cust_prefix##_delete(it->container,p);\
54 }
55
56 #define UL_ITBASE_SORT_DEC(cust_prefix, cust_container_t, cust_item_t, cust_key_t) \
57 UL_ITBASE_UL_DEC(cust_prefix, cust_container_t, cust_item_t) \
58 static inline int \
59 cust_prefix##_find_it(cust_container_t *container, cust_key_t *key, cust_prefix##_it_t *it)\
60 {\
61   it->container=container;\
62   return (it->item=cust_prefix##_find(container, key))!=0;\
63 }\
64 static inline int \
65 cust_prefix##_find_first_it(cust_container_t *container, cust_key_t *key, cust_prefix##_it_t *it)\
66 {\
67   it->container=container;\
68   return (it->item=cust_prefix##_find_first(container, key))!=0;\
69 }\
70 static inline int \
71 cust_prefix##_find_after_it(cust_container_t *container, cust_key_t *key, cust_prefix##_it_t *it)\
72 {\
73   it->container=container;\
74   return (it->item=cust_prefix##_find_after(container, key))!=0;\
75 }
76
77 #define ul_for_each_it(cust_prefix, root, it) \
78         for(cust_prefix##_first_it(root,&it);\
79         !cust_prefix##_is_end_it(&it);cust_prefix##_next_it(&it))
80
81 #define ul_for_each_rev_it(cust_prefix, root, it) \
82         for(cust_prefix##_last_it(root,&it);\
83         !cust_prefix##_is_end_it(&it);cust_prefix##_prev_it(&it))
84
85 #define ul_for_each_from_it(cust_prefix, root, key, it) \
86         for(cust_prefix##_find_first_it(root, key, &it);\
87         !cust_prefix##_is_end_it(&it);cust_prefix##_next_it(&it))
88
89 #define ul_for_each_after_it(cust_prefix, root, key, it) \
90         for(cust_prefix##_find_after_it(root, key, &it);\
91         !cust_prefix##_is_end_it(&it);cust_prefix##_next_it(&it))
92
93 #ifdef __cplusplus
94 } /* extern "C"*/
95 #endif
96
97 #endif /* _UL_ITBASE_H */