[sdk] Implement mini lists, which are singly-linked
authorcoderain <coderain@sdf.org>
Sun, 2 Dec 2018 23:58:33 +0000 (00:58 +0100)
committercoderain <coderain@sdf.org>
Sun, 2 Dec 2018 23:58:33 +0000 (00:58 +0100)
sdk/list.h

index b8efdef3d7e9e0446100d702e5e8aa10bc9c871b..f9801f70fe8995afb8ad9b89bb52ab7575030014 100644 (file)
 #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