diff options
author | Tavian Barnes <tavianator@tavianator.com> | 2024-05-31 11:55:50 -0400 |
---|---|---|
committer | Tavian Barnes <tavianator@tavianator.com> | 2024-05-31 12:01:30 -0400 |
commit | 118a9053f04d0e215bb3fe20562990cc73ae69a2 (patch) | |
tree | e9e5ca73377f272d6348f15c5b4dd7b75f01ff5a /src/list.h | |
parent | 407e6f57bfc05c51d32d4292218f0bdd8eeaa142 (diff) | |
download | bfs-118a9053f04d0e215bb3fe20562990cc73ae69a2.tar.xz |
list: New SLIST_SPLICE() macro
Diffstat (limited to 'src/list.h')
-rw-r--r-- | src/list.h | 24 |
1 files changed, 20 insertions, 4 deletions
@@ -324,6 +324,25 @@ LIST_VOID_(SLIST_INSERT_(list, &(list)->head, item, __VA_ARGS__)) /** + * Splice a singly-linked list into another. + * + * @param dest + * The destination list. + * @param cursor + * A pointer to the item to splice after, e.g. &list->head or list->tail. + * @param src + * The source list. + */ +#define SLIST_SPLICE(dest, cursor, src) \ + LIST_VOID_(SLIST_SPLICE_((dest), (cursor), (src))) + +#define SLIST_SPLICE_(dest, cursor, src) \ + *src->tail = *cursor, \ + *cursor = src->head, \ + dest->tail = *dest->tail ? src->tail : dest->tail, \ + SLIST_INIT(src) + +/** * Add an entire singly-linked list to the tail of another. * * @param dest @@ -332,10 +351,7 @@ * The source list. */ #define SLIST_EXTEND(dest, src) \ - SLIST_EXTEND_((dest), (src)) - -#define SLIST_EXTEND_(dest, src) \ - (src->head ? (*dest->tail = src->head, dest->tail = src->tail, SLIST_INIT(src)) : (void)0) + SLIST_SPLICE(dest, (dest)->tail, src) /** * Remove an item from a singly-linked list. |