diff options
Diffstat (limited to 'kernel/include/libk/list.h')
| -rw-r--r-- | kernel/include/libk/list.h | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/kernel/include/libk/list.h b/kernel/include/libk/list.h index f6a97f8..1cd9928 100644 --- a/kernel/include/libk/list.h +++ b/kernel/include/libk/list.h @@ -1,14 +1,37 @@ #ifndef LIST_H #define LIST_H +#include <containter_of.h> + struct list_t { struct list_t* next; - void* data; + struct list_t* prev; }; typedef struct list_t list_t; -void add_to_list_head(list_t** ptr, void* data); -void add_to_list_tail(list_t** ptr, void* data); -void free_list(list_t** ptr); +void add_to_list(list_t* head, list_t* prev, list_t* next); +void free_node(list_t* head); + +#define INIT_LIST(name) \ + name.next = &name; \ + name.prev = &name; + +#define list_for_each(pos, head) \ + for (pos = head->next; pos != head; pos = pos->next) + +#define list_next_entry(pos, member) \ + container_of(pos->member.next, typeof(*pos), member) + +#define list_prev_entry(pos, member) \ + container_of(pos->member.prev, typeof(*pos), member) + +#define list_for_each_entry(pos, head, member) \ + for (pos = container_of(head->next, typeof(*pos), member); pos != container_of(head, typeof(*pos), member); pos = container_of(pos->member.next, typeof(*pos), member)) + +#define list_for_each_entry_prev(pos, head, member) \ + for (pos = container_of(head->prev, typeof(*pos), member); pos != container_of(head, typeof(*pos), member); pos = container_of(pos->member.prev, typeof(*pos), member)) + +#define list_is_empty(pos) \ + (pos == pos->next) #endif |
