acl/lib_acl/include/stdlib/acl_array.h
2014-11-19 00:25:21 +08:00

187 lines
6.1 KiB
C

#ifndef ACL_ARRAY_INCLUDE_H
#define ACL_ARRAY_INCLUDE_H
#ifdef __cplusplus
extern "C" {
#endif
#include "acl_define.h"
#include "acl_iterator.h"
/**
* 动态数组类型定义
*/
typedef struct ACL_ARRAY ACL_ARRAY;
struct ACL_ARRAY{
int capacity; /**< items 数组空间大小 */
int count; /**< items 中含有元素的个数 */
void **items; /**< 动态数组 */
/* 添加及弹出 */
/* 向数组尾部添加动态对象 */
void (*push_back)(struct ACL_ARRAY*, void*);
/* 向数组头部添加动态对象 */
void (*push_front)(struct ACL_ARRAY*, void*);
/* 弹出数组尾部动态对象 */
void *(*pop_back)(struct ACL_ARRAY*);
/* 弹出数组头部动态对象 */
void *(*pop_front)(struct ACL_ARRAY*);
/* for acl_iterator */
/* 取迭代器头函数 */
void *(*iter_head)(ACL_ITER*, struct ACL_ARRAY*);
/* 取迭代器下一个函数 */
void *(*iter_next)(ACL_ITER*, struct ACL_ARRAY*);
/* 取迭代器尾函数 */
void *(*iter_tail)(ACL_ITER*, struct ACL_ARRAY*);
/* 取迭代器上一个函数 */
void *(*iter_prev)(ACL_ITER*, struct ACL_ARRAY*);
};
/**
* 创建一个动态数组
* @param init_size {int} 动态数组的初始大小
* @return {ACL_ARRAY*} 动态数组指针
*/
ACL_API ACL_ARRAY *acl_array_create(int init_size);
/**
* 释放掉动态数组内的成员变量,但并不释放动态数组对象
* @param a {ACL_ARRAY*} 动态数组指针
* @param free_fn {void (*)(void*)} 用于释放动态数组内成员变量的释放函数指针
*/
ACL_API void acl_array_clean(ACL_ARRAY *a, void (*free_fn)(void *));
/**
* 释放掉动态数组内的成员变量,并释放动态数组对象
* @param a {ACL_ARRAY*} 动态数组指针
* @param free_fn {void (*)(void*)} 用于释放动态数组内成员变量的释放函数指针
*/
ACL_API void acl_array_free(ACL_ARRAY *a, void (*free_fn)(void *));
#define acl_array_destroy acl_array_free
/**
* 向动态数组尾部添加动态成员变量
* @param a {ACL_ARRAY*} 动态数组指针
* @param obj {void*} 动态成员变量
* @return {int} >=0: 成功, 返回值为该元素在数组中的下标位置;-1: 失败
*/
ACL_API int acl_array_append(ACL_ARRAY *a, void *obj);
/**
* 向动态数组头部添加动态成员变量
* @param a {ACL_ARRAY*} 动态数组指针
* @param obj {void*} 动态成员变量
* @return {int} >=0: 成功, 返回值为该元素在数组中的下标位置;-1: 失败
*/
ACL_API int acl_array_prepend(ACL_ARRAY *a, void *obj);
/**
* 向动态数组中指定位置前添加动态成员变量(该结点及以后所有结点都后移一个位置)
* @param a {ACL_ARRAY*} 动态数组指针
* @param position {int} 某个位置,不得越界
* @param obj {void*} 动态成员变量
* @return {int} 0: 成功;-1: 失败
*/
ACL_API int acl_array_pred_insert(ACL_ARRAY *a, int position, void *obj);
/**
* 向动态数组中指定位置后添加动态成员变量(该结点以后所有结点都后移一个位置)
* @param a {ACL_ARRAY*} 动态数组指针
* @param position {int} 某个位置,不得越界
* @param obj {void*} 动态成员变量
* @return {int} 0: 成功;-1: 失败
*/
ACL_API int acl_array_succ_insert(ACL_ARRAY *a, int position, void *obj);
#define acl_array_insert acl_array_succ_insert
/**
* 从动态数组中的指定位置删除某个动态对象, 删除后数组内元素的先后顺序保持不变,
* 如果被删除位置在中间某个位置,为了保证元素的顺序性,内部将被删除元素后的所有元素
* 都前移一个位置
* @param a {ACL_ARRAY*} 动态数组指针
* @param position {int} 某个位置,不得越界
* @param free_fn {void (*)(void*)} 用于释放动态数组内成员变量的释放函数指针,如果该
* 指针为空,则不释放,否则用此函数进行释放动态对象
* @return {int} 0: 成功;-1: 失败
*/
ACL_API int acl_array_delete_idx(ACL_ARRAY *a, int position, void (*free_fn)(void *));
/**
* 从动态数组中的指定位置删除某个对象,删除后数组内元素的先后顺序有可能发生了改变,
* 因为删除后会自动将数组中最后的元素移至该位置处
* @param a {ACL_ARRAY*} 动态数组指针
* @param position {int} 某个位置,不得越界
* @param free_fn {void (*)(void*)} 用于释放动态数组内成员变量的释放函数指针,如果该
* 指针为空,则不释放,否则用此函数进行释放动态对象
* @return {int} 0: 成功;-1: 失败
*/
ACL_API int acl_array_delete(ACL_ARRAY *a, int position, void (*free_fn)(void*));
/**
* 从动态数组中删除指定指针地址的动态对象, 删除后数组内元素的先后顺序保持不变
* 如果被删除位置在中间某个位置,为了保证元素的顺序性内部,将被删除元素后的所有元素
* 都前移一个位置
* @param a {ACL_ARRAY*} 动态数组指针
* @param obj {void*} 动态对象指针地址
* @param free_fn {void (*)(void*)} 用于释放动态数组内成员变量的释放函数指针,如果该
* 指针为空,则不释放,否则用此函数进行释放动态对象
* @return {int} 0: 成功;-1: 失败
*/
ACL_API int acl_array_delete_obj(ACL_ARRAY *a, void *obj, void (*free_fn)(void *));
/**
* 从动态数组中删除某个下标范围的动态对象
* @param a {ACL_ARRAY*} 动态数组指针
* @param ibegin {int} 开始下标位置
* @param iend {int} 结束下标位置
* @param free_fn {void (*)(void*)} 用于释放动态数组内成员变量的释放函数指针,如果该
* 指针为空,则不释放,否则用此函数进行释放动态对象
* @return {int} 0: 成功;-1: 失败
*/
ACL_API int acl_array_delete_range(ACL_ARRAY *a, int ibegin, int iend, void (*free_fn)(void*));
/**
* 移动动态数组中的对象
* @param a {ACL_ARRAY*} 动态数组指针
* @param ito {int} 移动至目标下标位置
* @param ifrom {int} 从此下标位置开始移动
* @param free_fn {void (*)(void*)} 用于释放动态数组内成员变量的释放函数指针,如果该
* 指针为空,则不释放,否则用此函数进行释放动态对象被释放的动态对象区间为
* [idx_obj_begin, idx_src_begin), 为一半开半闭区间
* @return {int} 0: 成功;-1: 失败
*/
ACL_API int acl_array_mv_idx(ACL_ARRAY *a, int ito, int ifrom, void (*free_fn)(void *) );
/**
* 预先保证动态数组的空间长度
* @param a {ACL_ARRAY*} 动态数组指针
* @param app_count {int} 需要动态数组至少有 app_count 个空闲位置
* @return {int} 0: 成功;-1: 失败
*/
ACL_API int acl_array_pre_append(ACL_ARRAY *a, int app_count);
/**
* 从动态数组中的某个下标位置取出动态对象
* @param a {ACL_ARRAY*} 动态数组指针
* @param idx {int} 下标位置,不能越界,否则返回-1
* @return {void*} != NULL: 成功;== NULL: 不存在或失败
*/
ACL_API void *acl_array_index(const ACL_ARRAY *a, int idx);
/**
* 获得当前动态数组中动态对象的个数
* @param a {ACL_ARRAY*} 动态数组指针
* @return {int} 动态数组中动态对象的个数
*/
ACL_API int acl_array_size(const ACL_ARRAY *a);
#ifdef __cplusplus
}
#endif
#endif