16#ifndef CCC_IMPL_PRIORITY_QUEUE_H
17#define CCC_IMPL_PRIORITY_QUEUE_H
93 size_t pq_elem_offset;
109void ccc_impl_pq_push(
struct ccc_pq *,
struct ccc_pq_elem *);
111struct ccc_pq_elem *ccc_impl_pq_elem_in(
struct ccc_pq
const *,
void const *);
114 struct ccc_pq_elem
const *,
115 struct ccc_pq_elem
const *);
117struct ccc_pq_elem *ccc_impl_pq_merge(
struct ccc_pq *pq,
118 struct ccc_pq_elem *old,
119 struct ccc_pq_elem *
new);
121void ccc_impl_pq_cut_child(
struct ccc_pq_elem *);
123void ccc_impl_pq_init_node(
struct ccc_pq_elem *);
125struct ccc_pq_elem *ccc_impl_pq_delete_node(
struct ccc_pq *,
126 struct ccc_pq_elem *);
128void *ccc_impl_pq_struct_base(
struct ccc_pq
const *,
129 struct ccc_pq_elem
const *);
134#define ccc_impl_pq_init(impl_struct_name, impl_pq_elem_field, impl_pq_order, \
135 impl_cmp_fn, impl_alloc_fn, impl_aux_data) \
139 .pq_elem_offset = offsetof(impl_struct_name, impl_pq_elem_field), \
140 .sizeof_type = sizeof(impl_struct_name), \
141 .alloc = (impl_alloc_fn), \
142 .cmp = (impl_cmp_fn), \
143 .order = (impl_pq_order), \
144 .aux = (impl_aux_data), \
148#define ccc_impl_pq_emplace(pq_ptr, lazy_value...) \
150 typeof(lazy_value) *impl_pq_res = NULL; \
151 struct ccc_pq *impl_pq = (pq_ptr); \
154 if (!impl_pq->alloc) \
156 impl_pq_res = NULL; \
160 impl_pq_res = impl_pq->alloc(NULL, impl_pq->sizeof_type, \
164 *impl_pq_res = lazy_value; \
166 impl_pq, ccc_impl_pq_elem_in(impl_pq, impl_pq_res)); \
174#define ccc_impl_pq_update_w(pq_ptr, any_type_ptr, update_closure_over_T...) \
176 struct ccc_pq *const impl_pq = (pq_ptr); \
177 typeof(*any_type_ptr) *T = (any_type_ptr); \
180 struct ccc_pq_elem *const impl_pq_elem_ptr \
181 = ccc_impl_pq_elem_in(impl_pq, T); \
182 if (impl_pq_elem_ptr->parent \
183 && ccc_impl_pq_cmp(impl_pq, impl_pq_elem_ptr, \
184 impl_pq_elem_ptr->parent) \
187 ccc_impl_pq_cut_child(impl_pq_elem_ptr); \
188 {update_closure_over_T} impl_pq->root = ccc_impl_pq_merge( \
189 impl_pq, impl_pq->root, impl_pq_elem_ptr); \
194 = ccc_impl_pq_delete_node(impl_pq, impl_pq_elem_ptr); \
195 ccc_impl_pq_init_node(impl_pq_elem_ptr); \
196 {update_closure_over_T} impl_pq->root = ccc_impl_pq_merge( \
197 impl_pq, impl_pq->root, impl_pq_elem_ptr); \
204#define ccc_impl_pq_increase_w(pq_ptr, any_type_ptr, \
205 increase_closure_over_T...) \
207 struct ccc_pq *const impl_pq = (pq_ptr); \
208 typeof(*any_type_ptr) *T = (any_type_ptr); \
211 struct ccc_pq_elem *const impl_pq_elem_ptr \
212 = ccc_impl_pq_elem_in(impl_pq, T); \
213 if (impl_pq->order == CCC_GRT) \
215 ccc_impl_pq_cut_child(impl_pq_elem_ptr); \
220 = ccc_impl_pq_delete_node(impl_pq, impl_pq_elem_ptr); \
221 ccc_impl_pq_init_node(impl_pq_elem_ptr); \
223 {increase_closure_over_T} impl_pq->root \
224 = ccc_impl_pq_merge(impl_pq, impl_pq->root, impl_pq_elem_ptr); \
230#define ccc_impl_pq_decrease_w(pq_ptr, any_type_ptr, \
231 decrease_closure_over_T...) \
233 struct ccc_pq *const impl_pq = (pq_ptr); \
234 typeof(*any_type_ptr) *T = (any_type_ptr); \
237 struct ccc_pq_elem *const impl_pq_elem_ptr \
238 = ccc_impl_pq_elem_in(impl_pq, T); \
239 if (impl_pq->order == CCC_LES) \
241 ccc_impl_pq_cut_child(impl_pq_elem_ptr); \
246 = ccc_impl_pq_delete_node(impl_pq, impl_pq_elem_ptr); \
247 ccc_impl_pq_init_node(impl_pq_elem_ptr); \
249 {decrease_closure_over_T} impl_pq->root \
250 = ccc_impl_pq_merge(impl_pq, impl_pq->root, impl_pq_elem_ptr); \
struct ccc_pq_elem ccc_pq_elem
The embedded struct type for operation of the priority queue.
Definition: priority_queue.h:63
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
ccc_threeway_cmp
A three-way comparison for comparison functions.
Definition: types.h:153