#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(
const CxAllocator *allocator,
cx_compare_func comparator,
size_t elem_size
);
#define cxLinkedListCreateSimple(elem_size) \
cxLinkedListCreate(
NULL,
NULL, elem_size)
__attribute__((__nonnull__))
void *cx_linked_list_at(
const void *start,
size_t start_index,
ptrdiff_t loc_advance,
size_t index
);
__attribute__((__nonnull__))
ssize_t cx_linked_list_find(
const void *start,
ptrdiff_t loc_advance,
ptrdiff_t loc_data,
cx_compare_func cmp_func,
const void *elem
);
__attribute__((__nonnull__))
ssize_t cx_linked_list_find_node(
void **result,
const void *start,
ptrdiff_t loc_advance,
ptrdiff_t loc_data,
cx_compare_func cmp_func,
const void *elem
);
__attribute__((__nonnull__))
void *cx_linked_list_first(
const void *node,
ptrdiff_t loc_prev
);
__attribute__((__nonnull__))
void *cx_linked_list_last(
const void *node,
ptrdiff_t loc_next
);
__attribute__((__nonnull__))
void *cx_linked_list_prev(
const void *begin,
ptrdiff_t loc_next,
const void *node
);
__attribute__((__nonnull__(
5)))
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__))
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__(
6)))
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__(
1,
5,
6)))
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
);
__attribute__((__nonnull__(
1,
5,
6)))
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
);
__attribute__((__nonnull__(
5)))
void cx_linked_list_remove(
void **begin,
void **end,
ptrdiff_t loc_prev,
ptrdiff_t loc_next,
void *node
);
size_t cx_linked_list_size(
const void *node,
ptrdiff_t loc_next
);
__attribute__((__nonnull__(
1,
6)))
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__(
5)))
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
);
__attribute__((__nonnull__(
1)))
void cx_linked_list_reverse(
void **begin,
void **end,
ptrdiff_t loc_prev,
ptrdiff_t loc_next
);
#ifdef __cplusplus
}
#endif
#endif