_p; \
})
+#define LIST_CLEAR(name, head, free_func) \
+ _LIST_CLEAR(name, head, free_func, UNIQ_T(elem, UNIQ))
+
+/* Clear the list, destroing each element with free_func */
+#define _LIST_CLEAR(name, head, free_func, elem) \
+ ({ \
+ typeof(head) elem; \
+ while ((elem = LIST_POP(name, head))) \
+ free_func(elem); \
+ head; \
+ })
+
/* Now include "macro.h", because we want our definition of assert() which the macros above use. We include
* it down here instead of up top, since macro.h pulls in log.h which in turn needs our own definitions. */
#include "macro.h"
/* SPDX-License-Identifier: LGPL-2.1-or-later */
+#include "alloc-util.h"
#include "list.h"
int main(int argc, const char *argv[]) {
assert_se(LIST_POP(item_list, head) == items + 0);
assert_se(LIST_POP(item_list, head) == NULL);
+ /* No-op on an empty list */
+
+ LIST_CLEAR(item_list, head, free);
+
+ /* A non-empty list is cleared */
+
+ assert_se(LIST_PREPEND(item_list, head, new0(list_item, 1)));
+ assert_se(LIST_PREPEND(item_list, head, new0(list_item, 1)));
+
+ LIST_CLEAR(item_list, head, free);
+
+ assert_se(head == NULL);
+
+ /* A list can be cleared partially */
+
+ assert_se(LIST_PREPEND(item_list, head, new0(list_item, 1)));
+ assert_se(LIST_PREPEND(item_list, head, new0(list_item, 1)));
+ assert_se(LIST_PREPEND(item_list, head, items + 0) == items + 0);
+
+ LIST_CLEAR(item_list, head->item_list_next, free);
+
+ assert_se(head == items + 0);
+ assert_se(head->item_list_next == NULL);
+
return 0;
}