]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: Add DLLIST2_JOIN()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 8 Feb 2024 22:33:00 +0000 (00:33 +0200)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Wed, 7 Aug 2024 13:15:57 +0000 (13:15 +0000)
src/lib/llist.h
src/lib/test-llist.c

index 8a52e873352030befc35df2efb44684549d1fda7..5ad5d75c0df86e01abbd0acb584a7ad0240ec982 100644 (file)
 #define DLLIST2_REMOVE(head, tail, item) \
        DLLIST2_REMOVE_FULL(head, tail, item, prev, next)
 
+#define DLLIST2_JOIN_FULL(head1, tail1, head2, tail2, prev, next) STMT_START { \
+       if (*(head1) == NULL) { \
+               *(head1) = *(head2); \
+               *(tail1) = *(tail2); \
+       } else if (*(head2) != NULL) { \
+               (*(tail1))->next = *(head2); \
+               (*(head2))->prev = *(tail1); \
+               (*tail1) = (*tail2); \
+       } \
+       } STMT_END
+
+#define DLLIST2_JOIN(head1, tail1, head2, tail2) \
+       DLLIST2_JOIN_FULL(head1, tail1, head2, tail2, prev, next)
+
 #endif
index ed584318fa38e4b5c473d6f4c564d2bed34072cb..e293eb6a6030fdfe122e5abc1b8d7cbee684ccef 100644 (file)
@@ -131,8 +131,47 @@ static void test_dllist2(void)
        test_end();
 }
 
+static void test_dllist2_join(void)
+{
+       struct dllist *head, *tail, *elem[4];
+       struct dllist *head2, *tail2, *elem2[N_ELEMENTS(elem)];
+
+       test_begin("dllist2 join");
+       for (unsigned int i = 0; i < N_ELEMENTS(elem); i++) {
+               elem[i] = t_new(struct dllist, 1);
+               elem2[i] = t_new(struct dllist, 1);
+       }
+       for (unsigned int i = 0; i < N_ELEMENTS(elem); i++) {
+               for (unsigned int j = 0; j < N_ELEMENTS(elem2); j++) {
+                       head = tail = head2 = tail2 = NULL;
+                       for (unsigned int n = 0; n < i; n++)
+                               DLLIST2_APPEND(&head, &tail, elem[n]);
+                       for (unsigned int n = 0; n < j; n++)
+                               DLLIST2_APPEND(&head2, &tail2, elem2[n]);
+                       DLLIST2_JOIN(&head, &tail, &head2, &tail2);
+
+                       /* verify */
+                       struct dllist *tmp = head, *last = NULL;
+                       for (unsigned int n = 0; n < i; n++) {
+                               test_assert(tmp == elem[n]);
+                               last = tmp;
+                               tmp = tmp->next;
+                       }
+                       for (unsigned int n = 0; n < j; n++) {
+                               test_assert(tmp == elem2[n]);
+                               last = tmp;
+                               tmp = tmp->next;
+                       }
+                       test_assert(tmp == NULL);
+                       test_assert(tail == last);
+               }
+       }
+       test_end();
+}
+
 void test_llist(void)
 {
        test_dllist();
        test_dllist2();
+       test_dllist2_join();
 }