博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通用动态数组(二)——接口实现
阅读量:6975 次
发布时间:2019-06-27

本文共 4762 字,大约阅读时间需要 15 分钟。

hot3.png

/*----------------------------------------darray.c-------------------------*/#include "darray.h"#define ARRAY_HEAD  0#define ARRAY_TAIL  -1#define MIN_PRE_ALLOCATE_NR 10struct _DArray{    void** data;    size_t size;    size_t alloc_size;    void* data_destroy_ctx;    DataDestroyFunc data_destroy;    };DArray* darray_create(DataDestroyFunc data_destroy, void* ctx){    DArray* this = (DArray*)malloc(sizeof(DArray));        if(NULL == this)    {        return NULL;    }    this->data = NULL;    this->size = 0;    this->alloc_size = 0;    this->data_destroy = data_destroy;    this->data_destroy_ctx = ctx;    return this;}static Ret darray_expand(DArray* this, size_t need){           return_val_if_fail(this != NULL, RET_INVALID_PARAMETER);    if(this->size + need > this->alloc_size)    {        size_t alloc_size = this->alloc_size + (this->alloc_size >> 1)                                      + MIN_PRE_ALLOCATE_NR;                                              void** data = (void **)realloc(this->data, sizeof(void*) * alloc_size);        if(NULL != data)        {            this->data = data;            this->alloc_size = alloc_size;        }    }    return ((this->size + need) <= this->alloc_size) ? RET_OK : RET_FAIL;    }Ret darray_insert(DArray* this, size_t index, void* data){    Ret ret = RET_OOM;    size_t cursor = index;                    return_val_if_fail(this != NULL, RET_INVALID_PARAMETER);    cursor = (cursor < this->size) ? cursor : this->size;        if(darray_expand(this, 1) == RET_OK)    {        size_t i = 0;                for(i = this->size; i > cursor; i--)        {            this->data[i] = this->data[i-1];        }        this->data[cursor] = data;        this->size++;                    ret = RET_OK;    }             return ret;}Ret darray_prepend(DArray* this, void* data){    return (RET_OK == darray_insert(this, ARRAY_HEAD, data)) ? RET_OK : RET_FAIL;}Ret darray_append(DArray* this, void* data){    return (RET_OK == darray_insert(this, ARRAY_TAIL, data)) ? RET_OK : RET_FAIL;}static void darray_destroy_data(DArray* this, void* data){    if(this->data_destroy != NULL)    {        this->data_destroy(this->data_destroy_ctx, data);    }        return;}static Ret darray_shrink(DArray* this){    Ret ret = RET_OK;    return_val_if_fail(this != NULL, RET_INVALID_PARAMETER);        if((this->size < (this->alloc_size >> 1)) && (this->size > MIN_PRE_ALLOCATE_NR))    {        size_t alloc_size = this->size + (this->size >> 1);        void** data = (void ** )realloc(this->data, sizeof(void *) * alloc_size);        if(data != NULL)        {            this->data = data;            this->alloc_size = alloc_size;        }        else        {            ret = RET_OOM;                    }    }    return ret;}Ret darray_delete(DArray* this, size_t index){    size_t i = 0;    Ret ret = RET_OK;        return_val_if_fail(this != NULL && this->size > index, RET_INVALID_PARAMETER);        darray_destroy_data(this, this->data[index]);        for(i = index; (i+1) < this->size; i++)    {        this->data[i] = this->data[i+1];    }    this->size--;        ret = darray_shrink(this);    return ret;    }Ret darray_get_by_index(DArray* this, size_t index, void** data){    return_val_if_fail(this != NULL && this->size > index, RET_INVALID_PARAMETER);    *data = this->data[index];    return RET_OK;}Ret darray_set_by_index(DArray* this, size_t index, void* data){    return_val_if_fail(this != NULL && this->size > index, RET_INVALID_PARAMETER);    this->data[index] = data;    return RET_OK;}int darray_find(DArray* this, DataCompareFunc cmp, void* ctx){    size_t i = 0;        return_val_if_fail(this != NULL, RET_INVALID_PARAMETER);    for(; i < this->size; i++)    {        if(0 == cmp(ctx, this->data[i]))        {            return i;                    }    }    return -1;    }size_t darray_length(DArray* this){    return this->size;}Ret darray_foreach(DArray* this, DataVisitFunc visit, void* ctx){    size_t i = 0;        return_val_if_fail(this != NULL, RET_INVALID_PARAMETER);    for(i = 0; i < this->size; i++)    {        visit(ctx, this->data[i]);    }            return RET_OK;}Ret darray_sort(DArray* this, DataSortFunc sort, DataCompareFunc cmp){        return_val_if_fail(this != NULL, RET_INVALID_PARAMETER);        return(sort(this->data, this->size, cmp));}void darray_destroy(DArray* this){    return_void_if_fail(this != NULL);    if(this->data_destroy != NULL)    {        size_t i = 0;        for(; i < this->size; i++)        {           if(this->data[i] != NULL)           {               this->data_destroy(this->data_destroy_ctx, this->data[i]);               this->data[i] = NULL;           }        }    }    free(this);    }

转载于:https://my.oschina.net/mavericsoung/blog/217825

你可能感兴趣的文章
HDOJ 1698 Just a Hook
查看>>
编程语言
查看>>
《游戏引擎架构》笔记四
查看>>
Quick-cocos2d-x3.3 Study (十三)--------- 创建物理世界的边界 ( 创建一个带物理效果的线条 )...
查看>>
PhoneGap的详细官方文档
查看>>
DRF 视图和路由
查看>>
DRF 序列化组件
查看>>
网络攻防 实验二
查看>>
C++11 tuple的使用
查看>>
hdu 5274 树链剖分
查看>>
对象的创建与克隆
查看>>
剑指OFFER——调整数组顺序使奇数位于偶数前面
查看>>
python 求阶乘之和。求1+2!+3!+...+20!的和
查看>>
《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果(速度可实时)...
查看>>
C# 32位程序在64位系统下运行中解决重定向问题
查看>>
谷歌Chrome浏览器之No Sandbox
查看>>
Windows服务安装、卸载、启动和关闭的管理器
查看>>
leetcode 53最大子序和
查看>>
使用正则表达式匹配任意字符包括空格和换行符
查看>>
Maven生命周期详解
查看>>