libuv中的QUEUE

typedef void *QUEUE[2];

定義一個新類型QUEUE, 類型爲void* [2], 相似於雙向鏈表
對於普通數據節點, QUEUE[0]爲下一個節點的指針, QUEUE[1]爲上一個節點的指針;
對於Head節點(至關於索引), QUEUE[0]第1個節點的指針, QUEUE[1]爲最後1個節點的指針指針

#define QUEUE_NEXT(q)       ( *(QUEUE **) &(  (*(q))[0]  ) )

q是指向QUEUE的指針, 實際類型爲 void *( *)[2],
(*(q))類型爲void* [2]
(*(q))[0]類型爲 void*, 爲下一個節點的指針
(QUEUE **) &( (*(q))[0] )這麼寫是爲了讓這個宏能夠同時兼容賦值操做和取值操做, 好比code

( *(QUEUE **) &(  (*(q))[0]  ) ) = NULL; //這是一個賦值操做, 給第1個元素賦值
void* x = ( *(QUEUE **) &(  (*(q))[0]  ) ); //這是一個取值操做, 取出第1個元素
#define QUEUE_DATA(ptr, type, field)                                          \
  ((type *) ((char *) (ptr) - offsetof(type, field)))

通常隊列外面還會再包一層結構層, QUEUE_DATA用於獲得這個結構體指針;blog

#define QUEUE_INSERT_HEAD(h, q)                                               \
  do {                                                                        \
    //q的下一個節點爲原來的第1個數據節點
    QUEUE_NEXT(q) = QUEUE_NEXT(h);                                            \
	//q的上一個節點就是h
    QUEUE_PREV(q) = (h);                                                      \
	//原來的第1個數據節點的上一節點爲q
    QUEUE_NEXT_PREV(q) = (q);                                                 \
	//Head節點的下一個節點爲q
    QUEUE_NEXT(h) = (q);                                                      \
  }                                                                           \
  while (0)

相關文章
相關標籤/搜索