Split linking modes in duo and trio (for simple insertion inbetween)
This commit is contained in:
parent
ef4fce4cb9
commit
53643eba88
34
llist.c
34
llist.c
|
@ -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);
|
||||
}
|
||||
|
|
5
llist.h
5
llist.h
|
@ -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);
|
||||
|
|
Reference in New Issue