Circular queue图例:
-
/*
-
* Circular queue definitions.
-
*/
-
#define CIRCLEQ_HEAD(name, type) \
-
struct name { \
-
struct type *cqh_first; /* first element */ \
-
struct type *cqh_last; /* last element */ \
-
}
展开CIRCLEQ_HEAD(eventlist,event)
struct eventlist{
struct event * cqh_first;
struct event * cqu_last;
}
-
#define CIRCLEQ_HEAD_INITIALIZER(head) \ //这里的head是头节点,而不是指向头节点的指针
-
{ CIRCLEQ_END(&head), CIRCLEQ_END(&head) }
展开CIRCLEQ_HEAD_INITIALIZER(sEventBase) { CIRCLEQ_END(&sEventBase), CIRCLEQ_END(&sEventBase) }
继续展开 { (void *) (&sEventBase), (void *)(&sEventBase) }
-
#define CIRCLEQ_ENTRY(type) \
-
struct { \
-
struct type *cqe_next; /* next element */ \
-
struct type *cqe_prev; /* previous element */ \
-
}
展开CRICLE_ENTRY(event)
strcut {
struct event * cqe_next;
struct event *cqe_prev;
}
-
/*
-
* Circular queue access methods
-
*/
-
#define CIRCLEQ_FIRST(head) ((head)->cqh_first) //得到第一个节点的指针
展开CIRCLE_FIRST(pEventBase) ((pEventBase)->cqh_first)
-
#define CIRCLEQ_LAST(head) ((head)->cqh_last)
展开CIRCLEQ_LAST(pEventBase) ((pEventBase)->cqh_last)
-
#define CIRCLEQ_END(head) ((void *)(head))
展开CIRCLEQ_END(
pEventBase) ((void *)(pEventBase))
-
#define CIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next)
展开CIRCLEQ_NEXT(elm,event_next) ((elm)->event_next.cqe_next)
-
#define CIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev)
展开CIRCLEQ(elm,event_next) ((elm)->event_next.cqe_prev)
-
#define CIRCLEQ_EMPTY(head) \
-
(CIRCLEQ_FIRST(head) == CIRCLEQ_END(head))
展开CIRCLEQ_FIRST(pEventBase) (
((pEventBase)->cqh_first) == ((void *)(pEventBase)) )
-
#define CIRCLEQ_FOREACH(var, head, field) \
-
for((var) = CIRCLEQ_FIRST(head); \
-
(var) != CIRCLEQ_END(head); \
-
(var) = CIRCLEQ_NEXT(var, field))
展开CIRCLEQ_FOREACH(pTmp, pEventBase, event_next)
for ( (pTmp) = CIRCLEQ_FIRST(pEvent) ;
(pTmp) != CIRCLEQ_END(pEventBase);
(pTmp) = CIRCLEQ_NEXT(pTmp,event_next) )
继续展开
for ( (pTmp) = ((pEventBase)->cqh_first);
(pTmp) != ((void *)(pEventBase));
(pTmp) = ((pTmp)->event_next.cqe_next) )
-
#define CIRCLEQ_FOREACH_REVERSE(var, head, field) \
-
for((var) = CIRCLEQ_LAST(head); \
-
(var) != CIRCLEQ_END(head); \
-
(var) = CIRCLEQ_PREV(var, field))
展开CIRCLEQ_FOREACH_REVERSE(pTmp, pEventBase, event_next)
for( ( pTmp) = CIRCLEQ_LAST(pEventBase);
(pTmp) != CIRCLEQ_END(pEventBase);
(pTmp) = CIRCLEQ_PREV(pTmp,event_next))
继续展开
for( (pTmp0 = ((pEventBase)->cqe_last);
(pTmp) != ((void *) (pEventBase);
(pTmp) = ((pTmp)->event_next.cqe.prev) )
-
/*
-
* Circular queue functions.
-
*/
-
#define CIRCLEQ_INIT(head) do { \ //初始化头节点,让头节点的first指针指向head,让头节点的second指针指向head
-
(head)->cqh_first = CIRCLEQ_END(head); \
-
(head)->cqh_last = CIRCLEQ_END(head); \
-
} while (0)
展开CIRCLEQ_INIT(pEventBase)
do{
(pEventBase)->cqh_first = ((void *)(pEventBase));
(pEventBase)->cqh_second=((void *)(pEventBase));
}while(0)
-
#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ //在listelm前插入elm所指元素
-
(elm)->field.cqe_next = (listelm)->field.cqe_next; \
-
(elm)->field.cqe_prev = (listelm); \
-
if ((listelm)->field.cqe_next == CIRCLEQ_END(head)) \
-
(head)->cqh_last = (elm); \
-
else \
-
(listelm)->field.cqe_next->field.cqe_prev = (elm); \
-
(listelm)->field.cqe_next = (elm); \
-
} while (0)
-
(elm)->field.cqe_next = (listelm)->field.cqe_next; \ //让elm的next指针指向listelm的下一个元素
-
(elm)->field.cqe_prev = (listelm); \ //让elm的prev指针指向listelm
-
if ((listelm)->field.cqe_next == CIRCLEQ_END(head)) \ //若listelm的next指向头节点,
-
(head)->cqh_last = (elm); \ //让head的last指针指向elm所指元素
-
else \
-
(listelm)->field.cqe_next->field.cqe_prev = (elm); \ //让listelm的下一个元素的prev指针指向elm所指元素
-
(listelm)->field.cqe_next = (elm); //让listelm的next指针指向elm所指元素
-
#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \在listelm后插入elm所指元素
-
(elm)->field.cqe_next = (listelm); \
-
(elm)->field.cqe_prev = (listelm)->field.cqe_prev; \
-
if ((listelm)->field.cqe_prev == CIRCLEQ_END(head)) \
-
(head)->cqh_first = (elm); \
-
else \
-
(listelm)->field.cqe_prev->field.cqe_next = (elm); \
-
(listelm)->field.cqe_prev = (elm); \
-
} while (0)
(elm)->field.cqe_next = (listelm); \ //让elm的next指针指向listelm所指元素
-
(elm)->field.cqe_prev = (listelm)->field.cqe_prev; \ //让elm的prev指针指向listelm的上一个元素
-
if ((listelm)->field.cqe_prev == CIRCLEQ_END(head)) \ //如果listelm的prev指向head
-
(head)->cqh_first = (elm); \ //让head的first指针指向elm所指元素
-
else \
-
(listelm)->field.cqe_prev->field.cqe_next = (elm); \ //让listelm的上一个元素的next指针指向elm所指元素
-
(listelm)->field.cqe_prev = (elm); //让listelm的prev指针指向elm所指元素
-
#define CIRCLEQ_INSERT_HEAD(head, elm, field) do { \ //在队列头部插入节点
-
(elm)->field.cqe_next = (head)->cqh_first; \
-
(elm)->field.cqe_prev = CIRCLEQ_END(head); \
-
if ((head)->cqh_last == CIRCLEQ_END(head)) \
-
(head)->cqh_last = (elm); \
-
else \
-
(head)->cqh_first->field.cqe_prev = (elm); \
-
(head)->cqh_first = (elm); \
-
} while (0)
-
(elm)->field.cqe_next = (head)->cqh_first; \ //让elm的next指针指向head的first指针所指元素(就是第一个元素)
-
(elm)->field.cqe_prev = CIRCLEQ_END(head); \ //让elm的prev指针指向head指针所指元素(就是头节点)
-
if ((head)->cqh_last == CIRCLEQ_END(head)) \ //如果head的last指针指向头节点
-
(head)->cqh_last = (elm); \ //让head的last指针指向elm
-
else \
-
(head)->cqh_first->field.cqe_prev = (elm); \ //让head的first指针所指元素(就是第一个元素)的prev指针指向elm所指对象
-
(head)->cqh_first = (elm); \ //让head的first指针指向elm所指对象
-
#define CIRCLEQ_INSERT_TAIL(head, elm, field) do { \ //在队列尾部插入节点
-
(elm)->field.cqe_next = CIRCLEQ_END(head); \
-
(elm)->field.cqe_prev = (head)->cqh_last; \
-
if ((head)->cqh_first == CIRCLEQ_END(head)) \
-
(head)->cqh_first = (elm); \
-
else \
-
(head)->cqh_last->field.cqe_next = (elm); \
-
(head)->cqh_last = (elm); \
-
} while (0)
-
(elm)->field.cqe_next = CIRCLEQ_END(head); \ //让elm的next指针指向head指针所指元素(就是头元素)
-
(elm)->field.cqe_prev = (head)->cqh_last; \ //让elm的prev指针指向head的last指针所指元素(就是最后一个元素)
-
if ((head)->cqh_first == CIRCLEQ_END(head)) \ //如果head的first指针指向头元素
-
(head)->cqh_first = (elm); \ //让head的first指针指向elm所指元素
-
else \
-
(head)->cqh_last->field.cqe_next = (elm); \ //让最后一个元素的next指针指向elm
-
(head)->cqh_last = (elm); \ //让head的last指针指向elm所指对象
-
#define CIRCLEQ_REMOVE(head, elm, field) do { \ //移除elm所指元素
-
if ((elm)->field.cqe_next == CIRCLEQ_END(head)) \
-
(head)->cqh_last = (elm)->field.cqe_prev; \
-
else \
-
(elm)->field.cqe_next->field.cqe_prev = \
-
(elm)->field.cqe_prev; \
-
if ((elm)->field.cqe_prev == CIRCLEQ_END(head)) \
-
(head)->cqh_first = (elm)->field.cqe_next; \
-
else \
-
(elm)->field.cqe_prev->field.cqe_next = \
-
(elm)->field.cqe_next; \
-
} while (0)
-
if ((elm)->field.cqe_next == CIRCLEQ_END(head)) \ //如果elm的next指针指向head(就是头节点)
-
(head)->cqh_last = (elm)->field.cqe_prev; \ //让head的的last元素指向elm的上一个元素
-
else \
-
(elm)->field.cqe_next->field.cqe_prev = \ //让elm下一个元素的prev指针指向elm的上一个元素
-
(elm)->field.cqe_prev; \
-
if ((elm)->field.cqe_prev == CIRCLEQ_END(head)) \ //如果elm的prev指针指向头节点
-
(head)->cqh_first = (elm)->field.cqe_next; \ //让head的first指针指向elm的下一个元素
-
else \
-
(elm)->field.cqe_prev->field.cqe_next = \ //让elm的上一给元素的next指针指向elm的下一个元素
-
(elm)->field.cqe_next; \
-
#define CIRCLEQ_REPLACE(head, elm, elm2, field) do { \ //用elm2所指对象替换elm所指对象 这里的head是head对象,而不是指向head的指针
-
if (((elm2)->field.cqe_next = (elm)->field.cqe_next) == \
-
CIRCLEQ_END(head)) \
-
(head).cqh_last = (elm2); \
-
else \
-
(elm2)->field.cqe_next->field.cqe_prev = (elm2); \
-
if (((elm2)->field.cqe_prev = (elm)->field.cqe_prev) == \
-
CIRCLEQ_END(head)) \
-
(head).cqh_first = (elm2); \
-
else \
-
(elm2)->field.cqe_prev->field.cqe_next = (elm2); \
-
} while (0)
-
if (((elm2)->field.cqe_next = (elm)->field.cqe_next) == \ //让elm2的next指针指向elm的next指针所指元素,且elm的next指针所指元素不是head
-
CIRCLEQ_END(head)) \
-
(head).cqh_last = (elm2); \ //让head的last指针指向elm2
-
else \
-
(elm2)->field.cqe_next->field.cqe_prev = (elm2); \ //让elm2下一个元素的prev指针指向elm2
-
if (((elm2)->field.cqe_prev = (elm)->field.cqe_prev) == \ //让elm2的prev指针指向elm的上一个元素,且elm的上一个元素不是head
-
CIRCLEQ_END(head)) \
-
(head).cqh_first = (elm2); \ //让head的first指针指向elm2
-
else \
-
(elm2)->field.cqe_prev->field.cqe_next = (elm2); \ //让elm2的上一个元素的next指针指向elm2
阅读(1843) | 评论(0) | 转发(0) |