From f873ac437d50d17e40eb30b4da3fc3c017cf2b58 Mon Sep 17 00:00:00 2001 From: coderain Date: Mon, 3 Dec 2018 00:58:33 +0100 Subject: [PATCH] [sdk] Implement mini lists, which are singly-linked --- sdk/list.h | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/sdk/list.h b/sdk/list.h index b8efdef..f9801f7 100644 --- a/sdk/list.h +++ b/sdk/list.h @@ -28,11 +28,19 @@ #define list_put_after list_prepend #define list_put_before list_append +#define mini_list_put_after mini_list_prepend +#define mini_list_put_before mini_list_append + typedef struct _list_entry_t { struct _list_entry_t *next, *prev; } list_entry_t; +typedef struct _mini_list_entry_t +{ + struct _mini_list_entry_t *next; +} mini_list_entry_t; + static inline void list_prepend(list_entry_t *list, list_entry_t *entry) { entry->next = list->next; @@ -66,4 +74,37 @@ static inline void list_init_array(list_entry_t *list_array, size_t size) for (i = 0; i < size; i++) list_init(&list_array[i]); } +static inline void mini_list_prepend(mini_list_entry_t *list, mini_list_entry_t *entry) +{ + entry->next = list->next; + list->next = entry; +} + +static inline void mini_list_append(mini_list_entry_t *list, mini_list_entry_t *entry) +{ + mini_list_entry_t *final = list->next; + while (final->next != list) final = final->next; + + final->next = entry; + entry->next = list; +} + +static inline void mini_list_remove(mini_list_entry_t *entry) +{ + mini_list_entry_t *prev = entry->next; + while (prev->next != entry) prev = prev->next; + prev->next = entry->next; +} + +static inline void mini_list_init(mini_list_entry_t *list) +{ + list->next = list; +} + +static inline void mini_list_init_array(mini_list_entry_t *list_array, size_t size) +{ + size_t i; + for (i = 0; i < size; i++) mini_list_init(&list_array[i]); +} + #endif -- 2.23.0