1#ifndef CCC_IMPL_PRIORITY_QUEUE_H
2#define CCC_IMPL_PRIORITY_QUEUE_H
15 struct ccc_pq_elem_ *left_child_;
16 struct ccc_pq_elem_ *next_sibling_;
17 struct ccc_pq_elem_ *prev_sibling_;
18 struct ccc_pq_elem_ *parent_;
24 struct ccc_pq_elem_ *root_;
26 size_t pq_elem_offset_;
37void ccc_impl_pq_push(
struct ccc_pq_ *,
struct ccc_pq_elem_ *);
39struct ccc_pq_elem_ *ccc_impl_pq_elem_in(
struct ccc_pq_
const *,
void const *);
41void ccc_impl_pq_update_fixup(
struct ccc_pq_ *,
struct ccc_pq_elem_ *);
43void ccc_impl_pq_increase_fixup(
struct ccc_pq_ *,
struct ccc_pq_elem_ *);
45void ccc_impl_pq_decrease_fixup(
struct ccc_pq_ *,
struct ccc_pq_elem_ *);
50#define ccc_impl_pq_init(struct_name, pq_elem_field, pq_order, cmp_fn, \
55 .pq_elem_offset_ = offsetof(struct_name, pq_elem_field), \
56 .elem_sz_ = sizeof(struct_name), \
57 .alloc_ = (alloc_fn), \
59 .order_ = (pq_order), \
64#define ccc_impl_pq_emplace(pq_ptr, lazy_value...) \
66 typeof(lazy_value) *pq_res_ = NULL; \
67 struct ccc_pq_ *pq_ = (pq_ptr); \
70 assert(sizeof(*pq_res_) == pq_->elem_sz_); \
77 pq_res_ = pq_->alloc_(NULL, pq_->elem_sz_, pq_->aux_); \
80 *pq_res_ = lazy_value; \
81 ccc_impl_pq_push(pq_, ccc_impl_pq_elem_in(pq_, pq_res_)); \
89#define ccc_impl_pq_update_w(pq_ptr, pq_elem_ptr, update_closure_over_T...) \
91 struct ccc_pq_ *const pq_ = (pq_ptr); \
92 ccc_tribool pq_update_res_ = CCC_FALSE; \
93 struct ccc_pq_elem_ *const pq_elem_ptr_ = (pq_elem_ptr); \
94 if (pq_ && pq_elem_ptr_ && pq_elem_ptr_->next_sibling_ \
95 && pq_elem_ptr_->prev_sibling_) \
97 pq_update_res_ = CCC_TRUE; \
98 {update_closure_over_T} ccc_impl_pq_update_fixup(pq_, \
105#define ccc_impl_pq_increase_w(pq_ptr, pq_elem_ptr, \
106 increase_closure_over_T...) \
108 struct ccc_pq_ *const pq_ = (pq_ptr); \
109 ccc_tribool pq_increase_res_ = CCC_FALSE; \
110 struct ccc_pq_elem_ *const pq_elem_ptr_ = (pq_elem_ptr); \
111 if (pq_ && pq_elem_ptr_ && pq_elem_ptr_->next_sibling_ \
112 && pq_elem_ptr_->prev_sibling_) \
114 pq_increase_res_ = CCC_TRUE; \
115 {increase_closure_over_T} ccc_impl_pq_increase_fixup( \
116 pq_, pq_elem_ptr_); \
122#define ccc_impl_pq_decrease_w(pq_ptr, pq_elem_ptr, \
123 decrease_closure_over_T...) \
125 struct ccc_pq_ *const pq_ = (pq_ptr); \
126 ccc_tribool pq_decrease_res_ = CCC_FALSE; \
127 struct ccc_pq_elem_ *const pq_elem_ptr_ = (pq_elem_ptr); \
128 if (pq_ && pq_elem_ptr_ && pq_elem_ptr_->next_sibling_ \
129 && pq_elem_ptr_->prev_sibling_) \
131 pq_decrease_res_ = CCC_TRUE; \
132 {decrease_closure_over_T} ccc_impl_pq_decrease_fixup( \
133 pq_, pq_elem_ptr_); \
ccc_threeway_cmp ccc_cmp_fn(ccc_cmp)
A callback function for comparing two elements in a container.
Definition: types.h:291
void * ccc_alloc_fn(void *ptr, size_t size, void *aux)
An allocation function at the core of all containers.
Definition: types.h:283
ccc_threeway_cmp
A three-way comparison for comparison functions.
Definition: types.h:138