acl  3.5.3.0
acl_ring.h
浏览该文件的文档.
1 #ifndef ACL_RING_INCLUDE_H
2 #define ACL_RING_INCLUDE_H
3 
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7 
8 #include "acl_define.h"
9 #include <stddef.h>
10 
11 typedef struct ACL_RING ACL_RING;
12 
13 /**
14  * 数据环结构类型定义
15  */
16 struct ACL_RING {
17  ACL_RING *succ; /**< successor */
18  ACL_RING *pred; /**< predecessor */
19 
20  ACL_RING *parent; /**< the header of all the rings */
21  int len; /**< the count in the ring */
22 };
23 
24 typedef struct ACL_RING_ITER {
27 
28 /**
29  * 初始化数据环
30  * @param ring {ACL_RING*} 数据环
31  */
32 ACL_API void acl_ring_init(ACL_RING *ring);
33 
34 /**
35  * 获得当前数据环内元素个数
36  * @param ring {ACL_RING*} 数据环
37  * @return {int} 数据环内元素个数
38  */
39 ACL_API int acl_ring_size(const ACL_RING *ring);
40 
41 /**
42  * 将一个新元素添加进环的头部
43  * @param ring {ACL_RING*} 数据环
44  * @param entry {ACL_RING*} 新的元素
45  */
46 ACL_API void acl_ring_prepend(ACL_RING *ring, ACL_RING *entry);
47 
48 /**
49  * 将一个新元素添加进环的尾部
50  * @param ring {ACL_RING*} 数据环
51  * @param entry {ACL_RING*} 新的元素
52  */
53 ACL_API void acl_ring_append(ACL_RING *ring, ACL_RING *entry);
54 
55 /**
56  * 将一个环元素从数据环中删除
57  * @param entry {ACL_RING*} 环元素
58  */
59 ACL_API void acl_ring_detach(ACL_RING *entry);
60 
61 /**
62  * 从环中弹出头部环元素
63  * @param ring {ACL_RING*} 数据环
64  * @return {ACL_RING*} 头部环元素,如果返回空则表示该数据环为空
65  */
66 ACL_API ACL_RING *acl_ring_pop_head(ACL_RING *ring);
67 
68 /**
69  * 从环中弹出尾部环元素
70  * @param ring {ACL_RING*} 数据环
71  * @return {ACL_RING*} 尾部环元素,如果返回空则表示该数据环为空
72  */
73 ACL_API ACL_RING *acl_ring_pop_tail(ACL_RING *ring);
74 
75 /*-------------------- 一些方便快捷的宏操作 --------------------------------*/
76 
77 /**
78  * 返回当前环元素的下一个环元素
79  */
80 #define ACL_RING_SUCC(c) ((c)->succ)
81 #define acl_ring_succ ACL_RING_SUCC
82 
83 /**
84  * 返回当前环元素的前一个环元素
85  */
86 #define ACL_RING_PRED(c) ((c)->pred)
87 #define acl_ring_pred ACL_RING_PRED
88 
89 /**
90  * 将环元素指针转换成应用的自定义类型的指针地址
91  * @param ring_ptr {ACL_RING*} 环元素指针
92  * @param app_type 应用自定义类型
93  * @param ring_member {ACL_RING*} 环元素在应用自定义结构中的成员名称
94  * @return {app_type*} 应用自定义结构类型的对象地址
95  */
96 #define ACL_RING_TO_APPL(ring_ptr, app_type, ring_member) \
97  ((app_type *) (((char *) (ring_ptr)) - offsetof(app_type,ring_member)))
98 
99 #define acl_ring_to_appl ACL_RING_TO_APPL
100 
101 /**
102  * 从头部至尾部遍历数据环中的所有环元素
103  * @param iter {ACL_RING_ITER}
104  * @param head_ptr {ACL_RING*} 数据环的头指针
105  * @example:
106  typedef struct {
107  char name[32];
108  ACL_RING entry;
109  } DUMMY;
110 
111  void test()
112  {
113  ACL_RING head;
114  DUMMY *dummy;
115  ACL_RING_ITER iter;
116  int i;
117 
118  acl_ring_init(&head);
119 
120  for (i = 0; i < 10; i++) {
121  dummy = (DUMMY*) acl_mycalloc(1, sizeof(DUMMY));
122  snprintf(dummy->name, sizeof(dummy->name), "dummy:%d", i);
123  acl_ring_append(&head, &dummy->entry);
124  }
125 
126  acl_ring_foreach(iter, &head) {
127  dummy = acl_ring_to_appl(iter.ptr, DUMMY, entry);
128  printf("name: %s\n", dummy->name);
129  }
130 
131  while (1) {
132  iter.ptr = acl_ring_pop_head(&head);
133  if (iter.ptr == NULL)
134  break;
135  dummy = acl_ring_to_appl(iter.ptr, DUMMY, entry);
136  acl_myfree(dummy);
137  }
138  }
139  */
140 #define ACL_RING_FOREACH(iter, head_ptr) \
141  for ((iter).ptr = acl_ring_succ((head_ptr)); (iter).ptr != (head_ptr); \
142  (iter).ptr = acl_ring_succ((iter).ptr))
143 
144 #define acl_ring_foreach ACL_RING_FOREACH
145 
146 /**
147  * 从尾部至头部遍历数据环中的所有环元素
148  * @param iter {ACL_RING_ITER}
149  * @param head_ptr {ACL_RING*} 数据环的头指针
150  */
151 #define ACL_RING_FOREACH_REVERSE(iter, head_ptr) \
152  for ((iter).ptr = acl_ring_pred((head_ptr)); (iter).ptr != (head_ptr); \
153  (iter).ptr = acl_ring_pred((iter).ptr))
154 
155 #define acl_ring_foreach_reverse ACL_RING_FOREACH_REVERSE
156 
157 /**
158  * 返回数据环中第一个环元素指针
159  * @param head {ACL_RING*} 环头指针
160  * @return {ACL_RING*} NULL: 环为空
161  */
162 #define ACL_RING_FIRST(head) \
163  (acl_ring_succ(head) != (head) ? acl_ring_succ(head) : 0)
164 
165 #define acl_ring_first ACL_RING_FIRST
166 
167 /**
168  * 返回数据环中头第一个环元素指针同时将其转换应用自定义结构类型的对象地址
169  * @param head {ACL_RING*} 环头指针
170  * @param app_type 应用自定义结构类型
171  * @param ring_member {ACL_RING*} 环元素在应用自定义结构中的成员名称
172  * @return {app_type*} 应用自定义结构类型的对象地址
173  */
174 #define ACL_RING_FIRST_APPL(head, app_type, ring_member) \
175  (acl_ring_succ(head) != (head) ? \
176  ACL_RING_TO_APPL(acl_ring_succ(head), app_type, ring_member) : 0)
177 
178 #define acl_ring_first_appl ACL_RING_FIRST_APPL
179 
180 /**
181  * 返回数据环中最后一个环元素指针
182  * @param head {ACL_RING*} 环头指针
183  * @return {ACL_RING*} NULL: 环为空
184  */
185 #define ACL_RING_LAST(head) \
186  (acl_ring_pred(head) != (head) ? acl_ring_pred(head) : 0)
187 
188 #define acl_ring_last ACL_RING_LAST
189 
190 /**
191  * 返回数据环中最后一个环元素指针同时将其转换应用自定义结构类型的对象地址
192  * @param head {ACL_RING*} 环头指针
193  * @param app_type 应用自定义结构类型
194  * @param ring_member {ACL_RING*} 环元素在应用自定义结构中的成员名称
195  * @return {app_type*} 应用自定义结构类型的对象地址
196  */
197 #define ACL_RING_LAST_APPL(head, app_type, ring_member) \
198  (acl_ring_pred(head) != (head) ? \
199  ACL_RING_TO_APPL(acl_ring_pred(head), app_type, ring_member) : 0)
200 
201 #define acl_ring_last_appl ACL_RING_LAST_APPL
202 
203 /**
204  * 将一个新元素添加进环的尾部
205  * @param ring {ACL_RING*} 数据环
206  * @param entry {ACL_RING*} 新的元素
207  */
208 #define ACL_RING_APPEND(ring_in, entry_in) do { \
209  ACL_RING *ring_ptr = (ring_in), *entry_ptr = (entry_in); \
210  entry_ptr->succ = ring_ptr->succ; \
211  entry_ptr->pred = ring_ptr; \
212  entry_ptr->parent = ring_ptr->parent; \
213  ring_ptr->succ->pred = entry_ptr; \
214  ring_ptr->succ = entry_ptr; \
215  ring_ptr->parent->len++; \
216 } while (0)
217 
218 /**
219  * 将一个新元素添加进环的头部
220  * @param ring {ACL_RING*} 数据环
221  * @param entry {ACL_RING*} 新的元素
222  */
223 #define ACL_RING_PREPEND(ring_in, entry_in) do { \
224  ACL_RING *ring_ptr = (ring_in), *entry_ptr = (entry_in); \
225  entry_ptr->pred = ring_ptr->pred; \
226  entry_ptr->succ = ring_ptr; \
227  entry_ptr->parent = ring_ptr->parent; \
228  ring_ptr->pred->succ = entry_ptr; \
229  ring_ptr->pred = entry_ptr; \
230  ring_ptr->parent->len++; \
231 } while (0)
232 
233 /**
234  * 将一个环元素从数据环中删除
235  * @param entry {ACL_RING*} 环元素
236  */
237 #define ACL_RING_DETACH(entry_in) do { \
238  ACL_RING *succ, *pred, *entry_ptr = (entry_in); \
239  succ = entry_ptr->succ; \
240  pred = entry_ptr->pred; \
241  if (succ != NULL && pred != NULL) { \
242  pred->succ = succ; \
243  succ->pred = pred; \
244  entry_ptr->parent->len--; \
245  entry_ptr->succ = entry_ptr->pred = NULL; \
246  } \
247 } while (0)
248 
249 #ifdef __cplusplus
250 }
251 #endif
252 
253 #endif
254 
ACL_RING * succ
Definition: acl_ring.h:17
ACL_API void acl_ring_detach(ACL_RING *entry)
ACL_API int acl_ring_size(const ACL_RING *ring)
ACL_API ACL_RING * acl_ring_pop_head(ACL_RING *ring)
ACL_API void acl_ring_init(ACL_RING *ring)
ACL_API ACL_RING * acl_ring_pop_tail(ACL_RING *ring)
int len
Definition: acl_ring.h:21
ACL_RING * pred
Definition: acl_ring.h:18
ACL_API void acl_ring_append(ACL_RING *ring, ACL_RING *entry)
struct ACL_RING_ITER ACL_RING_ITER
ACL_RING * parent
Definition: acl_ring.h:20
ACL_RING * ptr
Definition: acl_ring.h:25
ACL_API void acl_ring_prepend(ACL_RING *ring, ACL_RING *entry)