0,0 → 1,60 |
|
typedef struct link |
{ |
struct link *prev; |
struct link *next; |
}link_t; |
|
#define LIST_INITIALIZE(name) \ |
link_t name = { .prev = &name, .next = &name } |
|
#define list_get_instance(link, type, member) \ |
((type *)(((u8_t *)(link)) - ((u8_t *)&(((type *)NULL)->member)))) |
|
static inline void link_initialize(link_t *link) |
{ |
link->prev = NULL; |
link->next = NULL; |
} |
|
static inline void list_initialize(link_t *head) |
{ |
head->prev = head; |
head->next = head; |
} |
|
static inline void list_append(link_t *link, link_t *head) |
{ |
link->prev = head->prev; |
link->next = head; |
head->prev->next = link; |
head->prev = link; |
} |
|
static inline void list_remove(link_t *link) |
{ |
link->next->prev = link->prev; |
link->prev->next = link->next; |
link_initialize(link); |
} |
|
static inline Bool list_empty(link_t *head) |
{ |
return head->next == head ? TRUE : FALSE; |
} |
|
static inline void list_prepend(link_t *link, link_t *head) |
{ |
link->next = head->next; |
link->prev = head; |
head->next->prev = link; |
head->next = link; |
} |
|
static inline list_insert(link_t *new, link_t *old) |
{ |
new->prev = old->prev; |
new->next = old; |
new->prev->next = new; |
old->prev = new; |
} |