Split linking modes in duo and trio (for simple insertion inbetween)

This commit is contained in:
Alex D. 2021-08-14 17:56:08 +00:00
parent ef4fce4cb9
commit 53643eba88
Signed by: caskd
GPG Key ID: F92BA85F61F4C173
3 changed files with 35 additions and 6 deletions

View File

@ -1,3 +1,3 @@
VERSION = 1.2.0
VERSION = 1.3.0
PREFIX = /usr/local
CC = clang

34
llist.c
View File

@ -22,7 +22,10 @@
#include <stdlib.h> // malloc() free()
static llist_err corelibs_llist_create(void*, void (*)(void*), llist_t**);
static llist_err corelibs_llist_link(llist_t*, llist_t*);
static llist_err corelibs_llist_link_duo(llist_t*, llist_t*);
static llist_err corelibs_llist_link_trio(llist_t*, llist_t*, llist_t*);
static llist_err corelibs_llist_free_list(llist_t*);
static llist_err corelibs_llist_free_elem(llist_t*);
@ -51,7 +54,10 @@ enum { // Avoid collision in error numbers
struct corelibs_llist_interface const llist = {
.create = corelibs_llist_create,
.link = corelibs_llist_link,
.link = {
.duo = corelibs_llist_link_duo,
.trio = corelibs_llist_link_trio,
},
.free = {
.list = corelibs_llist_free_list,
.elem = corelibs_llist_free_elem,
@ -142,7 +148,7 @@ ret:
}
static llist_err
corelibs_llist_link(llist_t* a, llist_t* b)
corelibs_llist_link_duo(llist_t* a, llist_t* b)
{
llist_err err = CORELIBS_LLIST_ERR_OK;
@ -157,6 +163,26 @@ ret:
return err;
}
static llist_err
corelibs_llist_link_trio(llist_t* a, llist_t* b, llist_t* c)
{
llist_err err = CORELIBS_LLIST_ERR_OK;
if (a == NULL && b == NULL && c == NULL) {
err = CORELIBS_LLIST_ERR_NULL;
goto ret;
}
if (a != NULL) a->next = b;
if (b != NULL) {
b->next = c;
b->prev = a;
}
if (c != NULL) c->prev = b;
ret:
return err;
}
static llist_err
corelibs_llist_get_next(const llist_t* e, llist_t** save)
{
@ -244,7 +270,7 @@ ret:
static void
corelibs_llist_remove(llist_t* e)
{
corelibs_llist_link(e->prev, e->next);
corelibs_llist_link_duo(e->prev, e->next);
if (e->free != NULL) e->free(e->cont);
free(e);
}

View File

@ -24,7 +24,10 @@ typedef signed short int llist_err;
struct corelibs_llist_interface {
llist_err (*const create)(void* content, void (*const free_function)(void*), llist_t** save);
llist_err (*const link)(llist_t* element_a, llist_t* element_b);
const struct {
llist_err (*const duo)(llist_t* element_a, llist_t* element_b);
llist_err (*const trio)(llist_t* element_a, llist_t* element_b, llist_t* element_c);
} link;
const struct {
llist_err (*const list)(llist_t* element);
llist_err (*const elem)(llist_t* element);