Files
mkrtos-real/mkrtos_user/lib/util/inc/u_slist.h
2023-12-03 17:54:26 +08:00

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))