#ifndef UCX_LINKED_LIST_H
#define UCX_LINKED_LIST_H
#include "common.h"
#include "list.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct cx_linked_list_s {
struct cx_list_s base;
off_t loc_prev;
off_t loc_next;
off_t loc_data;
off_t loc_extra;
size_t extra_data_len;
void *begin;
void *end;
} cx_linked_list;
cx_attr_nodiscard cx_attr_malloc cx_attr_dealloc(cxListFree,
1)
CX_EXPORT CxList *cxLinkedListCreate(
const CxAllocator *allocator,
cx_compare_func comparator,
size_t elem_size);
#define cxLinkedListCreateSimple(elem_size) \
cxLinkedListCreate(
NULL,
NULL, elem_size)
cx_attr_nonnull
CX_EXPORT void cx_linked_list_extra_data(cx_linked_list *list,
size_t len);
cx_attr_nonnull cx_attr_nodiscard
CX_EXPORT void *cx_linked_list_at(
const void *start,
size_t start_index,
ptrdiff_t loc_advance,
size_t index);
cx_attr_nonnull_arg(
1,
4,
5)
CX_EXPORT void *cx_linked_list_find(
const void *start,
ptrdiff_t loc_advance,
ptrdiff_t loc_data, cx_compare_func cmp_func,
const void *elem,
size_t *found_index);
cx_attr_nonnull cx_attr_returns_nonnull
CX_EXPORT void *cx_linked_list_first(
const void *node,
ptrdiff_t loc_prev);
cx_attr_nonnull cx_attr_returns_nonnull
CX_EXPORT void *cx_linked_list_last(
const void *node,
ptrdiff_t loc_next);
cx_attr_nonnull
CX_EXPORT void *cx_linked_list_prev(
const void *begin,
ptrdiff_t loc_next,
const void *node);
cx_attr_nonnull_arg(
5)
CX_EXPORT void cx_linked_list_add(
void **begin,
void **end,
ptrdiff_t loc_prev,
ptrdiff_t loc_next,
void *new_node);
cx_attr_nonnull_arg(
5)
CX_EXPORT void cx_linked_list_prepend(
void **begin,
void **end,
ptrdiff_t loc_prev,
ptrdiff_t loc_next,
void *new_node);
cx_attr_nonnull
CX_EXPORT void cx_linked_list_link(
void *left,
void *right,
ptrdiff_t loc_prev,
ptrdiff_t loc_next);
cx_attr_nonnull
CX_EXPORT void cx_linked_list_unlink(
void *left,
void *right,
ptrdiff_t loc_prev,
ptrdiff_t loc_next);
cx_attr_nonnull_arg(
6)
CX_EXPORT void cx_linked_list_insert(
void **begin,
void **end,
ptrdiff_t loc_prev,
ptrdiff_t loc_next,
void *node,
void *new_node);
cx_attr_nonnull_arg(
6)
CX_EXPORT void cx_linked_list_insert_chain(
void **begin,
void **end,
ptrdiff_t loc_prev,
ptrdiff_t loc_next,
void *node,
void *insert_begin,
void *insert_end);
cx_attr_nonnull_arg(
1,
5,
6)
CX_EXPORT void cx_linked_list_insert_sorted(
void **begin,
void **end,
ptrdiff_t loc_prev,
ptrdiff_t loc_next,
void *new_node, cx_compare_func cmp_func);
cx_attr_nonnull_arg(
1,
5,
6)
CX_EXPORT void cx_linked_list_insert_sorted_chain(
void **begin,
void **end,
ptrdiff_t loc_prev,
ptrdiff_t loc_next,
void *insert_begin, cx_compare_func cmp_func);
cx_attr_nonnull_arg(
1,
5,
6)
CX_EXPORT int cx_linked_list_insert_unique(
void **begin,
void **end,
ptrdiff_t loc_prev,
ptrdiff_t loc_next,
void *new_node, cx_compare_func cmp_func);
cx_attr_nonnull_arg(
1,
5,
6) cx_attr_nodiscard
CX_EXPORT void *cx_linked_list_insert_unique_chain(
void **begin,
void **end,
ptrdiff_t loc_prev,
ptrdiff_t loc_next,
void *insert_begin, cx_compare_func cmp_func);
cx_attr_nonnull_arg(
5)
CX_EXPORT size_t cx_linked_list_remove_chain(
void **begin,
void **end,
ptrdiff_t loc_prev,
ptrdiff_t loc_next,
void *node,
size_t num);
cx_attr_nonnull_arg(
5)
CX_EXPORT void cx_linked_list_remove(
void **begin,
void **end,
ptrdiff_t loc_prev,
ptrdiff_t loc_next,
void *node);
cx_attr_nodiscard
CX_EXPORT size_t cx_linked_list_size(
const void *node,
ptrdiff_t loc_next);
cx_attr_nonnull_arg(
1,
6)
CX_EXPORT void cx_linked_list_sort(
void **begin,
void **end,
ptrdiff_t loc_prev,
ptrdiff_t loc_next,
ptrdiff_t loc_data, cx_compare_func cmp_func);
cx_attr_nonnull_arg(
5)
CX_EXPORT int cx_linked_list_compare(
const void *begin_left,
const void *begin_right,
ptrdiff_t loc_advance,
ptrdiff_t loc_data, cx_compare_func cmp_func);
cx_attr_nonnull_arg(
1)
CX_EXPORT void cx_linked_list_reverse(
void **begin,
void **end,
ptrdiff_t loc_prev,
ptrdiff_t loc_next);
#ifdef __cplusplus
}
#endif
#endif