libevent中的双端队列TAILQ

from http://wangjunle23.blog.163.com/blog/static/11783817120125302346530/



关注的头文件:
include/event2/keyvalq_struct.h
event_internal.h
等文件有若干定义,具体关注<sys/queue.h>

示例代码:
queue.h

#ifndef _EVENT2_EVENT_KEYVALQ_STRUCT_H_ #define _EVENT2_EVENT_KEYVALQ_STRUCT_H_ /* * 与<sys/queue.h>一致,该代码复制于event_struct.h */ #ifndef TAILQ_ENTRY #define _EVENT_DEFINED_TQENTRY #define TAILQ_ENTRY(type) \ struct { \ struct type* tqe_next; /* 下一元素 */ \ struct type** tqe_prev; /* 前一个元素的地址 */ \ } #endif /* !TAILQ_ENTRY */ #ifndef TAILQ_HEAD #define _EVENT_DEFINED_TQHEAD #define TAILQ_HEAD(name, type) \ struct name { \ struct type* tqh_first; \ struct type** tqh_last; \ } #endif #define TAILQ_INIT(head) do { \ (head)->tqh_first = NULL; \ (head)->tqh_last = &(head)->tqh_first; \ } while (/*CONSTCOND*/0) #define TAILQ_INSERT_HEAD(head, elm, field) do { \ if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \ (head)->tqh_first->field.tqe_prev = &(elm)->field.tqe_next; \ else \ (head)->tqh_last = &(elm)->field.tqe_next; \ (head)->tqh_first = (elm); \ (elm)->field.tqe_prev = &(head)->tqh_first; \ } while (/*CONSTCOND*/0) #define TAILQ_INSERT_TAIL(head, elm, field) do { \ (elm)->field.tqe_next = NULL; \ (elm)->field.tqe_prev = (head)->tqh_last; \ *(head)->tqh_last = (elm); \ (head)->tqh_last = &(elm)->field.tqe_next; \ } while (/*CONSTCOND*/0) #define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL) \ (elm)->field.tqe_next->field.tqe_prev = &(elm)->field.tqe_next; \ else \ (head)->tqh_last = &(elm)->field.tqe_next; \ (listelm)->field.tqe_next = (elm); \ (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ } while (/*CONSTCOND*/0) #define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ (elm)->field.tqe_next = (listelm); \ *(listelm)->field.tqe_prev = (elm); \ (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ } while (/*CONSTCOND*/0) #define TAILQ_REMOVE(head, elm, field) do { \ if (((elm)->field.tqe_next) != NULL) \ (elm)->field.tqe_next->field.tqe_prev = \ (elm)->field.tqe_prev; \ else \ (head)->tqh_last = (elm)->field.tqe_prev; \ *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ } while (/*CONSTCOND*/0) #define TAILQ_FOREACH(var, head, field) \ for ((var) = ((head)->tqh_first); \ (var); \ (var) = ((var)->field.tqe_next)) #define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last)); \ (var); \ (var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last))) /* * Tail queue access methods. */ #define TAILQ_EMPTY(head) ((head)->tqh_first == NULL) #define TAILQ_FIRST(head) ((head)->tqh_first) #define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) #define TAILQ_LAST(head, headname) \ (*(((struct headname *)((head)->tqh_last))->tqh_last)) #define TAILQ_PREV(elm, headname, field) \ (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) #define TAILQ_END(head) NULL #endif


main.cpp

#include <memory.h> #include <stdio.h> #include "queue.h"

// 事件定义 struct event { TAILQ_ENTRY(event) ev_next; int iItem; }; // 定义了一个事件结构双端链表 event_list(first, last). TAILQ_HEAD (event_list, event);

/* * main函数 */ int main(int argc, char* argv[]) { // 初始化 event_list evlist; TAILQ_INIT(&evlist); // 插入头部 event event0; event0.iItem = 0; TAILQ_INSERT_HEAD(&evlist, &event0, ev_next); // event event1; event1.iItem = 1; TAILQ_INSERT_TAIL(&evlist, &event1, ev_next); // event event2; event2.iItem = 2; TAILQ_INSERT_TAIL(&evlist, &event2, ev_next); // event event3; event3.iItem = 3; TAILQ_INSERT_TAIL(&evlist, &event3, ev_next); event* pEvent; TAILQ_FOREACH(pEvent, &evlist, ev_next) { printf("item:%d\n", pEvent->iItem); } getchar(); return 0; }


 输出结果:
libevent中的双端队列TAILQ - jolly - Devil may cry
 

本文只起抛砖引玉的作用,其它方法可以另作验证。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值