mirror of
https://gitee.com/acl-dev/acl.git
synced 2024-12-13 16:35:35 +08:00
139 lines
3.6 KiB
C
139 lines
3.6 KiB
C
#ifndef ACL_STACK_INCLUDE_H
|
|
#define ACL_STACK_INCLUDE_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include "acl_define.h"
|
|
#include "acl_iterator.h"
|
|
|
|
/* 说明:该函数库内部所用的内存分配未采用内存池方式 */
|
|
|
|
typedef struct ACL_STACK ACL_STACK;
|
|
|
|
/**
|
|
* 栈类型定义
|
|
*/
|
|
struct ACL_STACK {
|
|
int capacity;
|
|
int count;
|
|
void **items;
|
|
|
|
/* 添加及弹出 */
|
|
|
|
/* 向栈尾部添加动态对象 */
|
|
void (*push_back)(struct ACL_STACK*, void*);
|
|
/* 向栈头部添加动态对象 */
|
|
void (*push_front)(struct ACL_STACK*, void*);
|
|
/* 弹出栈尾部动态对象 */
|
|
void *(*pop_back)(struct ACL_STACK*);
|
|
/* 弹出栈头部动态对象 */
|
|
void *(*pop_front)(struct ACL_STACK*);
|
|
|
|
/* for acl_iterator */
|
|
|
|
/* 取迭代器头函数 */
|
|
void *(*iter_head)(ACL_ITER*, struct ACL_STACK*);
|
|
/* 取迭代器下一个函数 */
|
|
void *(*iter_next)(ACL_ITER*, struct ACL_STACK*);
|
|
/* 取迭代器尾函数 */
|
|
void *(*iter_tail)(ACL_ITER*, struct ACL_STACK*);
|
|
/* 取迭代器上一个函数 */
|
|
void *(*iter_prev)(ACL_ITER*, struct ACL_STACK*);
|
|
};
|
|
|
|
/**
|
|
* 增加栈空间大小
|
|
* @param s {ACL_STACK*} 创建的栈容器对象
|
|
* @param count {int} 增加的空间大小
|
|
*/
|
|
ACL_API void acl_stack_space(ACL_STACK *s, int count);
|
|
|
|
/**
|
|
* 创建一个栈容器对象
|
|
* @param init_size {int} 栈的初始化空间大小,必须 > 0
|
|
* @return {ACL_STACK*} 新创建的栈容器对象
|
|
*/
|
|
ACL_API ACL_STACK *acl_stack_create(int init_size);
|
|
|
|
/**
|
|
* 清空栈里的对象,但不销毁栈容器对象
|
|
* @param s {ACL_STACK*} 创建的栈容器对象
|
|
* @param free_fn {void (*)(void*)} 如果不为空,则会用此函数回调栈里的每一个对象
|
|
*/
|
|
ACL_API void acl_stack_clean(ACL_STACK *s, void (*free_fn)(void *));
|
|
|
|
/**
|
|
* 清空栈容器里的对象并销毁栈容器
|
|
* @param s {ACL_STACK*} 创建的栈容器对象
|
|
* @param free_fn {void (*)(void*)} 如果不为空,则会用此函数回调栈里的每一个对象
|
|
*/
|
|
ACL_API void acl_stack_destroy(ACL_STACK *s, void (*free_fn)(void *));
|
|
|
|
/**
|
|
* 往栈容器尾部添加新的对象
|
|
* @param s {ACL_STACK*} 创建的栈容器对象
|
|
* @param obj {void*}
|
|
*/
|
|
ACL_API void acl_stack_append(ACL_STACK *s, void *obj);
|
|
#define acl_stack_push acl_stack_append
|
|
|
|
/**
|
|
* 往栈容器的头部添加新的对象
|
|
* @param s {ACL_STACK*} 创建的栈容器对象
|
|
* @param obj {void*}
|
|
* 注:此操作的效率要比 acl_stack_append 低,因为其内容需要移动所有的对象位置
|
|
*/
|
|
ACL_API void acl_stack_prepend(ACL_STACK *s, void *obj);
|
|
|
|
/**
|
|
* 从栈容器里删除某个对象
|
|
* @param s {ACL_STACK*} 创建的栈容器对象
|
|
* @param position {int} 栈容器的位置
|
|
* @param free_fn {void (*)(void*)} 如果不为空,则用此函数回调被删除对象
|
|
*/
|
|
ACL_API void acl_stack_delete(ACL_STACK *s, int position, void (*free_fn)(void *));
|
|
|
|
/**
|
|
* @param s {ACL_STACK*} 创建的栈容器对象
|
|
* @param obj {void*} 被删除对象的地址
|
|
* @param free_fn {void (*)(void*)} 如果不为空,则用此函数回调被删除对象
|
|
*/
|
|
ACL_API void acl_stack_delete_obj(ACL_STACK *s, void *obj, void (*free_fn)(void *));
|
|
|
|
/**
|
|
* 返回栈容器中某个位置的对象地址
|
|
* @param s {ACL_STACK*} 创建的栈容器对象
|
|
* @param position {int} 栈容器中的位置
|
|
* @return {void*} != NULL: ok; == NULL: error或不存在
|
|
*/
|
|
ACL_API void *acl_stack_index(ACL_STACK *s, int position);
|
|
|
|
/**
|
|
* 返回栈容器中当前的对象个数
|
|
* @param s {ACL_STACK*} 创建的栈容器对象
|
|
* @return {int} 对象个数
|
|
*/
|
|
ACL_API int acl_stack_size(const ACL_STACK *s);
|
|
|
|
/**
|
|
* 返回栈中尾部的对象地址, 同时将该对象从栈中移除
|
|
* @param s {ACL_STACK*} 创建的栈容器对象
|
|
* @return {void*} 对象地址, == NULL 表示当前对象为空
|
|
*/
|
|
ACL_API void *acl_stack_pop(ACL_STACK *s);
|
|
|
|
/**
|
|
* 返回栈中最后添加的对象地址, 但不将该对象从栈中移除
|
|
* @param s {ACL_STACK*} 创建的栈容器对象
|
|
* @return {void*} 对象地址, == NULL 表示当前对象为空
|
|
*/
|
|
ACL_API void *acl_stack_top(ACL_STACK *s);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|