]> rtime.felk.cvut.cz Git - canping.git/blob - include/ul_itbase.h
Program canping extended to provide option for selection of real-time priorities.
[canping.git] / include / 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 */