环形队列实现

/*
 * Circular queue definitions.
 */
#define CIRCLEQ_HEAD(name, type)     \
struct name {        \
 struct type *cqh_first;  /* first element */  \
 struct type *cqh_last;  /* last element */  \
}
#define CIRCLEQ_HEAD_INITIALIZER(head)     \
 { CIRCLEQ_END(&head), CIRCLEQ_END(&head) }
#define CIRCLEQ_ENTRY(type)      \
struct {        \
 struct type *cqe_next;  /* next element */  \
 struct type *cqe_prev;  /* previous element */  \
}
/*
 * Circular queue access methods
 */
#define CIRCLEQ_FIRST(head)  ((head)->cqh_first)
#define CIRCLEQ_LAST(head)  ((head)->cqh_last)
#define CIRCLEQ_END(head)  ((void *)(head))
#define CIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next)
#define CIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev)
#define CIRCLEQ_EMPTY(head)      \
 (CIRCLEQ_FIRST(head) == CIRCLEQ_END(head))
#define CIRCLEQ_FOREACH(var, head, field)    \
 for((var) = CIRCLEQ_FIRST(head);    \
     (var) != CIRCLEQ_END(head);     \
     (var) = CIRCLEQ_NEXT(var, field))
#define CIRCLEQ_FOREACH_REVERSE(var, head, field)   \
 for((var) = CIRCLEQ_LAST(head);     \
     (var) != CIRCLEQ_END(head);     \
     (var) = CIRCLEQ_PREV(var, field))
/*
 * Circular queue functions.
 */
#define CIRCLEQ_INIT(head) do {      \
 (head)->cqh_first = CIRCLEQ_END(head);    \
 (head)->cqh_last = CIRCLEQ_END(head);    \
} while (0)
#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do {  \
 (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)
#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do {  \
 (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)
#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)
#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)
#define CIRCLEQ_REMOVE(head, elm, field) do {    \
 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)
#define CIRCLEQ_REPLACE(head, elm, elm2, field) do {   \
 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)

你可能感兴趣的:(技术)