IQUEUEHEAD是kcp定义的双向队列,负责协调和管理数据的流动与存储。
一、结构体定义
struct IQUEUEHEAD {
//此结构定义了双向队列的节点。每个节点包含两个指针:next指向下一个节点,prev指向上一个节点。
struct IQUEUEHEAD *next, *prev;
};
二、初始化
2.1 初始化队列头
//此宏为一个队列节点进行初始化。它会将next和prev指针都指向自身。
#define IQUEUE_HEAD_INIT(name) { &(name), &(name) }
//此宏声明并初始化一个队列头。
//比如IQUEUE_HEAD(queue)翻译一下就是
//struct IQUEUEHEAD queue ={&queue, &queue};
#define IQUEUE_HEAD(name) \
struct IQUEUEHEAD name = IQUEUE_HEAD_INIT(name)
2.2 队列初始化
//初始化函数,下一个指针指向自己,上一个指针也指向自己,典型的双向列表的初始化
#define IQUEUE_INIT(ptr) ( \
(ptr)->next = (ptr), (ptr)->prev = (ptr))
2.3 获取容器结构
//获取'MEMBER'成员在TYPE中的偏移量
#define IOFFSETOF(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
//通过成员指针ptr获取该成员的结构体的指针
#define ICONTAINEROF(ptr, type, member) ( \
(type*)( ((char*)((type*)ptr)) - IOFFSETOF(type, member)) )
#define IQUEUE_ENTRY(ptr, type, member) ICONTAINEROF(ptr, type, member)
三、队列操作
3.1 添加节点到队列头部
#define IQUEUE_ADD(node, head) ( \
(node)->prev = (head), (node)->next = (head)->next, \
(head)->next->prev = (node), (head)->next = (node))
3.2 添加节点到队列的末尾
#define IQUEUE_ADD_TAIL(node,head) (\
(node)->prev = (head)->pre, (node)->next = (head),\
(head)->prev->next = (node), (head)->prev = (node))
3.3 删除两个节点中间的节点
#define IQUEUE_DEL_BETWEEN(p, n) ((n)->pre = (p),(p)->next = (n))
3.4 删除节点
#define IQUEUE_DEL(entry) (\
(entry)->next->prev = (entry)->prev,\
(entry)->prev->next = (entry)->next,
entry->next = 0, entry->prev = 0)
3.5 检查队列是否为空
#define IQUEUE_IS_EMPTY(entry) ((entry) == (entry)->next)