acl  3.5.3.0
acl_stack.h
浏览该文件的文档.
1 #ifndef ACL_STACK_INCLUDE_H
2 #define ACL_STACK_INCLUDE_H
3 
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7 
8 #include "acl_define.h"
9 #include "acl_iterator.h"
10 
11 /* 说明:该函数库内部所用的内存分配未采用内存池方式 */
12 
13 typedef struct ACL_STACK ACL_STACK;
14 
15 /**
16  * 栈类型定义
17  */
18 struct ACL_STACK {
19  int capacity;
20  int count;
21  void **items;
22 
23  /* 添加及弹出 */
24 
25  /* 向栈尾部添加动态对象 */
26  void (*push_back)(struct ACL_STACK*, void*);
27  /* 向栈头部添加动态对象 */
28  void (*push_front)(struct ACL_STACK*, void*);
29  /* 弹出栈尾部动态对象 */
30  void *(*pop_back)(struct ACL_STACK*);
31  /* 弹出栈头部动态对象 */
32  void *(*pop_front)(struct ACL_STACK*);
33 
34  /* for acl_iterator */
35 
36  /* 取迭代器头函数 */
37  void *(*iter_head)(ACL_ITER*, struct ACL_STACK*);
38  /* 取迭代器下一个函数 */
39  void *(*iter_next)(ACL_ITER*, struct ACL_STACK*);
40  /* 取迭代器尾函数 */
41  void *(*iter_tail)(ACL_ITER*, struct ACL_STACK*);
42  /* 取迭代器上一个函数 */
43  void *(*iter_prev)(ACL_ITER*, struct ACL_STACK*);
44 };
45 
46 /**
47  * 增加栈空间大小
48  * @param s {ACL_STACK*} 创建的栈容器对象
49  * @param count {int} 增加的空间大小
50  */
51 ACL_API void acl_stack_space(ACL_STACK *s, int count);
52 
53 /**
54  * 创建一个栈容器对象
55  * @param init_size {int} 栈的初始化空间大小,必须 > 0
56  * @return {ACL_STACK*} 新创建的栈容器对象
57  */
58 ACL_API ACL_STACK *acl_stack_create(int init_size);
59 
60 /**
61  * 清空栈里的对象,但不销毁栈容器对象
62  * @param s {ACL_STACK*} 创建的栈容器对象
63  * @param free_fn {void (*)(void*)} 如果不为空,则会用此函数回调栈里的每一个对象
64  */
65 ACL_API void acl_stack_clean(ACL_STACK *s, void (*free_fn)(void *));
66 
67 /**
68  * 清空栈容器里的对象并销毁栈容器
69  * @param s {ACL_STACK*} 创建的栈容器对象
70  * @param free_fn {void (*)(void*)} 如果不为空,则会用此函数回调栈里的每一个对象
71  */
72 ACL_API void acl_stack_destroy(ACL_STACK *s, void (*free_fn)(void *));
73 
74 /**
75  * 往栈容器尾部添加新的对象
76  * @param s {ACL_STACK*} 创建的栈容器对象
77  * @param obj {void*}
78  */
79 ACL_API void acl_stack_append(ACL_STACK *s, void *obj);
80 #define acl_stack_push acl_stack_append
81 
82 /**
83  * 往栈容器的头部添加新的对象
84  * @param s {ACL_STACK*} 创建的栈容器对象
85  * @param obj {void*}
86  * 注:此操作的效率要比 acl_stack_append 低,因为其内容需要移动所有的对象位置
87  */
88 ACL_API void acl_stack_prepend(ACL_STACK *s, void *obj);
89 
90 /**
91  * 从栈容器里删除某个对象
92  * @param s {ACL_STACK*} 创建的栈容器对象
93  * @param position {int} 栈容器的位置
94  * @param free_fn {void (*)(void*)} 如果不为空,则用此函数回调被删除对象
95  */
96 ACL_API void acl_stack_delete(ACL_STACK *s, int position, void (*free_fn)(void *));
97 
98 /**
99  * @param s {ACL_STACK*} 创建的栈容器对象
100  * @param obj {void*} 被删除对象的地址
101  * @param free_fn {void (*)(void*)} 如果不为空,则用此函数回调被删除对象
102  */
103 ACL_API void acl_stack_delete_obj(ACL_STACK *s, void *obj, void (*free_fn)(void *));
104 
105 /**
106  * 返回栈容器中某个位置的对象地址
107  * @param s {ACL_STACK*} 创建的栈容器对象
108  * @param position {int} 栈容器中的位置
109  * @return {void*} != NULL: ok; == NULL: error或不存在
110  */
111 ACL_API void *acl_stack_index(ACL_STACK *s, int position);
112 
113 /**
114  * 返回栈容器中当前的对象个数
115  * @param s {ACL_STACK*} 创建的栈容器对象
116  * @return {int} 对象个数
117  */
118 ACL_API int acl_stack_size(const ACL_STACK *s);
119 
120 /**
121  * 返回栈中尾部的对象地址, 同时将该对象从栈中移除
122  * @param s {ACL_STACK*} 创建的栈容器对象
123  * @return {void*} 对象地址, == NULL 表示当前对象为空
124  */
125 ACL_API void *acl_stack_pop(ACL_STACK *s);
126 #define acl_stack_pop_tail acl_stack_pop
127 
128 /**
129  * 返回栈中最后添加的对象地址, 但不将该对象从栈中移除
130  * @param s {ACL_STACK*} 创建的栈容器对象
131  * @return {void*} 对象地址, == NULL 表示当前对象为空
132  */
133 ACL_API void *acl_stack_top(ACL_STACK *s);
134 
135 #ifdef __cplusplus
136 }
137 #endif
138 
139 #endif
ACL_API void acl_stack_prepend(ACL_STACK *s, void *obj)
ACL_API ACL_STACK * acl_stack_create(int init_size)
ACL_API void acl_stack_destroy(ACL_STACK *s, void(*free_fn)(void *))
ACL_API void * acl_stack_index(ACL_STACK *s, int position)
ACL_API void * acl_stack_pop(ACL_STACK *s)
ACL_API int acl_stack_size(const ACL_STACK *s)
int capacity
Definition: acl_stack.h:19
ACL_API void * acl_stack_top(ACL_STACK *s)
int count
Definition: acl_stack.h:20
void(* push_back)(struct ACL_STACK *, void *)
Definition: acl_stack.h:26
ACL_API void acl_stack_clean(ACL_STACK *s, void(*free_fn)(void *))
void(* push_front)(struct ACL_STACK *, void *)
Definition: acl_stack.h:28
ACL_API void acl_stack_delete(ACL_STACK *s, int position, void(*free_fn)(void *))
ACL_API void acl_stack_space(ACL_STACK *s, int count)
void ** items
Definition: acl_stack.h:21
ACL_API void acl_stack_append(ACL_STACK *s, void *obj)
ACL_API void acl_stack_delete_obj(ACL_STACK *s, void *obj, void(*free_fn)(void *))