29#ifndef CCC_PRIVATE_PRIORITY_QUEUE_H
30#define CCC_PRIVATE_PRIORITY_QUEUE_H
36#include "../../types.h"
142#define CCC_private_priority_queue_for( \
143 private_struct_name, \
144 private_type_intruder_field, \
145 private_priority_queue_order, \
146 private_comparator... \
148 (struct CCC_Priority_queue) { \
149 .root = NULL, .count = 0, \
150 .type_intruder_offset \
151 = offsetof(private_struct_name, private_type_intruder_field), \
152 .sizeof_type = sizeof(private_struct_name), \
153 .alignof_type = alignof(private_struct_name), \
154 .order = (private_priority_queue_order), \
155 .comparator = (private_comparator), \
159#define CCC_private_priority_queue_default( \
160 private_struct_name, \
161 private_type_intruder_field, \
162 private_priority_queue_order, \
165 CCC_private_priority_queue_for( \
166 private_struct_name, \
167 private_type_intruder_field, \
168 private_priority_queue_order, \
173#define CCC_private_priority_queue_from( \
174 private_type_intruder_field, \
175 private_priority_queue_order, \
176 private_comparator, \
178 private_destructor, \
179 private_compound_literal_array... \
181 (struct { struct CCC_Priority_queue private; }){(__extension__({ \
182 typeof(*private_compound_literal_array) \
183 *private_priority_queue_type_array \
184 = private_compound_literal_array; \
185 struct CCC_Priority_queue private_priority_queue \
186 = CCC_private_priority_queue_for( \
187 typeof(*private_priority_queue_type_array), \
188 private_type_intruder_field, \
189 private_priority_queue_order, \
192 CCC_Allocator const *const private_priority_queue_allocator \
193 = &(private_allocator); \
194 if (private_priority_queue_allocator->allocate) { \
195 size_t const private_count \
196 = sizeof(private_compound_literal_array) \
197 / sizeof(*private_priority_queue_type_array); \
198 for (size_t private_i = 0; private_i < private_count; \
200 typeof(*private_priority_queue_type_array) *const \
202 = private_priority_queue_allocator->allocate(( \
203 CCC_Allocator_arguments \
206 .bytes = private_priority_queue.sizeof_type, \
207 .alignment = private_priority_queue.alignof_type, \
208 .context = private_priority_queue_allocator->context, \
210 if (!private_new_node) { \
211 CCC_priority_queue_clear( \
212 &private_priority_queue, \
213 &private_destructor, \
214 private_priority_queue_allocator \
219 = private_priority_queue_type_array[private_i]; \
220 CCC_private_priority_queue_push( \
221 &private_priority_queue, \
222 CCC_private_priority_queue_node_in( \
223 &private_priority_queue, private_new_node \
228 private_priority_queue; \
232#define CCC_private_priority_queue_emplace( \
233 priority_queue_pointer, \
234 private_allocator_pointer, \
235 type_compound_literal... \
238 typeof(type_compound_literal) *private_priority_queue_res = NULL; \
239 struct CCC_Priority_queue *private_priority_queue \
240 = (priority_queue_pointer); \
241 if (private_priority_queue) { \
242 CCC_Allocator const *const private_priority_queue_allocator \
243 = (private_allocator_pointer); \
244 if (!private_priority_queue_allocator \
245 || private_priority_queue_allocator->allocate) { \
246 private_priority_queue_res = NULL; \
248 private_priority_queue_res \
249 = private_priority_queue_allocator->allocate(( \
250 CCC_Allocator_arguments \
253 .bytes = private_priority_queue->sizeof_type, \
254 .alignment = private_priority_queue->alignof_type, \
255 .context = private_priority_queue_allocator->context, \
257 if (private_priority_queue_res) { \
258 *private_priority_queue_res = type_compound_literal; \
259 CCC_private_priority_queue_push( \
260 private_priority_queue, \
261 CCC_private_priority_queue_node_in( \
262 private_priority_queue, private_priority_queue_res \
268 private_priority_queue_res; \
272#define CCC_private_priority_queue_update_with( \
273 priority_queue_pointer, \
274 private_closure_parameter, \
275 private_update_closure_over_closure_parameter... \
278 struct CCC_Priority_queue *const private_priority_queue \
279 = (priority_queue_pointer); \
280 typeof(*private_closure_parameter) \
281 *private_priority_queue_updated_element \
282 = (private_closure_parameter); \
283 if (private_priority_queue \
284 && private_priority_queue_updated_element) { \
285 struct CCC_Priority_queue_node *const \
286 private_priority_queue_node_pointer \
287 = CCC_private_priority_queue_node_in( \
288 private_priority_queue, \
289 private_priority_queue_updated_element \
291 {private_update_closure_over_closure_parameter}; \
292 CCC_private_priority_queue_update_fixup( \
293 private_priority_queue, private_priority_queue_node_pointer \
296 private_priority_queue_updated_element; \
300#define CCC_private_priority_queue_increase_with( \
301 priority_queue_pointer, \
302 private_closure_parameter, \
303 private_increase_closure_over_closure_parameter... \
306 struct CCC_Priority_queue *const private_priority_queue \
307 = (priority_queue_pointer); \
308 typeof(*private_closure_parameter) \
309 *private_priority_queue_updated_element \
310 = (private_closure_parameter); \
311 if (private_priority_queue \
312 && private_priority_queue_updated_element) { \
313 struct CCC_Priority_queue_node *const \
314 private_priority_queue_node_pointer \
315 = CCC_private_priority_queue_node_in( \
316 private_priority_queue, \
317 private_priority_queue_updated_element \
319 {private_increase_closure_over_closure_parameter}; \
320 CCC_private_priority_queue_increase_fixup( \
321 private_priority_queue, private_priority_queue_node_pointer \
324 private_priority_queue_updated_element; \
328#define CCC_private_priority_queue_decrease_with( \
329 priority_queue_pointer, \
330 private_closure_parameter, \
331 private_decrease_closure_over_closure_parameter... \
334 struct CCC_Priority_queue *const private_priority_queue \
335 = (priority_queue_pointer); \
336 typeof(*private_closure_parameter) \
337 *private_priority_queue_updated_element \
338 = (private_closure_parameter); \
339 if (private_priority_queue \
340 && private_priority_queue_updated_element) { \
341 struct CCC_Priority_queue_node *const \
342 private_priority_queue_node_pointer \
343 = CCC_private_priority_queue_node_in( \
344 private_priority_queue, \
345 private_priority_queue_updated_element \
347 {private_decrease_closure_over_closure_parameter}; \
348 CCC_private_priority_queue_decrease_fixup( \
349 private_priority_queue, private_priority_queue_node_pointer \
352 private_priority_queue_updated_element; \
void CCC_private_priority_queue_increase_fixup(struct CCC_Priority_queue *, struct CCC_Priority_queue_node *)
void CCC_private_priority_queue_push(struct CCC_Priority_queue *, struct CCC_Priority_queue_node *)
struct CCC_Priority_queue_node * CCC_private_priority_queue_node_in(struct CCC_Priority_queue const *, void const *)
void CCC_private_priority_queue_decrease_fixup(struct CCC_Priority_queue *, struct CCC_Priority_queue_node *)
void CCC_private_priority_queue_update_fixup(struct CCC_Priority_queue *, struct CCC_Priority_queue_node *)
The type passed by reference to any container function that may need to compare elements....
Definition: types.h:424
Definition: private_priority_queue.h:46
struct CCC_Priority_queue_node * child
Definition: private_priority_queue.h:48
struct CCC_Priority_queue_node * parent
Definition: private_priority_queue.h:54
struct CCC_Priority_queue_node * prev
Definition: private_priority_queue.h:52
struct CCC_Priority_queue_node * next
Definition: private_priority_queue.h:50
Definition: private_priority_queue.h:98
size_t alignof_type
Definition: private_priority_queue.h:108
CCC_Order order
Definition: private_priority_queue.h:111
CCC_Comparator comparator
Definition: private_priority_queue.h:113
struct CCC_Priority_queue_node * root
Definition: private_priority_queue.h:100
size_t count
Definition: private_priority_queue.h:102
size_t sizeof_type
Definition: private_priority_queue.h:106
size_t type_intruder_offset
Definition: private_priority_queue.h:104
CCC_Order
A three-way comparison for comparison functions.
Definition: types.h:213