CVector.h

//
// cvector.h
// GKApp
//
// Created by 王明辉 on 16/4/15.
// Copyright (c) 2016年 GK. All rights reserved.
// #ifndef GCVECTOR_H
#define GCVECTOR_H #include "gtypes.h"
#include "seg_types.h" #define MIN_LEN 256
//#define CVEFAILED -1
//#define CVEERRORPARAM -2
#define CVESUCCESS 0
//#define CVEPUSHBACK 1
//#define CVEPOPBACK 2
#define CVEINSERT 3
#define CVERM 4
#define EXPANED_VAL 1
#define REDUSED_VAL 2 /**
* 错误码枚举类型
* 定义错误码枚举值
*/
typedef enum tagCVECTORSTATUS { CV_ERR_OK =0x00000000, /**< 操作成功 */
CV_ERR_INVALID_PARAM =0x00000001, /**< 参数无效 */
CV_ERR_NO_MEMORY =0x00000002, /**< 内存不足 */
CV_ERR_NO_DATA =0x00000003, /**< 无相关数据 */
CV_ERR_VER_INCOMPATIBLE =0x00000004, /**< 版本不匹配 */
CV_ERR_PBACK =0x00000007, /**< 没有后退 */
CV_ERR_PUSHBACK =0x00000008,
CV_ERR_INSERT =0x00000009, /**< 插值失败,回滚数据 */
CV_ERR_FAILED =0xffffffff /**< 操作失败,暂无具体错误码 */
} CVECTORSTATUS; typedef enum tagCVECTORSTRUCT {
CV_BASE_STRUCT =0x00000000, /**< CVECTOR 对象 */
CV_TEMP_STRUCT =0x00000030, /**< TEMPCVECTOR */
} CVECTORSTRUCTS; typedef struct tagCVector
{
void *cv_pdata;
Gint32 cv_len;//元素个数
Gint32 cv_tot_len;//空间总长度
Gint32 cv_size;//元素长度
CVECTORSTRUCTS cv_struct;//type
}tagCVector, *CVector; typedef void *CIterator;
//typedef struct tagCVector *CVector; #ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */ /**
**********************************************************************
\brief 进行比较的函数回调
\details 该函数用于进行比较的函数回调
\param[in] Target 需要比较的对象A
\param[in] arrayObj 需要比较的对象B
\return 1:pvTarget>arrayObj
0:等于
-1:pvTarget<arrayObj **********************************************************************/
typedef Gint32 (*CIteratorCompareFunc)(void* pvTarget, CIterator arrayObj); /**
**********************************************************************
\brief 创建CVector对象
\details 创建CVector对象
\param[in] hCVector 需要创建的CVector对象
\param[in] len: 元素的长度
\param[in] size: 单个元素的字节
\return CV_ERR_OK 成功
CV_ERR_INVALID_PARAM 参数错误
CV_ERR_FAILED 失败
**********************************************************************/
CVECTORSTATUS CVector_Create(const CVector hCVector,Gint32 len ,const Gint32 size); /**
**********************************************************************
\brief 释放CVector对象
\details 释放CVector对象
\param[in] hCVector 需要释放的CVector对象
\return CV_ERR_OK 成功
CV_ERR_INVALID_PARAM 参数错误
CV_ERR_FAILED 失败
**********************************************************************/
CVECTORSTATUS CVector_Destroy(const CVector hCVector);
/**
**********************************************************************
\brief 判断是否为空
\details 判断是Vector否为空
\param[in] hCVector CVector对象
\return Gtrue 空
Gfalse 非空
**********************************************************************/
Gbool CVector_Empty(const CVector hCVector);
/**
**********************************************************************
\brief 清空缓存
\details 清空缓存
\param[in] hCVector CVector对象
\return CV_ERR_OK 成功
CV_ERR_INVALID_PARAM 参数错误
CV_ERR_FAILED 失败
**********************************************************************/
CVECTORSTATUS CVector_Clear(const CVector hCVector);
/**
**********************************************************************
\brief 重置结构体的元素空间占用
\details 重置结构体的元素空间,重新设定长度,及元素的空间占用
\param[in] hCVector CVector对象
\param[in] len 元素的长度
\param[in] size 单个元素的字节
\return CV_ERR_OK 成功
CV_ERR_INVALID_PARAM 参数错误
CV_ERR_FAILED 失败
**********************************************************************/
CVECTORSTATUS CVector_Resize(const CVector hCVector,Gint32 len ,Gint32 nSize); /**
**********************************************************************
\brief 返回指定元素个数
\details 返回指定元素个数
\param[in] hCVector CVector对象
\return 返回元素个数
**********************************************************************/
Gint32 CVector_Length(const CVector hCVector); /**
**********************************************************************
\brief 将数据插入到CVector
\details 将数据插入CVector的最后位置
memb = GNULL 时将插入nLen个元素的'0'数据,CVector_NewEmpty就是利用这个特性完成的添加空数据功能
\param[in] hCVector CVector对象
\param[in] memb 插入数据的指针
\param[in] nLen 元素的长度
\return CV_ERR_OK 成功
CV_ERR_INVALID_PARAM 参数错误
CV_ERR_FAILED 失败
**********************************************************************/
CVECTORSTATUS CVector_Pushback(const CVector hCVector, void *memb,Gint32 nLen); /**
**********************************************************************
\brief 获取最后一个元素并删除该元素
\details 获取最后一个元素并删除该元素
\param[in] hCVector CVector对象
\return CV_ERR_OK 成功
CV_ERR_INVALID_PARAM 参数错误
CV_ERR_FAILED 失败
**********************************************************************/
CVECTORSTATUS CVector_Popback(const CVector hCVector); /**
**********************************************************************
\brief 创建空元素
\details 在Vector中添加空元素并返回该元素所对应的指针
\param[in] hCVector CVector对象
\param[in] pvIter 元素对象
\return 返回当前元素对象指针
**********************************************************************/
CIterator CVector_NewEmpty(const CVector hCVector); /**
**********************************************************************
\brief 在index位置插入到指定元素
\details 在index位置插入到指定元素
\param[in] hCVector CVector对象
\param[in] nIdx 插入位置
\param[in] memb 需要插入的元素指针
\return CV_ERR_OK 成功
CV_ERR_INVALID_PARAM 参数错误
CV_ERR_FAILED 失败
**********************************************************************/
CVECTORSTATUS CVector_Insert_Idx(const CVector hCVector, Gint32 nIdx, void *memb);
/**
**********************************************************************
\brief 在pvIter位置插入到指定元素
\details 在pvIter位置插入到指定元素
\param[in] hCVector CVector对象
\param[in] pvIter 插入位置
\param[in] memb 需要插入的元素指针
\return CV_ERR_OK 成功
CV_ERR_INVALID_PARAM 参数错误
CV_ERR_FAILED 失败
**********************************************************************/
CVECTORSTATUS CVector_Insert(const CVector pstVector, CIterator pvIter, void *memb);
/**
**********************************************************************
\brief 删除指定元素
\details 删除指定元素
\param[in] hCVector CVector对象
\param[in] memb 需要插入的元素指针
\return CV_ERR_OK 成功
CV_ERR_INVALID_PARAM 参数错误
CV_ERR_FAILED 失败
**********************************************************************/
//删除指定元素
CVECTORSTATUS CVector_Rm(const CVector hCVector, CIterator pvIter);
/**
**********************************************************************
\brief 删除指定位置的元素
\details 删除指定位置的元素
\param[in] hCVector CVector对象
\param[in] nIdx 插入位置
\return CV_ERR_OK 成功
CV_ERR_INVALID_PARAM 参数错误
CV_ERR_FAILED 失败
**********************************************************************/
CVECTORSTATUS CVector_Rm_Idx(const CVector hCVector, Gint32 nIdx); /**
**********************************************************************
\brief 根据元素返回该元素所对应的位置
\details 根据元素返回该元素所对应的位置
\param[in] hCVector CVector对象
\param[in] pvIter 元素对象
\return 返回当前元素所在位置
**********************************************************************/
Gint32 CVector_At(const CVector hCVector, CIterator pvIter);
/**
**********************************************************************
\brief 根据索引Id返回该元素所对应的指针
\details 根据索引Id返回该元素所对应的指针
\param[in] hCVector CVector对象
\param[in] nIdx 索引ID
\return 返回指定元素
**********************************************************************/
CIterator CVector_At_Idx(const CVector hCVector, Gint32 nIdx); /**
**********************************************************************
\brief 元素交换
\details 元素交换
\param[in] hCVector CVector对象
\param[in] pvIter1 需要交换的元素
\param[in] pvIter2 需要交换的元素
\return CV_ERR_OK 成功
CV_ERR_INVALID_PARAM 参数错误
CV_ERR_FAILED 失败
**********************************************************************/
CVECTORSTATUS CVector_Swap(const CVector cv, CIterator pvIter1, CIterator pvIter2); //----------------扩展-----------------------------//
/**
**********************************************************************
\brief 求两个Gint32数组的非集
\details 该函数用于求两个Gint32数组的非集
\param[in] pstMutableCache 缓存数组
\param[in] pvnIndexB 需要合并的数组
\param[in] nIdxCntB 需要合并数组A长度
\return 返回合并是否成功
**********************************************************************/
CVECTORSTATUS CVector_Negation(CVector pstVector, void *pvnIndexB, Gint32 nIdxCntB); /**
**********************************************************************
\brief 搜索结果索引排序
\details 搜索结果索引排序
\param[in] pvnList 数组, 无序
\param[in] nStartIdx 起始下标
\param[in] nSortCnt 满足排序要求的最小个数,优化效率,为0时为全排
\param[in] bRepeat 是否去重
\param[in] pstCompare_func 排序来确认是升序还是降序
\param[out] pvnList 数组, 有序
\retval 排序后个数
**********************************************************************/
Gint32 CVector_Sort(const CVector pstVector,Gint32 nStartIdx, Gint32 nSortCnt,Gbool bRepeat, CIteratorCompareFunc pstCompare_func);
/**
**********************************************************************
\brief 求两个Gint32数组的并集
\details 该函数用于求两个Gint32数组的并集
\param[in] pstMutableCache 缓存数组
\param[in] pvnIndexB 需要合并的数组
\param[in] nIdxCntB 需要合并数组A长度
\return 返回合并是否成功
**********************************************************************/
CVECTORSTATUS CVector_Merge(CVector pstVector,void *pvnIndexB,Gint32 nIdxCntB);
/**
**********************************************************************
\brief 求两个Gint32数组的交集
\details 该函数用于求两个Gint32数组的交集
\param[in] pstMutableCache 缓存数组
\param[in] pvnIndexB 需要合并的数组
\param[in] nIdxCntB 需要合并数组A长度
\return 返回合并是否成功
**********************************************************************/
CVECTORSTATUS CVector_Intersect(CVector pstVector,void *pvnIndexB,Gint32 nIdxCntB); //注: 针对的是调用 Sort 排好序的 Array 容器才可以使用
//[in] poArray: 源数据数组指针
//[in] nArrayCnt: 源数据数组个数
//[in] nStructSize: 单个数组元素结构体占用的空间数
//[in] Target: 需要比较的对象
//[Out] pnOutPos: 结果所在位置
// 返回值: 返回找到的对象
CIterator CVector_IteratorFindByObj(CVector pstVector,CIteratorCompareFunc compare_func,void * pvTarget, Gint32 * pnOutPos); /* for test */
void cv_info(const CVector cv);
void cv_print(const CVector cv);
void CVector_Printf(const CVector cv);
void CVector_Test();
#ifdef __cplusplus
}
#endif /* __cplusplus */ #endif /* EOF file cvector.h */

CVector.c

  1 //
2 // cvector.c
3 // GKApp
4 //
5 // Created by wmh on 16/4/15.
6 // Copyright 2016年 GK. All rights reserved.
7 //
8
9 #include "segl_cvector.h"
10 #include "segl_tempcache.h"
11 #include "segl_utils.h"
12 #include "segl_cvectorcompare.h"
13 #include "libgdc.h"
14 #include <stdio.h>
15 #include <stdlib.h>
16 #include <string.h>
17 //#include <unistd.h>
18 #define EXPANED_VAL 1
19 #define REDUSED_VAL 2
20
21 //typedef void *CIterator;
22
23
24 //#define CWARNING_ITER(cv, iter, file, func, line) \
25 //do {\
26 //if ((CVector_Begin(cv) > iter) || (CVector_End(cv) <= iter)) {\
27 //fprintf(stderr, "var(" #iter ") warng out of range, "\
28 //"at file:%s func:%s line:%d!!/n", file, func, line);\
29 //return CV_ERR_FAILED;\
30 //}\
31 //} while (0)
32
33 //CWARNING_ITER(pstVector, iter, __FILE__, __func__, __LINE__);
34
35 #ifdef GLOG_ON
36 #define CWARNING_CVECTOR(pstCVector,ret) \
37 do {\
38 if (pstCVector == GNULL) {\
39 GLOG_POI_DEBUG(GT("pstCVector is NULL, at file:%s line:%s\n"), __GFILE__, __GLINE__);\
40 return ret;\
41 }\
42 } while (0)
43 #else
44 #define CWARNING_CVECTOR(pstCVector,ret) \
45 do {\
46 if (pstCVector == GNULL) {\
47 return ret;\
48 }\
49 } while (0)
50 #endif
51
52 #ifdef GLOG_ON
53 #define CWARNING_ITER(pstCVector, iter,ret) \
54 do {\
55 if ((pstCVector == GNULL) ||(CVector_Begin(pstCVector) > iter) || (CVector_End(pstCVector) <= iter)) {\
56 GLOG_POI_DEBUG(GT("pstCVector is NULL or var(iter) warng out of range, at file:%s line:%s\n"), __GFILE__, __GLINE__);\
57 return ret;\
58 }\
59 } while (0)
60
61 #define CWARNING_ITERS(pstCVector, iter,iter2,ret) \
62 do {\
63 if ((pstCVector == GNULL) ||(CVector_Begin(pstCVector) > iter) || (CVector_End(pstCVector) <= iter)||(CVector_Begin(pstCVector) > iter2) || (CVector_End(pstCVector) <= iter2)) {\
64 GLOG_POI_DEBUG(GT("pstCVector is NULL or var(iter) warng out of range, at file:%s line:%s\n"), __GFILE__, __GLINE__);\
65 return ret;\
66 }\
67 } while (0)
68
69
70
71 #else
72 #define CWARNING_ITER(pstCVector, iter,ret) \
73 do {\
74 if ((pstCVector == GNULL) ||(CVector_Begin(pstCVector) > iter) || (CVector_End(pstCVector) <= iter)) {\
75 return ret;\
76 }\
77 } while (0)
78
79 #define CWARNING_ITERS(pstCVector, iter,iter2,ret) \
80 do {\
81 if ((pstCVector == GNULL) ||(CVector_Begin(pstCVector) > iter) || (CVector_End(pstCVector) <= iter)||(CVector_Begin(pstCVector) > iter2) || (CVector_End(pstCVector) <= iter2)) {\
82 return ret;\
83 }\
84 } while (0)
85
86 #endif
87
88 //Gint32 CVector_val(const CVector cv, CIterator iter, void *memb);
89 //返回第一个元素
90 CIterator CVector_Begin(const CVector pstCVector);
91 //返回最后一个元素
92 CIterator CVector_End(const CVector pstCVector);
93 //返回下一个元素
94 CIterator CVector_Next(const CVector pstCVector, CIterator iter);
95
96 CVECTORSTATUS CVector_Create(const CVector pstCVector,Gint32 nLen ,const Gint32 nSize)
97 {
98 CWARNING_CVECTOR(pstCVector,CV_ERR_INVALID_PARAM);
99
100 if (nSize <= 0 || nLen <= 0)
101 {
102 return CV_ERR_INVALID_PARAM;
103 }
104
105 if(nLen * nSize > pstCVector->cv_tot_len)
106 {
107 if(pstCVector->cv_tot_len>0)
108 {
109 Gfree(pstCVector->cv_pdata);
110 }
111 pstCVector->cv_pdata = Gmalloc(nLen * nSize);
112 Gmemset(pstCVector->cv_pdata, 0, nLen * nSize);
113 pstCVector->cv_tot_len = nLen * nSize;
114 }
115
116 if (pstCVector->cv_pdata == GNULL)
117 {
118 return CV_ERR_FAILED;
119 }
120 pstCVector->cv_size = nSize;
121 pstCVector->cv_len = 0;
122 return CV_ERR_OK;
123 }
124 CVECTORSTATUS CVector_Resize(const CVector pstCVector, Gint32 nLen, Gint32 nSize)
125 {
126 CVECTORSTATUS ret;
127 CWARNING_CVECTOR(pstCVector,CV_ERR_INVALID_PARAM);
128 if (nSize <= 0)
129 {
130 return CV_ERR_INVALID_PARAM;
131 }
132
133 if(nLen * nSize > pstCVector->cv_tot_len)
134 {
135 CVector_Destroy(pstCVector);
136 ret = CVector_Create(pstCVector, nLen, nSize);
137 if(ret != CV_ERR_OK){
138 return ret;
139 }
140 }
141 pstCVector->cv_size = nSize;
142 pstCVector->cv_len = 0;
143 return CV_ERR_OK;
144 }
145
146 CVECTORSTATUS CVector_Destroy(CVector pstCVector)
147 {
148 CWARNING_CVECTOR(pstCVector,CV_ERR_INVALID_PARAM);
149
150 if (pstCVector->cv_pdata != GNULL)
151 {
152 Gfree(pstCVector->cv_pdata);
153 pstCVector->cv_pdata = GNULL;
154 }
155 pstCVector->cv_tot_len = 0;
156 pstCVector->cv_size = 0;
157 pstCVector->cv_len = 0;
158
159 return CV_ERR_OK;
160 }
161
162 Gint32 CVector_Length(const CVector pstCVector)
163 {
164 CWARNING_CVECTOR(pstCVector, 0);
165 return pstCVector->cv_len;
166 }
167 //创建空元素
168 CIterator CVector_NewEmpty(const CVector pstVector)
169 {
170 CWARNING_CVECTOR(pstVector, GNULL);
171 if(CV_ERR_OK == CVector_Pushback(pstVector, GNULL, 1))
172 {
173 if(pstVector->cv_len > 0)
174 {
175 return CVector_At_Idx(pstVector, pstVector->cv_len - 1);
176 }
177 }
178 return GNULL;
179 }
180
181 CVECTORSTATUS CVector_Pushback(const CVector pstVector, void *memb, Gint32 len)
182 {
183 Gint32 tot_len = 0;
184 void *cv_pdata= GNULL;
185 CWARNING_CVECTOR(pstVector,CV_ERR_INVALID_PARAM);
186 if(len <=0)
187 {
188 return CV_ERR_INVALID_PARAM;
189 }
190 tot_len = (pstVector->cv_len+len) * pstVector->cv_size;
191 if( tot_len >= pstVector->cv_tot_len)
192 {
193 tot_len += 50 * pstVector->cv_size;
194 cv_pdata = Gmalloc(tot_len);
195 Gmemset(cv_pdata,0,tot_len);
196 Gmemcpy(cv_pdata,pstVector->cv_pdata, pstVector->cv_tot_len);
197
198 if (GNULL == cv_pdata)
199 {
200 return CV_ERR_PUSHBACK;
201 }
202 Gfree(pstVector->cv_pdata);
203 pstVector->cv_pdata = cv_pdata;
204 pstVector->cv_tot_len = tot_len;
205 }
206 if(memb != GNULL)
207 {
208 Gmemcpy((Gint8*)pstVector->cv_pdata + pstVector->cv_len * pstVector->cv_size, memb, len * pstVector->cv_size);
209 }
210 else
211 { //置空内存,减少错误 by wmh
212 Gmemset((Gint8*)pstVector->cv_pdata + pstVector->cv_len * pstVector->cv_size,0,len * pstVector->cv_size);
213 }
214 pstVector->cv_len += len;
215 return CV_ERR_OK;
216 }
217
218 CVECTORSTATUS CVector_Popback(const CVector pstVector)
219 {
220 CWARNING_CVECTOR(pstVector,CV_ERR_INVALID_PARAM);
221
222 if (pstVector->cv_len <= 0)
223 {
224 return CV_ERR_PBACK;
225 }
226 pstVector->cv_len--;
227 return CV_ERR_OK;
228 }
229
230
231
232 CIterator CVector_Begin(const CVector pstVector)
233 {
234 CWARNING_CVECTOR(pstVector,GNULL);
235 return pstVector->cv_pdata;
236 }
237
238 CIterator CVector_End(const CVector pstVector)
239 {
240 CWARNING_CVECTOR(pstVector,GNULL);
241 if(pstVector->cv_pdata == GNULL)
242 {
243 return GNULL;
244 }
245
246 return (Gint8*)pstVector->cv_pdata + (pstVector->cv_size * pstVector->cv_len);
247 }
248
249 CVECTORSTATUS cvmemove_foreward(const CVector pstVector, void *from, void *to)
250 {
251 Gint32 size = 0;
252 void *p = GNULL;
253 CWARNING_CVECTOR(pstVector,CV_ERR_INVALID_PARAM);
254 size = pstVector->cv_size;
255 for (p = to; p >= from; )
256 {
257 Gmemcpy((Gint8*)p + size, p, size);
258 p = (Gint8*)p-size;
259 }
260 return CV_ERR_OK;
261 }
262
263 CVECTORSTATUS cvmemove_backward(const CVector pstVector, void *from, void *to)
264 {
265 CWARNING_CVECTOR(pstVector,CV_ERR_INVALID_PARAM);
266 Gmemcpy(from, (Gint8*)from + pstVector->cv_size, (Gint8*)to - (Gint8*)from);
267 return CV_ERR_OK;
268 }
269
270 CVECTORSTATUS CVector_Insert_Idx(const CVector pstCVector, Gint32 index, void *memb)
271 {
272 CIterator iter = GNULL;
273 CWARNING_CVECTOR(pstCVector,CV_ERR_INVALID_PARAM);
274 if( index < 0 || memb == GNULL)
275 {
276 return CV_ERR_INVALID_PARAM;
277 }
278 if (index >= pstCVector->cv_tot_len)
279 {
280 pstCVector->cv_len = index + 1;
281 while (pstCVector->cv_len >= pstCVector->cv_tot_len) pstCVector->cv_tot_len <<= EXPANED_VAL;
282 pstCVector->cv_pdata = Grealloc(pstCVector->cv_pdata, pstCVector->cv_tot_len * pstCVector->cv_size);
283 iter = (Gint8*)pstCVector->cv_pdata + pstCVector->cv_size * index;
284 Gmemcpy(iter, memb, pstCVector->cv_size);
285 }
286 else
287 {
288 iter = (Gint8*)pstCVector->cv_pdata + pstCVector->cv_size * index;
289 CVector_Insert(pstCVector, iter, memb);
290 }
291 return 0;
292 }
293 CVECTORSTATUS CVector_Insert(const CVector pstVector, CIterator iter, void *memb)
294 {
295 CWARNING_ITER(pstVector, iter,CV_ERR_INVALID_PARAM);
296 if( memb == GNULL)
297 {
298 return CV_ERR_INVALID_PARAM;
299 }
300
301 if (pstVector->cv_len >= pstVector->cv_tot_len)
302 {
303 void *pd_sav = pstVector->cv_pdata;
304 pstVector->cv_tot_len <<= EXPANED_VAL;
305 pstVector->cv_pdata = Grealloc(pstVector->cv_pdata, pstVector->cv_tot_len * pstVector->cv_size);
306
307 if (!pstVector->cv_pdata)
308 {
309 pstVector->cv_pdata = pd_sav;
310 pstVector->cv_tot_len >>= EXPANED_VAL;
311 return CV_ERR_INSERT;
312 }
313 }
314
315 cvmemove_foreward(pstVector, iter, (Gint8*)pstVector->cv_pdata + pstVector->cv_len * pstVector->cv_size);
316 Gmemcpy(iter, memb, pstVector->cv_size);
317 pstVector->cv_len++;
318
319 return CV_ERR_OK;
320 }
321
322 CIterator CVector_Next(const CVector pstCVector, CIterator iter)
323 {
324 CWARNING_ITER(pstCVector, iter,GNULL);
325 return (Gint8*)iter + pstCVector->cv_size;
326 }
327
328 Gint32 CVector_Val(const CVector pstCVector, CIterator iter, void *memb)
329 {
330 CWARNING_ITER(pstCVector, iter,GNULL);
331 Gmemcpy(memb, iter, pstCVector->cv_size);
332 return 0;
333 }
334
335 Gint32 CVector_At(const CVector pstCVector, CIterator iterator)
336 {
337 Gint32 nRet = -1;
338 CWARNING_ITER(pstCVector, iterator,nRet);
339
340 nRet=(Gint32)((Gint8*)iterator - (Gint8*)CVector_Begin(pstCVector))/pstCVector->cv_size;
341 if(nRet >=0)
342 {
343 return nRet;
344 }
345 else
346 {
347 return -1;
348 }
349 }
350
351 CIterator CVector_At_Idx(const CVector pstCVector, Gint32 index)
352 {
353 CWARNING_CVECTOR(pstCVector,GNULL);
354 if(index < 0)
355 {
356 return GNULL;
357 }
358 if(index < pstCVector->cv_len)
359 {
360 return (Gint8*)pstCVector->cv_pdata + index * pstCVector->cv_size;
361 }
362 else
363 {
364 return GNULL;
365 }
366 }
367 CVECTORSTATUS CVector_Swap(const CVector pstVector, CIterator itera1, CIterator itera2)
368 {
369 CIterator tempIterator = GNULL;
370 CWARNING_ITERS(pstVector, itera1,itera2,CV_ERR_INVALID_PARAM);
371
372 tempIterator = Gmalloc(pstVector->cv_size);
373 if (tempIterator == GNULL)
374 {
375 return (CV_ERR_FAILED);
376 }
377 Gmemcpy(tempIterator,itera1,pstVector->cv_size);
378 Gmemcpy(itera1,itera2,pstVector->cv_size);
379 Gmemcpy(itera2,tempIterator,pstVector->cv_size);
380 Gfree(tempIterator);
381 tempIterator = GNULL;
382 return CV_ERR_OK;
383 }
384 CVECTORSTATUS CVector_Rm(const CVector pstVector, CIterator iter)
385 {
386 CIterator from = GNULL;
387 CIterator end = GNULL;
388 CWARNING_ITER(pstVector, iter,CV_ERR_INVALID_PARAM);
389 from = iter;
390 end = CVector_End(pstVector);
391 if(from == GNULL || from >= end)
392 {
393 return CV_ERR_INVALID_PARAM;
394 }
395 Gmemcpy(from, (Gint8*)from + pstVector->cv_size, (Gint8*)end - (Gint8*)from);
396 pstVector->cv_len--;
397
398 if ((pstVector->cv_tot_len >= (MIN_LEN << REDUSED_VAL))
399 && (pstVector->cv_len <= (pstVector->cv_tot_len >> REDUSED_VAL)))
400 {
401 void *pd_sav = pstVector->cv_pdata;
402 pstVector->cv_tot_len >>= EXPANED_VAL;
403 pstVector->cv_pdata = realloc(pstVector->cv_pdata, pstVector->cv_tot_len * pstVector->cv_size);
404
405 if (!pstVector->cv_pdata)
406 {
407 pstVector->cv_tot_len <<= EXPANED_VAL;
408 pstVector->cv_pdata = pd_sav;
409 return CVERM;
410 }
411 }
412
413 return CV_ERR_OK;
414 }
415
416 CVECTORSTATUS CVector_Rm_Idx(const CVector pstVector, Gint32 index)
417 {
418 CIterator iter = GNULL;
419 CWARNING_CVECTOR(pstVector,CV_ERR_INVALID_PARAM);
420 if(index <0 )
421 {
422 return CV_ERR_INVALID_PARAM;
423 }
424 iter = (Gint8*)pstVector->cv_pdata + pstVector->cv_size * index;
425 CWARNING_ITER(pstVector, iter,CV_ERR_INVALID_PARAM);
426 return CVector_Rm(pstVector, iter);
427 }
428 Gbool CVector_Empty(const CVector pstVector)
429 {
430 CWARNING_CVECTOR(pstVector,Gtrue);
431 if(pstVector->cv_len <= 0)
432 {
433 return Gtrue;
434 }
435 else
436 {
437 return Gfalse;
438 }
439 }
440
441 CVECTORSTATUS CVector_Clear(const CVector pstVector)
442 {
443 CWARNING_CVECTOR(pstVector,CV_ERR_INVALID_PARAM);
444 pstVector->cv_len=0;
445 return CV_ERR_OK;
446 }
447
448 void CVector_Printf(const CVector pstVector)
449 {
450 #ifdef GLOG_ON
451 if(pstVector != GNULL)
452 {
453 GLOG_POI_DEBUG(GT("addr=%d,cv_pdata=%d,cv_len=%d,cv_size=%d,cv_tot_len=%d\n"),pstVector,pstVector->cv_pdata,pstVector->cv_len,pstVector->cv_size,pstVector->cv_tot_len);
454 }
455 else
456 {
457 GLOG_POI_DEBUG(GT("CVector is NULL"));
458 }
459 #endif
460 }
461
462 void CVector_Test()
463 {
464 #ifdef GLOG_POI_RELEASE
465 Gint32 i=0;
466 Gint32 x = 0;
467 Gint32 value=10;
468 Gint32 nIndex=22;
469 Gint32 pnOutPos=0;
470 Gint32 stats = 0;
471 Gint32 nPoiCnt=205;
472 Gint32 nSortCut;
473 Gint32 *iterator;
474 CVector pstVector=Gmalloc(sizeof(tagCVector));
475 Gmemset(pstVector,0,sizeof(tagCVector));
476 stats = CVector_Create(pstVector,100,sizeof(Gint32));
477 if(pstVector!= GNULL)
478 {
479 for(i=0;i<200;i++)
480 {
481 value++;
482 CVector_Pushback(pstVector, &value, 1);
483 }
484 value=13;
485 CVector_Pushback(pstVector, &value, 1);
486 value=17;
487 CVector_Pushback(pstVector, &value, 1);
488 value=19;
489 CVector_Pushback(pstVector, &value, 1);
490 value=21;
491 CVector_Pushback(pstVector, &value, 1);
492 value=11;
493 CVector_Pushback(pstVector, &value, 1);
494 // for(x=0;x<CVector_Length(pstVector);x++)
495 // {
496 // iterator= CVector_At_Idx(pstVector,x);
497 // GLOG_POI_DEBUG(GT("CVector x=%d,value=%d\n"),x,(*iterator));
498 // }
499 GLOG_POI_DEBUG(GT("CVector.Sort() start\n"));
500
501 //nPoiCnt = SEG_SortUp(pstVector->cv_pdata, 0, nPoiCnt - 1, nPoiCnt);
502 nSortCut=CVector_Sort(pstVector,0,0,Gtrue,CVector_Gint32DescCompareFunc);
503 GLOG_POI_DEBUG(GT("CVector.Sort() end nSortCut=%d\n"),nSortCut);
504 CVector_Printf(pstVector);
505 for(i=0;i<CVector_Length(pstVector);i++)
506 {
507 iterator= CVector_At_Idx(pstVector,i);
508 GLOG_POI_DEBUG(GT("CVector i=%d,value=%d\n"),i,(*iterator));
509 }
510 {
511 Gint32* volati= CVector_IteratorFindByObj(pstVector,CVector_Gint32DescCompareFunc,&nIndex, &pnOutPos);
512 GLOG_POI_DEBUG(GT("CVector FindByObj,index=%d,value=%d\n"),pnOutPos,(*volati));
513 }
514 }
515 else
516 {
517 GLOG_POI_DEBUG(GT("CVector is NULL"));
518 }
519 #endif
520 }
521
522 //void cv_info(const CVector cv)
523 //{
524 // printf("/n/ntot :%s : %d/n", __func__, cv->cv_tot_len);
525 // //printf("len :%s : %d/n", __func__, cv->cv_len);
526 // //printf("size:%s : %d/n/n", __func__, cv->cv_size);
527 // return;
528 //}
529 //
530 //void cv_print(const CVector cv)
531 //{
532 // Gint32 num;
533 // CIterator iter;
534 //
535 // if (CVector_length(cv) == 0)
536 // fprintf(stderr, "file:%s func:%s line:%d error, null length CVector!!/n", __FILE__, __func__, __LINE__);
537 //
538 // for (iter = CVector_begin(cv);
539 // iter != CVector_end(cv);
540 // iter = CVector_next(cv, iter))
541 // {
542 // //CVector_iter_val(cv, iter, &num);
543 // //printf("var:%d at:%d/n", num, CVector_iter_at(cv, iter));
544 // }
545 //
546 // return;
547 //}

自定义C语言CVector的更多相关文章

  1. 自定义模板语言之simple_tag和自定义过滤器

    扩展你的模板系统 一般是扩展模板的tag和filter两个功能.可以用来创建你自己的tag和filter功能库. 创建模板库 分为两步: 1. 首先决定由模板库在哪一个注册的app下放置,你可以放在一 ...

  2. [经验分享]SecureCRT导出操作日志 + Notepad自定义语言格式高亮日志文件

    起因及效果展示 最近使用CRT,有些命令会输出很多内容,这时如果你想要得知输出内容是从哪里开始的,很容易被大量的同种颜色的文字搞的晕头转向.如果输入的命令是不同的颜色,这会大大得帮助我们. 所谓的命令 ...

  3. gitbook 入门教程之自定义不一样的多语言首页插件

    自定义多语言主页 中文 | English

  4. atitit。自定义uml MOF EMF体系eclipse emf 教程o7t

    atitit.自定义uml MOF EMF体系eclipse emf  教程o7t 1. 元对象机制(MOF,Meta-Object Facility)and  结构 1 2. 元模型图.模型图.对象 ...

  5. Java SE 6 新特性: 对脚本语言的支持

    2006 年底,Sun 公司发布了 Java Standard Edition 6(Java SE 6)的最终正式版,代号 Mustang(野马).跟 Tiger(Java SE 5)相比,Musta ...

  6. android 使用String.format("%.2f",67.876)自已定义语言(俄语、西班牙语)会把小数点变为逗号

    市场人员反映公司的app使用系统设置俄语.西班牙语,double数据会把小数点变为逗号.调试一下,是自定义的语言时候(例如,俄语.西班牙语)转换String.format("%.2f&quo ...

  7. GO语言的进阶之路-初探GO语言

    GO语言的进阶之路-初探GO语言 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么我们需要一门新语言 Go语言官方自称,之所以开发Go 语言,是因为“近10年来开发程序之难 ...

  8. ThinkPhp 使用PhpExcel导出导入多语言文件

    在ThinkPHP 里已经实现了多语言功能,只要在指定的目录下创建对应的语言文件并填充内容,即可实现多语言功能 而多语言的翻译却是一个很麻烦的事情,因为客户特定的行业问题导致我们翻译可能是不准确的 于 ...

  9. 自定义admin

    平时我们用的django自带admin,怎么评价呢?一个字简陋,而且也人性化,如下图,首先只显示数据对象,如果要查看详细还有点进去,其次不能对自己想要的数据进行刷选 我们的期望是:数据如excel显示 ...

随机推荐

  1. 【百奥云GS专栏】全基因组选择之模型篇

    目录 1. 前言 2. BLUP方法 ABLUP GBLUP ssGBLUP RRBLUP 3. 贝叶斯方法 BayesA BayesB BayesC/Cπ/Dπ Bayesian Lasso 4. ...

  2. SNP 过滤(一)

    通用过滤 Vcftools(http://vcftools.sourceforge.net) 对vcf文件进行过滤 第一步:过滤最低质量低于30,次等位基因深度(minor allele count) ...

  3. 二叉树——根据遍历结果,画出对应的二叉树 转载至:http://canlynet.blog.163.com/blog/static/255013652009112602449178/

    这道题目很经典,具体如下: 已知遍历结果如下,试画出对应的二叉树: 前序:A B C E H F I J D G K 中序:A H E C I F J B D K G 解题要点: 1.前序.中序.后序 ...

  4. Hadoop的HA机制浅析

    Zookeeper在Hadoop的HA中的应用 非HA的弊端: HDFS集群的分布式存储是靠namenode节点(namenode负责响应客户端请求)来实现.在非HA集群中一旦namenode宕机,虽 ...

  5. django中的filter(), all(), get()

    1. 类名.objects中的get(), filter(), all() 的区别 结论: (1)all()返回的是QuerySet对象,程序并没有真的在数据库中执行SQL语句查询数据,但支持迭代,使 ...

  6. Linux的小知识

    1. top 命令可以在Linux下查看任务管理器和当前进程使用资源情况. 2. Ctrl+c 即可退出,然后使用 kill+进程号 命令可杀死指定进程 3.在Linux的 /etc/rc.local ...

  7. MyBatis中sql实现时间查询的方法

    <if test="startTime != null and startTime !=''"> AND lTime >= #{startTime} </i ...

  8. 【Java 基础】Collectors 使用小结

    Collectors 与集合转换 Collectors toList streamArr.collect(Collectors.toList()); List<Integer> colle ...

  9. java异常处理中throws和throw的使用

    异常介绍: 运行时异常.非运行时异常 在编写可能会抛出异常的方法时,它们都必须声明为有异常. 一.throws关键字 1.声明方法可能抛出的异常: 2.写在方法名后面: 3.可声明抛出多个异常,异常名 ...

  10. 机器学习——sklearn中的API

    import matplotlib.pyplot as pltfrom sklearn.svm import SVCfrom sklearn.model_selection import Strati ...