99 lines
2.0 KiB
C
Executable File
99 lines
2.0 KiB
C
Executable File
#pragma once
|
|
|
|
#include <u_util.h>
|
|
/**
|
|
* @brief 循环双向链表
|
|
*/
|
|
typedef struct slist_head
|
|
{
|
|
struct slist_head *prev; //!< 前一个
|
|
struct slist_head *next; //!< 后一个
|
|
} slist_head_t;
|
|
|
|
static inline void slist_init(slist_head_t *list)
|
|
{
|
|
list->prev = list;
|
|
list->next = list;
|
|
}
|
|
/**
|
|
* @brief 链表是否为空
|
|
*
|
|
* @param list
|
|
* @return mword_t
|
|
*/
|
|
static inline mword_t slist_is_empty(slist_head_t *list)
|
|
{
|
|
return (list->prev == list && list->next == list) ||
|
|
(list->prev == 0 && list->next == 0);
|
|
}
|
|
/**
|
|
* @brief 节点是否再链表中
|
|
*
|
|
* @param item
|
|
* @return bool_t
|
|
*/
|
|
static inline bool_t slist_in_list(slist_head_t *item)
|
|
{
|
|
if (slist_is_empty(item)) {
|
|
return FALSE;
|
|
}
|
|
if (item->prev->next != item) {
|
|
return FALSE;
|
|
}
|
|
if (item->next->prev != item) {
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
/**
|
|
* @brief 在头部添加一个节点
|
|
*
|
|
* @param head
|
|
* @param item
|
|
*/
|
|
static inline void slist_add(slist_head_t *head, slist_head_t *item)
|
|
{
|
|
item->next = head->next;
|
|
item->prev = head;
|
|
head->next->prev = item;
|
|
head->next = item;
|
|
}
|
|
static inline void slist_add_append(slist_head_t *head, slist_head_t *item)
|
|
{
|
|
slist_head_t *tail = head->prev;
|
|
|
|
return slist_add(tail, item);
|
|
}
|
|
/**
|
|
* @brief 获取第一个节点
|
|
*
|
|
* @param head
|
|
* @return slist_head_t*
|
|
*/
|
|
static inline slist_head_t *slist_first(slist_head_t *head)
|
|
{
|
|
return head->next;
|
|
}
|
|
/**
|
|
* @brief 删除一个节点
|
|
*
|
|
* @param item
|
|
*/
|
|
static inline void slist_del(slist_head_t *item)
|
|
{
|
|
item->prev->next = item->next;
|
|
item->next->prev = item->prev;
|
|
}
|
|
|
|
/**
|
|
* @brief 获得结构体的入口
|
|
*
|
|
*/
|
|
#define slist_entry(ptr, type, member) container_of(ptr, type, member)
|
|
|
|
/**
|
|
* @brief 遍历每一个节点获得struct的入口
|
|
*/
|
|
#define slist_foreach(pos, head, member) \
|
|
for (pos = slist_entry((head)->next, typeof(*pos), member); &(pos)->member != (head) && !slist_is_empty(head); pos = slist_entry((pos)->member.next, typeof(*pos), member))
|