Files

148 lines
3.8 KiB
C

#ifndef _HLIST_H_
#define _HLIST_H_
#include <stddef.h>
/*
* 该结构体用于嵌入到业务数据结构体中(entry),用于实现链表
* 例:
* struct Entry { // 你的业务数据结构体
* ...
* struct node node; // 嵌入其中,位置任意
* ...
* };
*/
struct node {
struct node *next, *prev;
};
/*
* 由成员变量 node 地址获取结构体 entry 地址
* 例:
* struct Entry entry;
* struct node *n = &entry.node;
* struct Entry *p = node_entry(n, struct Entry, node);
* 此时 p 指向 entry
*/
#define node_entry(node, type, member) \
((type*)((char*)(node) - (size_t)&((type*)0)->member))
/* 带哨兵节点的双向链表 */
struct list {
struct node base;
};
static inline void list_init(struct list *list)
{
list->base.next = &list->base;
list->base.prev = &list->base;
}
static inline bool list_empty(const struct list *list)
{
return list->base.next == &list->base;
}
static inline bool list_is_head(const struct list *list, const struct node *node)
{
return list->base.next == node;
}
static inline bool list_is_tail(const struct list *list, const struct node *node)
{
return list->base.prev == node;
}
/* node 插入到 pos 后面 */
static inline void list_insert_backward(struct node *pos, struct node *node)
{
node->prev = pos;
node->next = pos->next;
node->prev->next = node;
node->next->prev = node;
}
/* node 插入到 pos 前面 */
static inline void list_insert(struct node *pos, struct node *node)
{
node->prev = pos->prev;
node->next = pos;
node->prev->next = node;
node->next->prev = node;
}
static inline void list_add_tail(struct list *list, struct node *node)
{
list_insert(&list->base, node);
}
static inline void list_add_head(struct list *list, struct node *node)
{
list_insert(list->base.next, node);
}
static inline void list_remove(struct node *node)
{
node->prev->next = node->next;
node->next->prev = node->prev;
}
static inline void list_remove_tail(struct list *list)
{
list_remove(list->base.prev);
}
static inline void list_remove_head(struct list *list)
{
list_remove(list->base.next);
}
static inline void list_replace(struct node *old, struct node *node)
{
node->next = old->next;
node->next->prev = node;
node->prev = old->prev;
node->prev->next = node;
}
#define list_for_each(node, list) \
for (node = (list)->base.next; node != &(list)->base; node = (node)->next)
#define list_for_each_safe(node, tmp, list) \
for (node = (list)->base.next, tmp = (node)->next; node != &(list)->base; node = tmp, tmp = (node)->next)
/* 获取头结点,或空 */
#define list_head_entry(list, type, member) \
(list_empty(list) ? NULL : node_entry((list)->base.next, type, member))
/* 获取尾结点,或空 */
#define list_tail_entry(list, type, member) \
(list_empty(list) ? NULL : node_entry((list)->base.prev, type, member))
/* 获取下一结点,或空 */
#define list_next_entry(entry, list, type, member) \
(list_is_tail(list, &(entry)->member) ? \
NULL : \
node_entry((entry)->member.next, type, member))
/* 获取上一结点,或空 */
#define list_prev_entry(entry, list, type, member) \
(list_is_head(list, &(entry)->member) ? \
NULL : \
node_entry((entry)->member.prev, type, member))
/* 遍历链表;过程中如需操作链表,请使用 _SAFE 版本 */
#define list_for_each_entry(entry, list, type, member) \
for (entry = node_entry((list)->base.next, type, member); \
&(entry)->member != &(list)->base; \
entry = node_entry((entry)->member.next, type, member))
#define list_for_each_entry_safe(entry, tmp, list, type, member) \
for (entry = node_entry((list)->base.next, type, member), \
tmp = node_entry((entry)->member.next, type, member); \
&(entry)->member != &(list)->base; \
entry = tmp, tmp = node_entry((entry)->member.next, type, member))
#endif /* _HLIST_H_ */