16#ifndef CCC_PRIVATE_PRIORITY_QUEUE_H
17#define CCC_PRIVATE_PRIORITY_QUEUE_H
142#define CCC_private_priority_queue_initialize( \
143 private_struct_name, private_type_intruder_field, \
144 private_priority_queue_order, private_compare, private_allocate, \
145 private_context_data) \
149 .type_intruder_offset \
150 = offsetof(private_struct_name, private_type_intruder_field), \
151 .sizeof_type = sizeof(private_struct_name), \
152 .order = (private_priority_queue_order), \
153 .compare = (private_compare), \
154 .allocate = (private_allocate), \
155 .context = (private_context_data), \
159#define CCC_private_priority_queue_from( \
160 private_type_intruder_field, private_priority_queue_order, \
161 private_compare, private_allocate, private_destroy, private_context_data, \
162 private_compound_literal_array...) \
164 typeof(*private_compound_literal_array) \
165 *private_priority_queue_type_array \
166 = private_compound_literal_array; \
167 struct CCC_Priority_queue private_priority_queue \
168 = CCC_private_priority_queue_initialize( \
169 typeof(*private_priority_queue_type_array), \
170 private_type_intruder_field, private_priority_queue_order, \
171 private_compare, private_allocate, private_context_data); \
172 if (private_priority_queue.allocate) \
174 size_t const private_count \
175 = sizeof(private_compound_literal_array) \
176 / sizeof(*private_priority_queue_type_array); \
177 for (size_t private_i = 0; private_i < private_count; ++private_i) \
179 typeof(*private_priority_queue_type_array) *const \
181 = private_priority_queue.allocate((CCC_Allocator_context){ \
183 .bytes = private_priority_queue.sizeof_type, \
184 .context = private_priority_queue.context, \
186 if (!private_new_node) \
188 CCC_priority_queue_clear(&private_priority_queue, \
193 = private_priority_queue_type_array[private_i]; \
194 CCC_private_priority_queue_push( \
195 &private_priority_queue, \
196 CCC_private_priority_queue_node_in( \
197 &private_priority_queue, private_new_node)); \
200 private_priority_queue; \
204#define CCC_private_priority_queue_emplace(priority_queue_pointer, \
205 type_compound_literal...) \
207 typeof(type_compound_literal) *private_priority_queue_res = NULL; \
208 struct CCC_Priority_queue *private_priority_queue \
209 = (priority_queue_pointer); \
210 if (private_priority_queue) \
212 if (!private_priority_queue->allocate) \
214 private_priority_queue_res = NULL; \
218 private_priority_queue_res = private_priority_queue->allocate( \
219 (CCC_Allocator_context){ \
221 .bytes = private_priority_queue->sizeof_type, \
222 .context = private_priority_queue->context, \
224 if (private_priority_queue_res) \
226 *private_priority_queue_res = type_compound_literal; \
227 CCC_private_priority_queue_push( \
228 private_priority_queue, \
229 CCC_private_priority_queue_node_in( \
230 private_priority_queue, \
231 private_priority_queue_res)); \
235 private_priority_queue_res; \
239#define CCC_private_priority_queue_update_with( \
240 priority_queue_pointer, type_pointer, update_closure_over_T...) \
242 struct CCC_Priority_queue *const private_priority_queue \
243 = (priority_queue_pointer); \
244 typeof(*type_pointer) *T = (type_pointer); \
245 if (private_priority_queue && T) \
247 struct CCC_Priority_queue_node *const \
248 private_priority_queue_node_pointer \
249 = CCC_private_priority_queue_node_in(private_priority_queue, \
251 if (private_priority_queue_node_pointer->parent \
252 && CCC_private_priority_queue_order( \
253 private_priority_queue, \
254 private_priority_queue_node_pointer, \
255 private_priority_queue_node_pointer->parent) \
256 == private_priority_queue->order) \
258 CCC_private_priority_queue_cut_child( \
259 private_priority_queue_node_pointer); \
260 {update_closure_over_T} private_priority_queue->root \
261 = CCC_private_priority_queue_merge( \
262 private_priority_queue, private_priority_queue->root, \
263 private_priority_queue_node_pointer); \
267 private_priority_queue->root \
268 = CCC_private_priority_queue_delete_node( \
269 private_priority_queue, \
270 private_priority_queue_node_pointer); \
271 CCC_private_priority_queue_init_node( \
272 private_priority_queue_node_pointer); \
273 {update_closure_over_T} private_priority_queue->root \
274 = CCC_private_priority_queue_merge( \
275 private_priority_queue, private_priority_queue->root, \
276 private_priority_queue_node_pointer); \
283#define CCC_private_priority_queue_increase_with( \
284 priority_queue_pointer, type_pointer, increase_closure_over_T...) \
286 struct CCC_Priority_queue *const private_priority_queue \
287 = (priority_queue_pointer); \
288 typeof(*type_pointer) *T = (type_pointer); \
289 if (private_priority_queue && T) \
291 struct CCC_Priority_queue_node *const \
292 private_priority_queue_node_pointer \
293 = CCC_private_priority_queue_node_in(private_priority_queue, \
295 if (private_priority_queue->order == CCC_ORDER_GREATER) \
297 CCC_private_priority_queue_cut_child( \
298 private_priority_queue_node_pointer); \
302 private_priority_queue->root \
303 = CCC_private_priority_queue_delete_node( \
304 private_priority_queue, \
305 private_priority_queue_node_pointer); \
306 CCC_private_priority_queue_init_node( \
307 private_priority_queue_node_pointer); \
309 {increase_closure_over_T} private_priority_queue->root \
310 = CCC_private_priority_queue_merge( \
311 private_priority_queue, private_priority_queue->root, \
312 private_priority_queue_node_pointer); \
318#define CCC_private_priority_queue_decrease_with( \
319 priority_queue_pointer, type_pointer, decrease_closure_over_T...) \
321 struct CCC_Priority_queue *const private_priority_queue \
322 = (priority_queue_pointer); \
323 typeof(*type_pointer) *T = (type_pointer); \
324 if (private_priority_queue && T) \
326 struct CCC_Priority_queue_node *const \
327 private_priority_queue_node_pointer \
328 = CCC_private_priority_queue_node_in(private_priority_queue, \
330 if (private_priority_queue->order == CCC_ORDER_LESSER) \
332 CCC_private_priority_queue_cut_child( \
333 private_priority_queue_node_pointer); \
337 private_priority_queue->root \
338 = CCC_private_priority_queue_delete_node( \
339 private_priority_queue, \
340 private_priority_queue_node_pointer); \
341 CCC_private_priority_queue_init_node( \
342 private_priority_queue_node_pointer); \
344 {decrease_closure_over_T} private_priority_queue->root \
345 = CCC_private_priority_queue_merge( \
346 private_priority_queue, private_priority_queue->root, \
347 private_priority_queue_node_pointer); \
Definition: private_priority_queue.h:34
struct CCC_Priority_queue_node * child
Definition: private_priority_queue.h:36
struct CCC_Priority_queue_node * parent
Definition: private_priority_queue.h:42
struct CCC_Priority_queue_node * prev
Definition: private_priority_queue.h:40
struct CCC_Priority_queue_node * next
Definition: private_priority_queue.h:38
Definition: private_priority_queue.h:87
CCC_Order order
Definition: private_priority_queue.h:98
struct CCC_Priority_queue_node * root
Definition: private_priority_queue.h:89
size_t count
Definition: private_priority_queue.h:91
void * context
Definition: private_priority_queue.h:104
CCC_Allocator * allocate
Definition: private_priority_queue.h:102
size_t sizeof_type
Definition: private_priority_queue.h:95
CCC_Type_comparator * compare
Definition: private_priority_queue.h:100
size_t type_intruder_offset
Definition: private_priority_queue.h:93
CCC_Order
A three-way comparison for comparison functions.
Definition: types.h:171
CCC_Order CCC_Type_comparator(CCC_Type_comparator_context)
A callback function for comparing two elements in a container.
Definition: types.h:348
void * CCC_Allocator(CCC_Allocator_context)
An allocation function at the core of all containers.
Definition: types.h:340