ACL库中有个模块实现了先进先出队列的功能,其使用方法非常简单,下面是结构定义:
struct ACL_FIFO {
ACL_FIFO_INFO *head;
ACL_FIFO_INFO *tail;
int cnt;
/* for acl_iterator */
/* 取迭代器头函数 */
const void *(*iter_head)(ACL_ITER*, struct ACL_FIFO*);
/* 取迭代器下一个函数 */
const void *(*iter_next)(ACL_ITER*, struct ACL_FIFO*);
/* 取迭代器尾函数 */
const void *(*iter_tail)(ACL_ITER*, struct ACL_FIFO*);
/* 取迭代器上一个函数 */
const void *(*iter_prev)(ACL_ITER*, struct ACL_FIFO*);
/* 取迭代器关联的当前容器成员结构对象 */
const ACL_FIFO_INFO *(*iter_info)(ACL_ITER*, struct ACL_FIFO*);
};
有两个初始化函数,一个是静态初始化,一个是动态初始化(需要释放),如下:
/**
* 初始化一个给定队列,应用可以在栈上分配队列,而后调用该函数进行初始化
* @param fifo {ACL_FIFO *}
* @example:
* void test(void) {
ACL_FIFO fifo;
acl_fifo_init(&fifo);
* }
*/
ACL_API void acl_fifo_init(ACL_FIFO *fifo);
/**
* 从内存堆中分配一个队列对象,需要用 acl_fifo_free 释放
* @return {ACL_FIFO*}
*/
ACL_API ACL_FIFO *acl_fifo_new(void);
/**
* 释放以堆分配的队列对象
* @param fifo {ACL_FIFO*}
* @param free_fn {void (*)(void*)}, 如果该函数指针不为空则
* 用来释放队列中动态分配的对象
*/
ACL_API void acl_fifo_free(ACL_FIFO *fifo, void (*free_fn)(void *));
向队列中添加及获得对象的函数如下:
/**
* 向队列中添加一个动态堆对象
* @param fifo {ACL_FIFO*}
* @param data {void*} 动态对象
*/
ACL_API void acl_fifo_push(ACL_FIFO *fifo, void *data);
/**
* 从队列中以先进先出方式弹出一个动态对象, 同时将该对象从队列中删除
* @param fifo {ACL_FIFO*}
* @return {void*}, 如果为空,则表示队列为空
*/
ACL_API void *acl_fifo_pop(ACL_FIFO *fifo);
其它的辅助函数:
/**
* 返回队列中头部(即最新添加的)的动态对象
* @param fifo {ACL_FIFO*}
* @return {void*}, 如果为空,则表示队列为空
*/
ACL_API void *acl_fifo_head(ACL_FIFO *fifo);
/**
* 返回队列中尾部(即最早添加的)的动态对象
* @param fifo {ACL_FIFO*}
* @return {void*}, 如果为空,则表示队列为空
*/
ACL_API void *acl_fifo_tail(ACL_FIFO *fifo);
/**
* 返回队列中动态对象的总个数
* @param fifo {ACL_FIFO*}
* @return {int}, >= 0
*/
ACL_API int acl_fifo_size(ACL_FIFO *fifo);
下面是一个简单的例子:
#include "lib_acl.h"
#include <stdio.h>
#include <stdlib.h>
static void fifo_test(void)
{
ACL_FIFO *fifo;
int i;
char *ptr;
ACL_ITER iter;
fifo = acl_fifo_new(); // 创建队列
for (i = 0; i < 20; i++) {
ptr = (char*) acl_mymalloc(100);
snprintf(ptr, 100, "test:%d", i);
acl_fifo_push(fifo, ptr); // 向队列中添加动态元素
}
// 遍历队列中的所有元素
acl_foreach(iter, fifo) {
const char *ptr = (const char*) iter.data;
printf(">>>%s\n", ptr);
}
while (1) {
ptr = (char*) acl_fifo_pop(fifo); // 从队列中取得动态元素
if (ptr == NULL)
break;
printf("fifo pop: %s\n", ptr);
}
acl_fifo_free(fifo, acl_myfree_fn); // 释放队列
}
int main(int argc acl_unused, char *argv[] acl_unused)
{
fifo_test();
getchar();
return (0);
}
这个例子非常简单,只是演示了如何使用ACL库中的先进先出队列。头文件参看:lib_acl/include/stdlib/acl_fifo.h
ACL 下载:http://acl.sourceforge.net/
QQ 群:242722074
2万+

被折叠的 条评论
为什么被折叠?



