acl  3.5.3.0
acl_dlink.h
浏览该文件的文档.
1 #ifndef ACL_DLINK_INCLUDE
2 #define ACL_DLINK_INCLUDE
3 
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7 
8 #include "acl_define.h"
9 #include "acl_array.h"
10 #include "acl_iterator.h"
11 
12 /**
13  * 二分块数据链元素类型定义
14  */
15 typedef struct {
16  acl_int64 begin;
17  acl_int64 end;
18  void *pnode;
19 } ACL_DITEM;
20 
21 /**
22  * 二分块数据链类型定义
23  */
24 typedef struct ACL_DLINK {
27 
28  /* for acl_iterator */
29 
30  /* 取迭代器头函数 */
31  void *(*iter_head)(ACL_ITER*, struct ACL_DLINK*);
32  /* 取迭代器下一个函数 */
33  void *(*iter_next)(ACL_ITER*, struct ACL_DLINK*);
34  /* 取迭代器尾函数 */
35  void *(*iter_tail)(ACL_ITER*, struct ACL_DLINK*);
36  /* 取迭代器上一个函数 */
37  void *(*iter_prev)(ACL_ITER*, struct ACL_DLINK*);
38 } ACL_DLINK;
39 
40 /**
41  * 创建一个二分块数据链对象
42  * @param nsize {int} 初始数组大小
43  * @return {ACL_DLINK*} 二分块数据链对象
44  */
45 ACL_API ACL_DLINK *acl_dlink_create(int nsize);
46 
47 /**
48  * 释放一个二分块数据链对象
49  * @param plink {ACL_DLINK*} 二分块数据链对象指针
50  */
51 ACL_API void acl_dlink_free(ACL_DLINK *plink);
52 
53 /**
54  * 根据二分块数据元素查找其是否正在于二分块数据链中
55  * @param plink {ACL_DLINK*} 二分块数据链对象指针
56  * @param pitem {ACL_DITEM*} 数据块元素
57  * @return {ACL_DITEM*} 数据块元素
58  */
59 ACL_API ACL_DITEM *acl_dlink_lookup_by_item(const ACL_DLINK *plink,
60  ACL_DITEM *pitem);
61 
62 /**
63  * 根据数据元素查找二分块数据链中的数据元素
64  * @param plink {const ACL_DLINK*} 二分块数据链对象指针
65  * @param pitem {ACL_DITEM*} 数据块元素
66  * @param pidx {int*} 存储查询数据元素结果在二分数据链中的下标位置
67  * @return {ACL_DITEM*} 数据块元素
68  */
69 ACL_API ACL_DITEM *acl_dlink_lookup2_by_item(const ACL_DLINK *plink,
70  ACL_DITEM *pitem, int *pidx);
71 
72 /**
73  * 从二分块数据链中查询某个值所对应的数据块元素地址
74  * @param plink {const ACL_DLINK*} 二分块数据链对象指针
75  * @param n {acl_int64} 查询值
76  * @return {ACL_DITEM*} 数据块元素
77  */
78 ACL_API ACL_DITEM *acl_dlink_lookup(const ACL_DLINK *plink, acl_int64 n);
79 
80 /**
81  * 从二分块数据链中查询某个值所对应的数据块元素地址并记录其下标位置
82  * @param plink {const ACL_DLINK*} 二分块数据链对象指针
83  * @param n {acl_int64} 查询值
84  * @param pidx {int*} 存储查询数据元素结果在二分数据链中的下标位置
85  * @return {ACL_DITEM*} 数据块元素
86  */
87 ACL_API ACL_DITEM *acl_dlink_lookup2(const ACL_DLINK *plink,
88  acl_int64 n, int *pidx);
89 
90 /**
91  * 从二分块数据链中查询某个范围的数据块元素地址并记录其下标位置
92  * @param plink {const ACL_DLINK*} 二分块数据链对象指针
93  * @param begin {acl_int64} 查询范围的起始位置值
94  * @param end {acl_int64} 查询范围的结束位置值
95  * @param pidx {int*} 存储查询数据元素结果在二分数据链中的下标位置
96  * @return {ACL_DITEM*} 数据块元素
97  */
98 ACL_API ACL_DITEM *acl_dlink_lookup_range(const ACL_DLINK *plink,
99  acl_int64 begin, acl_int64 end, int *pidx);
100 
101 /**
102  * 从二分块数据链中查询第一个大于某个给定值的数据块元素并记录下标位置
103  * @param plink {const ACL_DLINK*} 二分块数据链对象指针
104  * @param off {acl_int64} 给定比较值
105  * @param pidx {int*} 存储查询数据元素结果在二分数据链中的下标位置
106  * @return {ACL_DITEM*} 数据块元素
107  */
108 ACL_API ACL_DITEM *acl_dlink_lookup_larger(const ACL_DLINK *plink,
109  acl_int64 off, int *pidx);
110 
111 /**
112  * 从二分块数据链中查询第一个小于某个给定值的数据块元素并记录下标位置
113  * @param plink {const ACL_DLINK*} 二分块数据链对象指针
114  * @param off {acl_int64} 给定比较值
115  * @param pidx {int*} 存储查询数据元素结果在二分数据链中的下标位置
116  * @return {ACL_DITEM*} 数据块元素
117  */
118 ACL_API ACL_DITEM *acl_dlink_lookup_lower(const ACL_DLINK *plink,
119  acl_int64 off, int *pidx);
120 
121 /**
122  * 向二分块数据链中添加起始、结束数据块
123  * @param plink {ACL_DLINK*} 二分块数据链对象指针
124  * @param begin {acl_int64} 给定起始位置值
125  * @param end {acl_int64} 给定结束位置值
126  * @return {ACL_DITEM*} 新创建的数据块元素
127  */
128 ACL_API ACL_DITEM *acl_dlink_insert(ACL_DLINK *plink,
129  acl_int64 begin, acl_int64 end);
130 
131 /**
132  * 从二分块数据链中删除包含某个给定值的数据块元素
133  * @param plink {ACL_DLINK*} 二分块数据链对象指针
134  * @param n {acl_int64} 给定位置值
135  * @return {int} 0:表示OK,-1: 表示输入参数非法或不存在
136  */
137 ACL_API int acl_dlink_delete(ACL_DLINK *plink, acl_int64 n);
138 
139 /**
140  * 根据数据块元素从二分块数据链中删除该数据块元素
141  * @param plink {ACL_DLINK*} 二分块数据链对象指针
142  * @param pitem {ACL_DITEM*} 数据块元素
143  * @return {int} 0:表示OK,-1: 表示输入参数非法
144  */
145 ACL_API int acl_dlink_delete_by_item(ACL_DLINK *plink, ACL_DITEM *pitem);
146 
147 /**
148  * 功能同 acl_dlink_insert
149  * @DEPRECATED 此函数将来也许不再提供
150  */
151 ACL_API ACL_DITEM *acl_dlink_modify(ACL_DLINK *plink,
152  acl_int64 begin, acl_int64 end);
153 
154 /**
155  * 从二分数据链中删除某个数值范围的数据块集合,
156  * 删除后有可能会在内部增加新的数据块元素
157  * @param plink {ACL_DLINK*} 二分块数据链对象指针
158  * @param begin {acl_int64} 需要删除范围的起始位置
159  * @param end {acl_int64} 需要删除范围的结束位置
160  * @return {int} 0:表示OK,-1: 表示输入参数非法
161  */
162 ACL_API int acl_dlink_delete_range(ACL_DLINK *plink,
163  acl_int64 begin, acl_int64 end);
164 
165 /**
166  * 返回某下标位置的数据块元素地址
167  * @param plink {const ACL_DLINK*} 二分块数据链对象指针
168  * @param idx {int} 下标位置
169  * @return {ACL_DITEM*} NULL: 下标越界; != NULL: 数据块元素地址
170  */
171 ACL_API ACL_DITEM *acl_dlink_index(const ACL_DLINK *plink, int idx);
172 
173 /**
174  * 获得当前二分数据链中所有数据块的个数总和
175  * @param plink {const ACL_DLINK*} 二分块数据链对象指针
176  * @return {int} 数据块的个数
177  */
178 ACL_API int acl_dlink_size(const ACL_DLINK *plink);
179 
180 /**
181  * (调试用)打印二分数据链中所有数据块的起始、结束位置等信息
182  * @param plink {const ACL_DLINK*} 二分块数据链对象指针
183  * @return {int} 0:表示OK,-1: 表示输入参数非法
184  */
185 ACL_API int acl_dlink_list(const ACL_DLINK *plink);
186 
187 #ifdef __cplusplus
188 }
189 #endif
190 #endif
ACL_API ACL_DITEM * acl_dlink_index(const ACL_DLINK *plink, int idx)
ACL_API ACL_DITEM * acl_dlink_lookup2(const ACL_DLINK *plink, acl_int64 n, int *pidx)
ACL_API int acl_dlink_delete_range(ACL_DLINK *plink, acl_int64 begin, acl_int64 end)
void * pnode
Definition: acl_dlink.h:18
ACL_API int acl_dlink_size(const ACL_DLINK *plink)
ACL_API ACL_DITEM * acl_dlink_insert(ACL_DLINK *plink, acl_int64 begin, acl_int64 end)
ACL_API ACL_DITEM * acl_dlink_lookup_range(const ACL_DLINK *plink, acl_int64 begin, acl_int64 end, int *pidx)
void * call_back_data
Definition: acl_dlink.h:26
ACL_API ACL_DITEM * acl_dlink_lookup_by_item(const ACL_DLINK *plink, ACL_DITEM *pitem)
acl_int64 begin
Definition: acl_dlink.h:16
ACL_API int acl_dlink_delete(ACL_DLINK *plink, acl_int64 n)
acl_int64 end
Definition: acl_dlink.h:17
ACL_API ACL_DITEM * acl_dlink_modify(ACL_DLINK *plink, acl_int64 begin, acl_int64 end)
ACL_API int acl_dlink_delete_by_item(ACL_DLINK *plink, ACL_DITEM *pitem)
struct ACL_DLINK ACL_DLINK
ACL_API ACL_DITEM * acl_dlink_lookup(const ACL_DLINK *plink, acl_int64 n)
ACL_API int acl_dlink_list(const ACL_DLINK *plink)
ACL_API ACL_DLINK * acl_dlink_create(int nsize)
ACL_API ACL_DITEM * acl_dlink_lookup_larger(const ACL_DLINK *plink, acl_int64 off, int *pidx)
ACL_API void acl_dlink_free(ACL_DLINK *plink)
ACL_ARRAY * parray
Definition: acl_dlink.h:25
ACL_API ACL_DITEM * acl_dlink_lookup2_by_item(const ACL_DLINK *plink, ACL_DITEM *pitem, int *pidx)
ACL_API ACL_DITEM * acl_dlink_lookup_lower(const ACL_DLINK *plink, acl_int64 off, int *pidx)