#ifndef UCX_LINKED_LIST_H
#define UCX_LINKED_LIST_H
#include "common.h"
#include "list.h"
#ifdef __cplusplus
extern "C" {
#endif
extern unsigned cx_linked_list_swap_sbo_size;
CxList *cxLinkedListCreate(
CxAllocator
const *allocator,
cx_compare_func comparator,
size_t elem_size
);
#define cxLinkedListCreateSimple(elem_size) \
cxLinkedListCreate(
NULL,
NULL, elem_size)
void *cx_linked_list_at(
void const *start,
size_t start_index,
ptrdiff_t loc_advance,
size_t index
) __attribute__((__nonnull__));
ssize_t cx_linked_list_find(
void const *start,
ptrdiff_t loc_advance,
ptrdiff_t loc_data,
cx_compare_func cmp_func,
void const *elem
) __attribute__((__nonnull__));
ssize_t cx_linked_list_find_node(
void **result,
void const *start,
ptrdiff_t loc_advance,
ptrdiff_t loc_data,
cx_compare_func cmp_func,
void const *elem
) __attribute__((__nonnull__));
void *cx_linked_list_first(
void const *node,
ptrdiff_t loc_prev
) __attribute__((__nonnull__));
void *cx_linked_list_last(
void const *node,
ptrdiff_t loc_next
) __attribute__((__nonnull__));
void *cx_linked_list_prev(
void const *begin,
ptrdiff_t loc_next,
void const *node
) __attribute__((__nonnull__));
void cx_linked_list_add(
void **begin,
void **end,
ptrdiff_t loc_prev,
ptrdiff_t loc_next,
void *new_node
) __attribute__((__nonnull__(
5)));
void cx_linked_list_prepend(
void **begin,
void **end,
ptrdiff_t loc_prev,
ptrdiff_t loc_next,
void *new_node
) __attribute__((__nonnull__(
5)));
void cx_linked_list_link(
void *left,
void *right,
ptrdiff_t loc_prev,
ptrdiff_t loc_next
) __attribute__((__nonnull__));
void cx_linked_list_unlink(
void *left,
void *right,
ptrdiff_t loc_prev,
ptrdiff_t loc_next
) __attribute__((__nonnull__));
void cx_linked_list_insert(
void **begin,
void **end,
ptrdiff_t loc_prev,
ptrdiff_t loc_next,
void *node,
void *new_node
) __attribute__((__nonnull__(
6)));
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
) __attribute__((__nonnull__(
6)));
void cx_linked_list_remove(
void **begin,
void **end,
ptrdiff_t loc_prev,
ptrdiff_t loc_next,
void *node
) __attribute__((__nonnull__(
5)));
size_t cx_linked_list_size(
void const *node,
ptrdiff_t loc_next
);
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
) __attribute__((__nonnull__(
1,
6)));
int cx_linked_list_compare(
void const *begin_left,
void const *begin_right,
ptrdiff_t loc_advance,
ptrdiff_t loc_data,
cx_compare_func cmp_func
) __attribute__((__nonnull__(
5)));
void cx_linked_list_reverse(
void **begin,
void **end,
ptrdiff_t loc_prev,
ptrdiff_t loc_next
) __attribute__((__nonnull__(
1)));
#ifdef __cplusplus
}
#endif
#endif