]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
list: add LIST_POP() helper that pops the first item off a linked list
authorLennart Poettering <lennart@poettering.net>
Tue, 28 Sep 2021 22:13:12 +0000 (00:13 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 25 Nov 2021 11:10:03 +0000 (12:10 +0100)
src/basic/list.h
src/test/test-list.c

index e488fff9f020604e6aaba71808707ad75945f313..effee0e435e532450244e0a5b68fa311881a1422 100644 (file)
                 }                                                       \
                 (b) = NULL;                                             \
         } while (false)
+
+#define LIST_POP(name, a)                                               \
+        ({                                                              \
+                typeof(a)* _a = &(a);                                   \
+                typeof(a) _p = *_a;                                     \
+                if (_p)                                                 \
+                        LIST_REMOVE(name, *_a, _p);                     \
+                _p;                                                     \
+        })
index a41f23ab3ed78fa65150f174be771a2eb5e825e7..25cc55a998de8ed5fde60708d2bd1db83280eb61 100644 (file)
@@ -247,5 +247,14 @@ int main(int argc, const char *argv[]) {
 
         assert_se(head == NULL);
 
+        LIST_PREPEND(item, head, items + 0);
+        LIST_PREPEND(item, head, items + 1);
+        LIST_PREPEND(item, head, items + 2);
+
+        assert_se(LIST_POP(item, head) == items + 2);
+        assert_se(LIST_POP(item, head) == items + 1);
+        assert_se(LIST_POP(item, head) == items + 0);
+        assert_se(LIST_POP(item, head) == NULL);
+
         return 0;
 }