acl  3.5.3.0
acl_array.h
浏览该文件的文档.
1 #ifndef ACL_ARRAY_INCLUDE_H
2 #define ACL_ARRAY_INCLUDE_H
3 
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7 
8 #include "acl_define.h"
9 #include "acl_dbuf_pool.h"
10 #include "acl_iterator.h"
11 
12 /**
13  * 动态数组类型定义
14  */
15 typedef struct ACL_ARRAY ACL_ARRAY;
16 struct ACL_ARRAY{
17  ACL_DBUF_POOL *dbuf; /**< 内存池对象 */
18  int capacity; /**< items 数组空间大小 */
19  int count; /**< items 中含有元素的个数 */
20  void **items; /**< 动态数组 */
21 
22  /* 添加及弹出 */
23 
24  /* 向数组尾部添加动态对象 */
25  void (*push_back)(struct ACL_ARRAY*, void*);
26  /* 向数组头部添加动态对象 */
27  void (*push_front)(struct ACL_ARRAY*, void*);
28  /* 弹出数组尾部动态对象 */
29  void *(*pop_back)(struct ACL_ARRAY*);
30  /* 弹出数组头部动态对象 */
31  void *(*pop_front)(struct ACL_ARRAY*);
32 
33  /* for acl_iterator */
34 
35  /* 取迭代器头函数 */
36  void *(*iter_head)(ACL_ITER*, struct ACL_ARRAY*);
37  /* 取迭代器下一个函数 */
38  void *(*iter_next)(ACL_ITER*, struct ACL_ARRAY*);
39  /* 取迭代器尾函数 */
40  void *(*iter_tail)(ACL_ITER*, struct ACL_ARRAY*);
41  /* 取迭代器上一个函数 */
42  void *(*iter_prev)(ACL_ITER*, struct ACL_ARRAY*);
43 };
44 
45 /**
46  * 创建一个动态数组
47  * @param init_size {int} 动态数组的初始大小
48  * @return {ACL_ARRAY*} 动态数组指针
49  */
50 ACL_API ACL_ARRAY *acl_array_create(int init_size);
51 
52 /**
53  * 创建一个动态数组
54  * @param init_size {int} 动态数组的初始大小
55  * @param dbuf {ACL_DBUF_POOL*} 非空时, 则内存(含数组对象本身)均在上面分配
56  * @return {ACL_ARRAY*} 动态数组指针
57  */
58 ACL_API ACL_ARRAY *acl_array_dbuf_create(int init_size, ACL_DBUF_POOL *dbuf);
59 
60 /**
61  * 释放掉动态数组内的成员变量,但并不释放动态数组对象
62  * @param a {ACL_ARRAY*} 动态数组指针
63  * @param free_fn {void (*)(void*)} 用于释放动态数组内成员变量的释放函数指针
64  */
65 ACL_API void acl_array_clean(ACL_ARRAY *a, void (*free_fn)(void *));
66 
67 /**
68  * 释放掉动态数组内的成员变量,并释放动态数组对象,当数组对象创建 dbuf 对象
69  * 时,则该数组对象的释放将会在释放 dbuf 时被释放
70  * @param a {ACL_ARRAY*} 动态数组指针
71  * @param free_fn {void (*)(void*)} 用于释放动态数组内成员变量的释放函数指针
72  */
73 ACL_API void acl_array_free(ACL_ARRAY *a, void (*free_fn)(void *));
74 #define acl_array_destroy acl_array_free
75 
76 /**
77  * 向动态数组尾部添加动态成员变量
78  * @param a {ACL_ARRAY*} 动态数组指针
79  * @param obj {void*} 动态成员变量
80  * @return {int} >=0: 成功, 返回值为该元素在数组中的下标位置;-1: 失败
81  */
82 ACL_API int acl_array_append(ACL_ARRAY *a, void *obj);
83 
84 /**
85  * 向动态数组头部添加动态成员变量
86  * @param a {ACL_ARRAY*} 动态数组指针
87  * @param obj {void*} 动态成员变量
88  * @return {int} >=0: 成功, 返回值为该元素在数组中的下标位置;-1: 失败
89  */
90 ACL_API int acl_array_prepend(ACL_ARRAY *a, void *obj);
91 
92 /**
93  * 向动态数组中指定位置前添加动态成员变量(该结点及以后所有结点都后移一个位置)
94  * @param a {ACL_ARRAY*} 动态数组指针
95  * @param position {int} 某个位置,不得越界
96  * @param obj {void*} 动态成员变量
97  * @return {int} 0: 成功;-1: 失败
98  */
99 ACL_API int acl_array_pred_insert(ACL_ARRAY *a, int position, void *obj);
100 
101 /**
102  * 向动态数组中指定位置后添加动态成员变量(该结点以后所有结点都后移一个位置)
103  * @param a {ACL_ARRAY*} 动态数组指针
104  * @param position {int} 某个位置,不得越界
105  * @param obj {void*} 动态成员变量
106  * @return {int} 0: 成功;-1: 失败
107  */
108 ACL_API int acl_array_succ_insert(ACL_ARRAY *a, int position, void *obj);
109 #define acl_array_insert acl_array_succ_insert
110 
111 /**
112  * 从动态数组中的指定位置删除某个动态对象, 删除后数组内元素的先后顺序保持不变,
113  * 如果被删除位置在中间某个位置,为了保证元素的顺序性,内部将被删除元素后的所有元素
114  * 都前移一个位置
115  * @param a {ACL_ARRAY*} 动态数组指针
116  * @param position {int} 某个位置,不得越界
117  * @param free_fn {void (*)(void*)} 用于释放动态数组内成员变量的释放函数指针,如果该
118  * 指针为空,则不释放,否则用此函数进行释放动态对象
119  * @return {int} 0: 成功;-1: 失败
120  */
121 ACL_API int acl_array_delete_idx(ACL_ARRAY *a, int position, void (*free_fn)(void *));
122 
123 /**
124  * 从动态数组中的指定位置删除某个对象,删除后数组内元素的先后顺序有可能发生了改变,
125  * 因为删除后会自动将数组中最后的元素移至该位置处
126  * @param a {ACL_ARRAY*} 动态数组指针
127  * @param position {int} 某个位置,不得越界
128  * @param free_fn {void (*)(void*)} 用于释放动态数组内成员变量的释放函数指针,如果该
129  * 指针为空,则不释放,否则用此函数进行释放动态对象
130  * @return {int} 0: 成功;-1: 失败
131  */
132 ACL_API int acl_array_delete(ACL_ARRAY *a, int position, void (*free_fn)(void*));
133 
134 /**
135  * 从动态数组中删除指定指针地址的动态对象, 删除后数组内元素的先后顺序保持不变
136  * 如果被删除位置在中间某个位置,为了保证元素的顺序性内部,将被删除元素后的所有元素
137  * 都前移一个位置
138  * @param a {ACL_ARRAY*} 动态数组指针
139  * @param obj {void*} 动态对象指针地址
140  * @param free_fn {void (*)(void*)} 用于释放动态数组内成员变量的释放函数指针,如果该
141  * 指针为空,则不释放,否则用此函数进行释放动态对象
142  * @return {int} 0: 成功;-1: 失败
143  */
144 ACL_API int acl_array_delete_obj(ACL_ARRAY *a, void *obj, void (*free_fn)(void *));
145 
146 /**
147  * 从动态数组中删除某个下标范围的动态对象
148  * @param a {ACL_ARRAY*} 动态数组指针
149  * @param ibegin {int} 开始下标位置
150  * @param iend {int} 结束下标位置
151  * @param free_fn {void (*)(void*)} 用于释放动态数组内成员变量的释放函数指针,如果该
152  * 指针为空,则不释放,否则用此函数进行释放动态对象
153  * @return {int} 0: 成功;-1: 失败
154  */
155 ACL_API int acl_array_delete_range(ACL_ARRAY *a, int ibegin, int iend, void (*free_fn)(void*));
156 
157 /**
158  * 移动动态数组中的对象
159  * @param a {ACL_ARRAY*} 动态数组指针
160  * @param ito {int} 移动至目标下标位置
161  * @param ifrom {int} 从此下标位置开始移动
162  * @param free_fn {void (*)(void*)} 用于释放动态数组内成员变量的释放函数指针,如果该
163  * 指针为空,则不释放,否则用此函数进行释放动态对象被释放的动态对象区间为
164  * [idx_obj_begin, idx_src_begin), 为一半开半闭区间
165  * @return {int} 0: 成功;-1: 失败
166  */
167 ACL_API int acl_array_mv_idx(ACL_ARRAY *a, int ito, int ifrom, void (*free_fn)(void *) );
168 
169 /**
170  * 预先保证动态数组的空间长度
171  * @param a {ACL_ARRAY*} 动态数组指针
172  * @param app_count {int} 需要动态数组至少有 app_count 个空闲位置
173  */
174 ACL_API void acl_array_pre_append(ACL_ARRAY *a, int app_count);
175 
176 /**
177  * 从动态数组中的某个下标位置取出动态对象
178  * @param a {ACL_ARRAY*} 动态数组指针
179  * @param idx {int} 下标位置,不能越界,否则返回-1
180  * @return {void*} != NULL: 成功;== NULL: 不存在或失败
181  */
182 ACL_API void *acl_array_index(const ACL_ARRAY *a, int idx);
183 
184 /**
185  * 获得当前动态数组中动态对象的个数
186  * @param a {ACL_ARRAY*} 动态数组指针
187  * @return {int} 动态数组中动态对象的个数
188  */
189 ACL_API int acl_array_size(const ACL_ARRAY *a);
190 
191 #ifdef __cplusplus
192 }
193 #endif
194 
195 #endif
196 
ACL_API int acl_array_pred_insert(ACL_ARRAY *a, int position, void *obj)
void(* push_back)(struct ACL_ARRAY *, void *)
Definition: acl_array.h:25
ACL_API void acl_array_free(ACL_ARRAY *a, void(*free_fn)(void *))
ACL_DBUF_POOL * dbuf
Definition: acl_array.h:17
void(* push_front)(struct ACL_ARRAY *, void *)
Definition: acl_array.h:27
ACL_API int acl_array_prepend(ACL_ARRAY *a, void *obj)
ACL_API int acl_array_delete_obj(ACL_ARRAY *a, void *obj, void(*free_fn)(void *))
ACL_API void acl_array_clean(ACL_ARRAY *a, void(*free_fn)(void *))
ACL_API int acl_array_succ_insert(ACL_ARRAY *a, int position, void *obj)
ACL_API int acl_array_delete_idx(ACL_ARRAY *a, int position, void(*free_fn)(void *))
ACL_API int acl_array_size(const ACL_ARRAY *a)
int count
Definition: acl_array.h:19
ACL_API void * acl_array_index(const ACL_ARRAY *a, int idx)
ACL_API ACL_ARRAY * acl_array_dbuf_create(int init_size, ACL_DBUF_POOL *dbuf)
ACL_API int acl_array_delete(ACL_ARRAY *a, int position, void(*free_fn)(void *))
int capacity
Definition: acl_array.h:18
ACL_API void acl_array_pre_append(ACL_ARRAY *a, int app_count)
struct ACL_DBUF_POOL ACL_DBUF_POOL
Definition: acl_dbuf_pool.h:8
ACL_API ACL_ARRAY * acl_array_create(int init_size)
ACL_API int acl_array_append(ACL_ARRAY *a, void *obj)
void ** items
Definition: acl_array.h:20
ACL_API int acl_array_mv_idx(ACL_ARRAY *a, int ito, int ifrom, void(*free_fn)(void *))
ACL_API int acl_array_delete_range(ACL_ARRAY *a, int ibegin, int iend, void(*free_fn)(void *))