16#ifndef CCC_IMPL_DOUBLY_LINKED_LIST_H
17#define CCC_IMPL_DOUBLY_LINKED_LIST_H
96 size_t dll_elem_offset;
108void ccc_impl_dll_push_back(
struct ccc_dll *,
struct ccc_dll_elem *);
110void ccc_impl_dll_push_front(
struct ccc_dll *,
struct ccc_dll_elem *);
112struct ccc_dll_elem *ccc_impl_dll_elem_in(
struct ccc_dll
const *,
113 void const *any_struct);
119#define ccc_impl_dll_init(impl_dll_name, impl_struct_name, \
120 impl_dll_elem_field, impl_cmp_fn, impl_alloc_fn, \
123 .nil.n = &(impl_dll_name).nil, \
124 .nil.p = &(impl_dll_name).nil, \
125 .sizeof_type = sizeof(impl_struct_name), \
126 .dll_elem_offset = offsetof(impl_struct_name, impl_dll_elem_field), \
128 .alloc = (impl_alloc_fn), \
129 .cmp = (impl_cmp_fn), \
130 .aux = (impl_aux_data), \
134#define ccc_impl_dll_emplace_back(dll_ptr, struct_initializer...) \
136 typeof(struct_initializer) *impl_dll_res = NULL; \
137 struct ccc_dll *impl_dll = (dll_ptr); \
140 if (impl_dll->alloc) \
142 impl_dll_res = impl_dll->alloc(NULL, impl_dll->sizeof_type, \
146 *impl_dll_res = (typeof(*impl_dll_res))struct_initializer; \
147 ccc_impl_dll_push_back( \
149 ccc_impl_dll_elem_in(impl_dll, impl_dll_res)); \
157#define ccc_impl_dll_emplace_front(dll_ptr, struct_initializer...) \
159 typeof(struct_initializer) *impl_dll_res = NULL; \
160 struct ccc_dll *impl_dll = (dll_ptr); \
161 if (!impl_dll->alloc) \
163 impl_dll_res = NULL; \
168 = impl_dll->alloc(NULL, impl_dll->sizeof_type, impl_dll->aux); \
171 *impl_dll_res = struct_initializer; \
172 ccc_impl_dll_push_front( \
173 impl_dll, ccc_impl_dll_elem_in(impl_dll, impl_dll_res)); \
struct ccc_dll_elem ccc_dll_elem
A doubly linked list intrusive element to embedded in a user type.
Definition: doubly_linked_list.h:70
ccc_threeway_cmp ccc_any_type_cmp_fn(ccc_any_type_cmp)
A callback function for comparing two elements in a container.
Definition: types.h:320
void * ccc_any_alloc_fn(void *ptr, size_t size, void *aux)
An allocation function at the core of all containers.
Definition: types.h:312