16#ifndef CCC_IMPL_FLAT_PRIORITY_QUEUE_H
17#define CCC_IMPL_FLAT_PRIORITY_QUEUE_H
48size_t ccc_impl_fpq_bubble_up(
struct ccc_fpq *,
char[
const],
size_t);
50void ccc_impl_fpq_in_place_heapify(
struct ccc_fpq *,
size_t n);
52void *ccc_impl_fpq_update_fixup(
struct ccc_fpq *,
void *);
57#define ccc_impl_fpq_init(impl_mem_ptr, impl_any_type_name, impl_cmp_order, \
58 impl_cmp_fn, impl_alloc_fn, impl_aux_data, \
61 .buf = ccc_buf_init(impl_mem_ptr, impl_any_type_name, impl_alloc_fn, \
62 impl_aux_data, impl_capacity), \
63 .cmp = (impl_cmp_fn), \
64 .order = (impl_cmp_order), \
68#define ccc_impl_fpq_heapify_init(impl_mem_ptr, impl_any_type_name, \
69 impl_cmp_order, impl_cmp_fn, impl_alloc_fn, \
70 impl_aux_data, impl_capacity, impl_size) \
72 __auto_type impl_fpq_heapify_mem = (impl_mem_ptr); \
73 struct ccc_fpq impl_fpq_heapify_res = ccc_impl_fpq_init( \
74 impl_fpq_heapify_mem, impl_any_type_name, impl_cmp_order, \
75 impl_cmp_fn, impl_alloc_fn, impl_aux_data, impl_capacity); \
76 ccc_impl_fpq_in_place_heapify(&impl_fpq_heapify_res, (impl_size)); \
77 impl_fpq_heapify_res; \
83#define ccc_impl_fpq_emplace(fpq, type_initializer...) \
85 typeof(type_initializer) *impl_fpq_res = NULL; \
86 struct ccc_fpq *impl_fpq = (fpq); \
87 assert(sizeof(*impl_fpq_res) == impl_fpq->buf.sizeof_type); \
88 if (impl_fpq->buf.count + 1 >= impl_fpq->buf.capacity) \
90 ccc_result const impl_extra_space = ccc_buf_alloc( \
92 impl_fpq->buf.capacity ? impl_fpq->buf.capacity * 2 : 8, \
93 impl_fpq->buf.alloc); \
94 if (impl_extra_space == CCC_RESULT_OK) \
96 impl_fpq_res = ccc_buf_alloc_back(&impl_fpq->buf); \
101 impl_fpq_res = ccc_buf_alloc_back(&impl_fpq->buf); \
105 *impl_fpq_res = type_initializer; \
106 if (impl_fpq->buf.count > 1) \
109 = ccc_buf_at(&impl_fpq->buf, impl_fpq->buf.count); \
110 impl_fpq_res = ccc_buf_at( \
112 ccc_impl_fpq_bubble_up(impl_fpq, impl_fpq_tmp, \
113 impl_fpq->buf.count - 1)); \
117 impl_fpq_res = ccc_buf_at(&impl_fpq->buf, 0); \
125#define ccc_impl_fpq_update_w(fpq_ptr, T_ptr, update_closure_over_T...) \
127 struct ccc_fpq *const impl_fpq = (fpq_ptr); \
128 typeof(*T_ptr) *T = (T_ptr); \
129 if (impl_fpq && !ccc_buf_is_empty(&impl_fpq->buf) && T) \
131 {update_closure_over_T} T \
132 = ccc_impl_fpq_update_fixup(impl_fpq, T); \
138#define ccc_impl_fpq_increase_w(fpq_ptr, T_ptr, increase_closure_over_T...) \
139 ccc_impl_fpq_update_w(fpq_ptr, T_ptr, increase_closure_over_T)
142#define ccc_impl_fpq_decrease_w(fpq_ptr, T_ptr, decrease_closure_over_T...) \
143 ccc_impl_fpq_update_w(fpq_ptr, T_ptr, decrease_closure_over_T)
struct ccc_buffer ccc_buffer
A contiguous block of storage for elements of the same type.
Definition: buffer.h:65
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
ccc_threeway_cmp
A three-way comparison for comparison functions.
Definition: types.h:153