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_with_allocator( \
160 private_struct_name, private_type_intruder_field, \
161 private_priority_queue_order, private_compare, private_allocate) \
165 .type_intruder_offset \
166 = offsetof(private_struct_name, private_type_intruder_field), \
167 .sizeof_type = sizeof(private_struct_name), \
168 .order = (private_priority_queue_order), \
169 .compare = (private_compare), \
170 .allocate = (private_allocate), \
175#define CCC_private_priority_queue_with_context_allocator( \
176 private_struct_name, private_type_intruder_field, \
177 private_priority_queue_order, private_compare, private_allocate, \
182 .type_intruder_offset \
183 = offsetof(private_struct_name, private_type_intruder_field), \
184 .sizeof_type = sizeof(private_struct_name), \
185 .order = (private_priority_queue_order), \
186 .compare = (private_compare), \
187 .allocate = (private_allocate), \
188 .context = (private_context), \
192#define CCC_private_priority_queue_from( \
193 private_type_intruder_field, private_priority_queue_order, \
194 private_compare, private_allocate, private_destroy, private_context_data, \
195 private_compound_literal_array...) \
197 typeof(*private_compound_literal_array) \
198 *private_priority_queue_type_array \
199 = private_compound_literal_array; \
200 struct CCC_Priority_queue private_priority_queue \
201 = CCC_private_priority_queue_initialize( \
202 typeof(*private_priority_queue_type_array), \
203 private_type_intruder_field, private_priority_queue_order, \
204 private_compare, private_allocate, private_context_data); \
205 if (private_priority_queue.allocate) \
207 size_t const private_count \
208 = sizeof(private_compound_literal_array) \
209 / sizeof(*private_priority_queue_type_array); \
210 for (size_t private_i = 0; private_i < private_count; ++private_i) \
212 typeof(*private_priority_queue_type_array) *const \
214 = private_priority_queue.allocate((CCC_Allocator_context){ \
216 .bytes = private_priority_queue.sizeof_type, \
217 .context = private_priority_queue.context, \
219 if (!private_new_node) \
221 CCC_priority_queue_clear(&private_priority_queue, \
226 = private_priority_queue_type_array[private_i]; \
227 CCC_private_priority_queue_push( \
228 &private_priority_queue, \
229 CCC_private_priority_queue_node_in( \
230 &private_priority_queue, private_new_node)); \
233 private_priority_queue; \
237#define CCC_private_priority_queue_emplace(priority_queue_pointer, \
238 type_compound_literal...) \
240 typeof(type_compound_literal) *private_priority_queue_res = NULL; \
241 struct CCC_Priority_queue *private_priority_queue \
242 = (priority_queue_pointer); \
243 if (private_priority_queue) \
245 if (!private_priority_queue->allocate) \
247 private_priority_queue_res = NULL; \
251 private_priority_queue_res = private_priority_queue->allocate( \
252 (CCC_Allocator_context){ \
254 .bytes = private_priority_queue->sizeof_type, \
255 .context = private_priority_queue->context, \
257 if (private_priority_queue_res) \
259 *private_priority_queue_res = type_compound_literal; \
260 CCC_private_priority_queue_push( \
261 private_priority_queue, \
262 CCC_private_priority_queue_node_in( \
263 private_priority_queue, \
264 private_priority_queue_res)); \
268 private_priority_queue_res; \
272#define CCC_private_priority_queue_update_with( \
273 priority_queue_pointer, type_pointer, update_closure_over_T...) \
275 struct CCC_Priority_queue *const private_priority_queue \
276 = (priority_queue_pointer); \
277 typeof(*type_pointer) *T = (type_pointer); \
278 if (private_priority_queue && T) \
280 struct CCC_Priority_queue_node *const \
281 private_priority_queue_node_pointer \
282 = CCC_private_priority_queue_node_in(private_priority_queue, \
284 if (private_priority_queue_node_pointer->parent \
285 && CCC_private_priority_queue_order( \
286 private_priority_queue, \
287 private_priority_queue_node_pointer, \
288 private_priority_queue_node_pointer->parent) \
289 == private_priority_queue->order) \
291 CCC_private_priority_queue_cut_child( \
292 private_priority_queue_node_pointer); \
293 {update_closure_over_T} private_priority_queue->root \
294 = CCC_private_priority_queue_merge( \
295 private_priority_queue, private_priority_queue->root, \
296 private_priority_queue_node_pointer); \
300 private_priority_queue->root \
301 = CCC_private_priority_queue_delete_node( \
302 private_priority_queue, \
303 private_priority_queue_node_pointer); \
304 CCC_private_priority_queue_init_node( \
305 private_priority_queue_node_pointer); \
306 {update_closure_over_T} private_priority_queue->root \
307 = CCC_private_priority_queue_merge( \
308 private_priority_queue, private_priority_queue->root, \
309 private_priority_queue_node_pointer); \
316#define CCC_private_priority_queue_increase_with( \
317 priority_queue_pointer, type_pointer, increase_closure_over_T...) \
319 struct CCC_Priority_queue *const private_priority_queue \
320 = (priority_queue_pointer); \
321 typeof(*type_pointer) *T = (type_pointer); \
322 if (private_priority_queue && T) \
324 struct CCC_Priority_queue_node *const \
325 private_priority_queue_node_pointer \
326 = CCC_private_priority_queue_node_in(private_priority_queue, \
328 if (private_priority_queue->order == CCC_ORDER_GREATER) \
330 CCC_private_priority_queue_cut_child( \
331 private_priority_queue_node_pointer); \
335 private_priority_queue->root \
336 = CCC_private_priority_queue_delete_node( \
337 private_priority_queue, \
338 private_priority_queue_node_pointer); \
339 CCC_private_priority_queue_init_node( \
340 private_priority_queue_node_pointer); \
342 {increase_closure_over_T} private_priority_queue->root \
343 = CCC_private_priority_queue_merge( \
344 private_priority_queue, private_priority_queue->root, \
345 private_priority_queue_node_pointer); \
351#define CCC_private_priority_queue_decrease_with( \
352 priority_queue_pointer, type_pointer, decrease_closure_over_T...) \
354 struct CCC_Priority_queue *const private_priority_queue \
355 = (priority_queue_pointer); \
356 typeof(*type_pointer) *T = (type_pointer); \
357 if (private_priority_queue && T) \
359 struct CCC_Priority_queue_node *const \
360 private_priority_queue_node_pointer \
361 = CCC_private_priority_queue_node_in(private_priority_queue, \
363 if (private_priority_queue->order == CCC_ORDER_LESSER) \
365 CCC_private_priority_queue_cut_child( \
366 private_priority_queue_node_pointer); \
370 private_priority_queue->root \
371 = CCC_private_priority_queue_delete_node( \
372 private_priority_queue, \
373 private_priority_queue_node_pointer); \
374 CCC_private_priority_queue_init_node( \
375 private_priority_queue_node_pointer); \
377 {decrease_closure_over_T} private_priority_queue->root \
378 = CCC_private_priority_queue_merge( \
379 private_priority_queue, private_priority_queue->root, \
380 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