From 502f1733e320b1339beafa949a41db3027c46ec6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 9 Jan 2015 13:34:01 -0500 Subject: [PATCH] shared/list: add LIST_APPEND --- src/shared/list.h | 8 ++++++++ src/test/test-list.c | 24 ++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/shared/list.h b/src/shared/list.h index c020f7e93..f0458b54e 100644 --- a/src/shared/list.h +++ b/src/shared/list.h @@ -55,6 +55,14 @@ *_head = _item; \ } while(false) +/* Append an item to the list */ +#define LIST_APPEND(name,head,item) \ + do { \ + typeof(*(head)) *_tail; \ + LIST_FIND_TAIL(name,head,_tail); \ + LIST_INSERT_AFTER(name,head,_tail,item); \ + } while(false) + /* Remove an item from the list */ #define LIST_REMOVE(name,head,item) \ do { \ diff --git a/src/test/test-list.c b/src/test/test-list.c index fa52ad1db..e9d47f050 100644 --- a/src/test/test-list.c +++ b/src/test/test-list.c @@ -105,5 +105,29 @@ int main(int argc, const char *argv[]) { LIST_REMOVE(item, head, &items[3]); assert_se(LIST_JUST_US(item, &items[3])); + assert_se(head == NULL); + + for (i = 0; i < ELEMENTSOF(items); i++) { + assert_se(LIST_JUST_US(item, &items[i])); + LIST_APPEND(item, head, &items[i]); + } + + assert_se(!LIST_JUST_US(item, head)); + + assert_se(items[0].item_next == &items[1]); + assert_se(items[1].item_next == &items[2]); + assert_se(items[2].item_next == &items[3]); + assert_se(items[3].item_next == NULL); + + assert_se(items[0].item_prev == NULL); + assert_se(items[1].item_prev == &items[0]); + assert_se(items[2].item_prev == &items[1]); + assert_se(items[3].item_prev == &items[2]); + + for (i = 0; i < ELEMENTSOF(items); i++) + LIST_REMOVE(item, head, &items[i]); + + assert_se(head == NULL); + return 0; } -- 2.30.2