From 4733cf7460dfc4bfc45eff86950f1bdb6e768e5a Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 7 Mar 2023 10:27:58 +0100 Subject: [PATCH] std-aux: add c_list_is_empty_or_single() helper Having a list with only one element is often interesting to know. For example, if you are about to unlink an element, you may want to check whether afterwards the list is empty. Add c_list_is_empty_or_single() for that. It is probably more efficient than plain c_list_length_is(list, 1) and also a better name. --- src/libnm-core-impl/tests/test-general.c | 8 ++++++++ src/libnm-std-aux/c-list-util.h | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/src/libnm-core-impl/tests/test-general.c b/src/libnm-core-impl/tests/test-general.c index 8a98265abb..84d9caaeae 100644 --- a/src/libnm-core-impl/tests/test-general.c +++ b/src/libnm-core-impl/tests/test-general.c @@ -1417,6 +1417,7 @@ _do_test_c_list_sort(CListSort *elements, guint n_list, gboolean headless) g_assert(!c_list_is_empty(&head)); g_assert(c_list_length(&head) == n_list); + g_assert(c_list_is_empty_or_single(&head) == (n_list <= 1)); el_prev = NULL; c_list_for_each (iter, &head) { @@ -1443,6 +1444,10 @@ test_c_list_sort(void) guint n_list; guint repeat; + g_assert(!c_list_is_linked(NULL)); + g_assert(c_list_is_empty(NULL)); + g_assert(c_list_is_empty_or_single(NULL)); + { CList head; @@ -1450,6 +1455,7 @@ test_c_list_sort(void) c_list_sort(&head, _c_list_sort_cmp, NULL); g_assert(c_list_length(&head) == 0); g_assert(c_list_is_empty(&head)); + g_assert(c_list_is_empty_or_single(&head)); } elements = g_new0(CListSort, N_ELEMENTS); @@ -1517,6 +1523,8 @@ _do_test_c_list_insert_sorted(CListSort *elements, guint n_list, bool append_equ g_assert(c_list_length_is(&head, n_list)); g_assert(!c_list_length_is(&head, n_list + 1)); + g_assert(c_list_is_empty_or_single(&head) == (n_list <= 1)); + el_prev = NULL; c_list_for_each_entry (el, &head, lst) { if (el_prev) { diff --git a/src/libnm-std-aux/c-list-util.h b/src/libnm-std-aux/c-list-util.h index 4800a3cc11..ae2f07ec8c 100644 --- a/src/libnm-std-aux/c-list-util.h +++ b/src/libnm-std-aux/c-list-util.h @@ -42,6 +42,12 @@ c_list_length_is(const CList *list, unsigned long check_len) return n == check_len; } +static inline int +c_list_is_empty_or_single(const CList *list) +{ + return !list || (list->next->next == list); +} + #define c_list_for_each_prev(_iter, _list) \ for (_iter = (_list)->prev; (_iter) != (_list); _iter = (_iter)->prev)