自定义C语言CVector
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 //}
posted on 2017-03-21 20:23 kenny.wmh 阅读(1923) 评论(0) 编辑 收藏 举报