Files
RTOS/Base/os_list.h
T
2026-05-19 11:49:22 +08:00

80 lines
2.6 KiB
C

#ifndef INCLUDED_OS_LIST_H
#define INCLUDED_OS_LIST_H
#ifndef INCLUDED_OS_TYPES_H
#include <os_types.h>
#endif /*INCLUDED_OS_TYPES_H*/
/* ------------------------------------------------------------------------------------------------------------------ */
/* */
typedef struct os_list_node_t{
struct os_list_node_t* prev;
struct os_list_node_t* next;
}os_list_node_t;
typedef os_list_node_t os_list_t;
/* ------------------------------------------------------------------------------------------------------------------ */
/* */
#define os_list_prev(L) (L)->prev
#define os_list_next(L) (L)->next
#define os_list_prev_next(L) os_list_next(os_list_prev(L))
#define os_list_next_prev(L) os_list_prev(os_list_next(L))
#define os_list_next_next(L) os_list_next(os_list_next(L))
#define os_list_init(L) (os_list_prev(L)=os_list_next(L)=(os_list_node_t*)(L))
#define os_list_is_empty(L) ((os_list_prev(L)==(L))?OS_TRUE:OS_FALSE)
#define os_list_is_one(L) (os_list_next_next(L)==(L))
// Lp -- N -- L
#define os_list_insert_before(L, N) \
do{ \
os_list_prev_next(L) = (os_list_node_t*)(N); \
os_list_prev(N) = os_list_prev(L); \
os_list_prev(L) = (os_list_node_t*)(N); \
os_list_next(N) = (os_list_node_t*)(L); \
}while(0)
// L -- N -- Ln
#define os_list_insert_after(L, N) \
do{ \
os_list_next_prev(L) = (os_list_node_t*)(N); \
os_list_next(N) = os_list_next(L); \
os_list_next(L) = (os_list_node_t*)(N); \
os_list_prev(N) = (os_list_node_t*)(L); \
}while(0)
#define os_list_remove(N) \
do{ \
os_list_prev_next(N) = os_list_next(N); \
os_list_next_prev(N) = os_list_prev(N); \
os_list_init(N); \
}while(0)
// Lp -- L -- Ln -- Lp
// Np -- N -- Nn -- Np
// 1. Lp.next = Nn : L --> Ln --> Lp -next-> Nn -next-> Np --> N --> Nn
// 2. N.head.prev = L.tail: Lp <-prev- Nn
// 3. N.tail.next = L Np -next-> L
// 4. L.prev = N.prev Np <-prev- L
#define os_list_join(L, N) \
do{ \
if(os_list_is_empty(N)){ \
break; \
} \
os_list_prev_next(L) = os_list_next(N); \
os_list_next_prev(N) = os_list_prev(L); \
os_list_prev_next(N) = (L); \
os_list_prev(L) = os_list_prev(N); \
os_list_init(N); \
}while(0)
#define os_list_member_of(ptr, type, member) \
((type *)( (char *)ptr - ((os_size_t)&((type *)0)->member) ))
#endif /*INCLUDED_OS_LIST_H*/