list: fix safe list iteration
[libside.git] / src / list.h
index f017e1a14bf2ef0a963606b4325757597f163e7e..99070f6aa3ccc13a13d6318fc3e01d003afb2342 100644 (file)
@@ -6,22 +6,13 @@
 #ifndef _SIDE_LIST_H
 #define _SIDE_LIST_H
 
-struct side_list_node {
-       struct side_list_node *next;
-       struct side_list_node *prev;
-};
+#include "list_types.h"
 
-struct side_list_head {
-       struct side_list_node node;
-};
-
-#define DEFINE_SIDE_LIST_HEAD(_identifier) \
-       struct side_list_head _identifier = { \
-               .node = { \
-                       .next = &(_identifier).node, \
-                       .prev = &(_identifier).node, \
-               }, \
-       }
+static inline
+void side_list_head_init(struct side_list_head *head)
+{
+       head->node.next = head->node.prev = &head->node;
+}
 
 static inline
 void side_list_insert_node_tail(struct side_list_head *head, struct side_list_node *node)
@@ -48,6 +39,26 @@ void side_list_remove_node(struct side_list_node *node)
        node->prev->next = node->next;
 }
 
+static inline
+bool side_list_empty(struct side_list_head *head)
+{
+       return &head->node == head->node.next;
+}
+
+/*
+ * Splice "from" list at the beginning of "to" list.
+ */
+static inline
+void side_list_splice(struct side_list_head *from, struct side_list_head *to)
+{
+       if (side_list_empty(from))
+               return;
+       from->node.next->prev = &to->node;
+       from->node.prev->next = to->node.next;
+       to->node.next->prev = from->node.prev;
+       to->node.next = from->node.next;
+}
+
 #define side_list_for_each_entry(_entry, _head, _member) \
        for ((_entry) = side_container_of((_head)->node.next, __typeof__(*(_entry)), _member); \
                &(_entry)->_member != &(_head)->node; \
@@ -58,7 +69,7 @@ void side_list_remove_node(struct side_list_node *node)
        for ((_entry) = side_container_of((_head)->node.next, __typeof__(*(_entry)), _member), \
                        (_next_entry) = side_container_of((_entry)->_member.next, __typeof__(*(_entry)), _member); \
                &(_entry)->_member != &(_head)->node; \
-               (_entry) = side_container_of((_next_entry)->_member.next, __typeof__(*(_entry)), _member), \
+               (_entry) = (_next_entry), \
                (_next_entry) = side_container_of((_entry)->_member.next, __typeof__(*(_entry)), _member))
 
 #endif /* _SIDE_LIST_H */
This page took 0.0236 seconds and 4 git commands to generate.