acl  3.5.3.0
acl_fifo.h
浏览该文件的文档.
1 #ifndef ACL_FIFO_INCLUDE_H
2 #define ACL_FIFO_INCLUDE_H
3 
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7 
8 #include "acl_define.h"
9 #include "acl_slice.h"
10 #include "acl_iterator.h"
11 
14 typedef struct ACL_FIFO ACL_FIFO;
15 
16 struct ACL_FIFO_INFO {
17  void *data;
20 };
21 
22 struct ACL_FIFO_ITER {
24 };
25 
26 struct ACL_FIFO {
29  int cnt;
30 
31  /* 添加及弹出 */
32 
33  /* 向队列尾部添加动态对象 */
34  void (*push_back)(struct ACL_FIFO*, void*);
35  /* 向队列头部添加动态对象 */
36  void (*push_front)(struct ACL_FIFO*, void*);
37  /* 弹出队列尾部动态对象 */
38  void *(*pop_back)(struct ACL_FIFO*);
39  /* 弹出队列头部动态对象 */
40  void *(*pop_front)(struct ACL_FIFO*);
41 
42  /* for acl_iterator */
43 
44  /* 取迭代器头函数 */
45  void *(*iter_head)(ACL_ITER*, struct ACL_FIFO*);
46  /* 取迭代器下一个函数 */
47  void *(*iter_next)(ACL_ITER*, struct ACL_FIFO*);
48  /* 取迭代器尾函数 */
49  void *(*iter_tail)(ACL_ITER*, struct ACL_FIFO*);
50  /* 取迭代器上一个函数 */
51  void *(*iter_prev)(ACL_ITER*, struct ACL_FIFO*);
52  /* 取迭代器关联的当前容器成员结构对象 */
53  ACL_FIFO_INFO *(*iter_info)(ACL_ITER*, struct ACL_FIFO*);
54 
55  /* private */
57 };
58 
59 /**
60  * 初始化一个给定队列,应用可以在栈上分配队列,而后调用该函数进行初始化
61  * @param fifo {ACL_FIFO *}
62  * @example:
63  * void test(void) {
64  ACL_FIFO fifo;
65 
66  acl_fifo_init(&fifo);
67  * }
68  */
69 ACL_API void acl_fifo_init(ACL_FIFO *fifo);
70 
71 /**
72  * 从内存堆中分配一个队列对象
73  * @return {ACL_FIFO*}
74  */
75 ACL_API ACL_FIFO *acl_fifo_new(void);
76 
77 /**
78  * 从内存堆中分配一个队列对象并传内存池对象做为分配器
79  * @param slice {ACL_SLICE_POOL*}
80  * @return {ACL_FIFO*}
81  */
83 
84 /**
85  * 从队列中删除与所给值相同的对象
86  * @param fifo {ACL_FIFO*}
87  * @param data {const void*}
88  */
89 ACL_API int acl_fifo_delete(ACL_FIFO *fifo, const void *data);
90 ACL_API void acl_fifo_delete_info(ACL_FIFO *fifo, ACL_FIFO_INFO *info);
91 
92 /**
93  * 释放以堆分配的队列对象
94  * @param fifo {ACL_FIFO*}
95  * @param free_fn {void (*)(void*)}, 如果该函数指针不为空则
96  * 用来释放队列中动态分配的对象
97  */
98 ACL_API void acl_fifo_free(ACL_FIFO *fifo, void (*free_fn)(void *));
99 ACL_API void acl_fifo_free2(ACL_FIFO *fifo, void (*free_fn)(ACL_FIFO_INFO *));
100 
101 /**
102  * 向队列中添加一个动态堆对象
103  * @param fifo {ACL_FIFO*}
104  * @param data {void*} 动态对象
105  * @return {ACL_FIFO_INFO*} 如果 data 非空则返回队列中的新添加对象, 否则返回 NULL
106  */
107 ACL_API ACL_FIFO_INFO *acl_fifo_push_back(ACL_FIFO *fifo, void *data);
108 #define acl_fifo_push acl_fifo_push_back
109 ACL_API void acl_fifo_push_info_back(ACL_FIFO *fifo, ACL_FIFO_INFO *info);
110 #define acl_fifo_push_info acl_fifo_push_info_back
111 ACL_API ACL_FIFO_INFO *acl_fifo_push_front(ACL_FIFO *fifo, void *data);
112 
113 /**
114  * 从队列中以先进先出方式弹出一个动态对象, 同时将该对象从队列中删除
115  * @param fifo {ACL_FIFO*}
116  * @return {void*}, 如果为空,则表示队列为空
117  */
118 ACL_API void *acl_fifo_pop_front(ACL_FIFO *fifo);
119 #define acl_fifo_pop acl_fifo_pop_front
121 
122 /**
123  * 从队列中以后进先出方式弹出一个动态对象, 同时该对象从队列中删除
124  * @param fifo {ACL_FIFO*}
125  * @return {void*}, 如果为空,则表示队列为空
126  */
127 ACL_API void *acl_fifo_pop_back(ACL_FIFO *fifo);
128 
129 /**
130  * 返回队列中头部的动态对象
131  * @param fifo {ACL_FIFO*}
132  * @return {void*}, 如果为空,则表示队列为空
133  */
134 ACL_API void *acl_fifo_head(ACL_FIFO *fifo);
136 
137 /**
138  * 返回队列中尾部的动态对象
139  * @param fifo {ACL_FIFO*}
140  * @return {void*}, 如果为空,则表示队列为空
141  */
142 ACL_API void *acl_fifo_tail(ACL_FIFO *fifo);
144 
145 /**
146  * 返回队列中动态对象的总个数
147  * @param fifo {ACL_FIFO*}
148  * @return {int}, >= 0
149  */
150 ACL_API int acl_fifo_size(ACL_FIFO *fifo);
151 
152 /*-------------------- 一些方便快捷的宏操作 --------------------------------*/
153 
154 /**
155  * 获得当前 iter 所包含的对象地址
156  * @param iter {ACL_FIFO_ITER}
157  */
158 #define ACL_FIFO_ITER_VALUE(iter) ((iter).ptr->data)
159 #define acl_fifo_iter_value ACL_FIFO_ITER_VALUE
160 
161 /**
162  * 遍历 ACL_FIFO
163  * @param iter {ACL_FIFO_ITER}
164  * @param fifo {ACL_FIFO}
165  * @example:
166  -- 仅是本容器支持的遍历方式
167  void test()
168  {
169  ACL_FIFO *fifo_ptr = acl_fifo_new();
170  ACL_FIFO_ITER iter;
171  char *data;
172  int i;
173 
174  for (i = 0; i < 10; i++) {
175  data = acl_mymalloc(32);
176  snprintf(data, 32, "data: %d", i);
177  acl_fifo_push(fifo_ptr, data);
178  }
179  acl_fifo_foreach(iter, fifo_ptr) {
180  printf("%s\n", (char*) acl_fifo_iter_value(iter));
181  }
182 
183  acl_fifo_free(fifo_ptr, acl_myfree_fn);
184  }
185 
186  -- 通用容器遍历方式
187  void test2()
188  {
189  ACL_FIFO *fifo_ptr = acl_fifo_new();
190  ACL_ITER iter;
191  char *data;
192  int i;
193 
194  for (i = 0; i < 10; i++) {
195  data = acl_mymalloc(32);
196  snprintf(data, 32, "data: %d", i);
197  acl_fifo_push(fifo_ptr, data);
198  }
199  acl_foreach(iter, fifo) {
200  printf("%s\n", (char*) iter.data);
201  }
202  acl_fifo_free(fifo_ptr, acl_myfree_fn);
203  }
204  */
205 #define ACL_FIFO_FOREACH(iter, fifo_ptr) \
206  for ((iter).ptr = (fifo_ptr)->head; (iter).ptr; (iter).ptr = (iter).ptr->next)
207 #define acl_fifo_foreach ACL_FIFO_FOREACH
208 
209 /**
210  * 反向遍历 ACL_FIFO
211  * @param iter {ACL_FIFO_ITER}
212  * @param fifo {ACL_FIFO}
213  * @example:
214  void test()
215  {
216  ACL_FIFO fifo;
217  ACL_FIFO_ITER iter;
218  char *data;
219  int i;
220 
221  acl_fifo_init(&fifo);
222 
223  for (i = 0; i < 10; i++) {
224  data = acl_mymalloc(32);
225  snprintf(data, 32, "data: %d", i);
226  acl_fifo_push(&fifo, data);
227  }
228  acl_fifo_foreach_reverse(iter, &fifo) {
229  printf("%s\n", (char*) iter.ptr->data);
230  }
231 
232  while (1) {
233  data = acl_fifo_pop(&fifo);
234  if (data == NULL)
235  break;
236  }
237  }
238  */
239 #define ACL_FIFO_FOREACH_REVERSE(iter, fifo_ptr) \
240  for ((iter).ptr = (fifo_ptr)->tail; (iter).ptr; (iter).ptr = (iter).ptr->prev)
241 #define acl_fifo_foreach_reverse ACL_FIFO_FOREACH_REVERSE
242 
243 #ifdef __cplusplus
244 }
245 #endif
246 
247 #endif
248 
ACL_FIFO_INFO * ptr
Definition: acl_fifo.h:23
ACL_API ACL_FIFO_INFO * acl_fifo_pop_info(ACL_FIFO *fifo)
ACL_API void acl_fifo_delete_info(ACL_FIFO *fifo, ACL_FIFO_INFO *info)
ACL_SLICE_POOL * slice
Definition: acl_fifo.h:56
ACL_API void acl_fifo_init(ACL_FIFO *fifo)
void(* push_front)(struct ACL_FIFO *, void *)
Definition: acl_fifo.h:36
void * data
Definition: acl_fifo.h:17
ACL_FIFO_INFO * head
Definition: acl_fifo.h:27
ACL_FIFO_INFO * prev
Definition: acl_fifo.h:18
ACL_API void * acl_fifo_pop_back(ACL_FIFO *fifo)
void(* push_back)(struct ACL_FIFO *, void *)
Definition: acl_fifo.h:34
ACL_API ACL_FIFO_INFO * acl_fifo_push_back(ACL_FIFO *fifo, void *data)
ACL_API int acl_fifo_delete(ACL_FIFO *fifo, const void *data)
ACL_API void * acl_fifo_head(ACL_FIFO *fifo)
ACL_API void acl_fifo_push_info_back(ACL_FIFO *fifo, ACL_FIFO_INFO *info)
ACL_API ACL_FIFO * acl_fifo_new(void)
ACL_API ACL_FIFO_INFO * acl_fifo_head_info(ACL_FIFO *fifo)
ACL_API int acl_fifo_size(ACL_FIFO *fifo)
ACL_API ACL_FIFO_INFO * acl_fifo_push_front(ACL_FIFO *fifo, void *data)
ACL_API void * acl_fifo_tail(ACL_FIFO *fifo)
ACL_FIFO_INFO * next
Definition: acl_fifo.h:19
ACL_API void acl_fifo_free(ACL_FIFO *fifo, void(*free_fn)(void *))
ACL_API ACL_FIFO * acl_fifo_new1(ACL_SLICE_POOL *slice)
ACL_API void * acl_fifo_pop_front(ACL_FIFO *fifo)
ACL_FIFO_INFO * tail
Definition: acl_fifo.h:28
int cnt
Definition: acl_fifo.h:29
ACL_API ACL_FIFO_INFO * acl_fifo_tail_info(ACL_FIFO *fifo)
ACL_API void acl_fifo_free2(ACL_FIFO *fifo, void(*free_fn)(ACL_FIFO_INFO *))