16#ifndef CCC_PRIVATE_PRIORITY_QUEUE_H
17#define CCC_PRIVATE_PRIORITY_QUEUE_H
104void CCC_private_priority_queue_push(
112void CCC_private_priority_queue_update_fixup(
116void CCC_private_priority_queue_increase_fixup(
120void CCC_private_priority_queue_decrease_fixup(
127#define CCC_private_priority_queue_for( \
128 private_struct_name, \
129 private_type_intruder_field, \
130 private_priority_queue_order, \
131 private_comparator... \
133 (struct CCC_Priority_queue) { \
134 .root = NULL, .count = 0, \
135 .type_intruder_offset \
136 = offsetof(private_struct_name, private_type_intruder_field), \
137 .sizeof_type = sizeof(private_struct_name), \
138 .order = (private_priority_queue_order), \
139 .comparator = (private_comparator), \
142#define CCC_private_priority_queue_default( \
143 private_struct_name, \
144 private_type_intruder_field, \
145 private_priority_queue_order, \
148 CCC_private_priority_queue_for( \
149 private_struct_name, \
150 private_type_intruder_field, \
151 private_priority_queue_order, \
156#define CCC_private_priority_queue_from( \
157 private_type_intruder_field, \
158 private_priority_queue_order, \
159 private_comparator, \
161 private_destructor, \
162 private_compound_literal_array... \
164 (struct { struct CCC_Priority_queue private; }){(__extension__({ \
165 typeof(*private_compound_literal_array) \
166 *private_priority_queue_type_array \
167 = private_compound_literal_array; \
168 struct CCC_Priority_queue private_priority_queue \
169 = CCC_private_priority_queue_for( \
170 typeof(*private_priority_queue_type_array), \
171 private_type_intruder_field, \
172 private_priority_queue_order, \
175 CCC_Allocator const *const private_priority_queue_allocator \
176 = &(private_allocator); \
177 if (private_priority_queue_allocator->allocate) { \
178 size_t const private_count \
179 = sizeof(private_compound_literal_array) \
180 / sizeof(*private_priority_queue_type_array); \
181 for (size_t private_i = 0; private_i < private_count; \
183 typeof(*private_priority_queue_type_array) *const \
185 = private_priority_queue_allocator->allocate(( \
186 CCC_Allocator_arguments \
189 .bytes = private_priority_queue.sizeof_type, \
190 .context = private_priority_queue_allocator->context, \
192 if (!private_new_node) { \
193 CCC_priority_queue_clear( \
194 &private_priority_queue, \
195 &private_destructor, \
196 private_priority_queue_allocator \
201 = private_priority_queue_type_array[private_i]; \
202 CCC_private_priority_queue_push( \
203 &private_priority_queue, \
204 CCC_private_priority_queue_node_in( \
205 &private_priority_queue, private_new_node \
210 private_priority_queue; \
214#define CCC_private_priority_queue_emplace( \
215 priority_queue_pointer, \
216 private_allocator_pointer, \
217 type_compound_literal... \
220 typeof(type_compound_literal) *private_priority_queue_res = NULL; \
221 struct CCC_Priority_queue *private_priority_queue \
222 = (priority_queue_pointer); \
223 if (private_priority_queue) { \
224 CCC_Allocator const *const private_priority_queue_allocator \
225 = (private_allocator_pointer); \
226 if (!private_priority_queue_allocator \
227 || private_priority_queue_allocator->allocate) { \
228 private_priority_queue_res = NULL; \
230 private_priority_queue_res \
231 = private_priority_queue_allocator->allocate(( \
232 CCC_Allocator_arguments \
235 .bytes = private_priority_queue->sizeof_type, \
236 .context = private_priority_queue_allocator->context, \
238 if (private_priority_queue_res) { \
239 *private_priority_queue_res = type_compound_literal; \
240 CCC_private_priority_queue_push( \
241 private_priority_queue, \
242 CCC_private_priority_queue_node_in( \
243 private_priority_queue, private_priority_queue_res \
249 private_priority_queue_res; \
253#define CCC_private_priority_queue_update_with( \
254 priority_queue_pointer, \
255 private_closure_parameter, \
256 private_update_closure_over_closure_parameter... \
259 struct CCC_Priority_queue *const private_priority_queue \
260 = (priority_queue_pointer); \
261 typeof(*private_closure_parameter) \
262 *private_priority_queue_updated_element \
263 = (private_closure_parameter); \
264 if (private_priority_queue \
265 && private_priority_queue_updated_element) { \
266 struct CCC_Priority_queue_node *const \
267 private_priority_queue_node_pointer \
268 = CCC_private_priority_queue_node_in( \
269 private_priority_queue, \
270 private_priority_queue_updated_element \
272 {private_update_closure_over_closure_parameter}; \
273 CCC_private_priority_queue_update_fixup( \
274 private_priority_queue, private_priority_queue_node_pointer \
277 private_priority_queue_updated_element; \
281#define CCC_private_priority_queue_increase_with( \
282 priority_queue_pointer, \
283 private_closure_parameter, \
284 private_increase_closure_over_closure_parameter... \
287 struct CCC_Priority_queue *const private_priority_queue \
288 = (priority_queue_pointer); \
289 typeof(*private_closure_parameter) \
290 *private_priority_queue_updated_element \
291 = (private_closure_parameter); \
292 if (private_priority_queue \
293 && private_priority_queue_updated_element) { \
294 struct CCC_Priority_queue_node *const \
295 private_priority_queue_node_pointer \
296 = CCC_private_priority_queue_node_in( \
297 private_priority_queue, \
298 private_priority_queue_updated_element \
300 {private_increase_closure_over_closure_parameter}; \
301 CCC_private_priority_queue_increase_fixup( \
302 private_priority_queue, private_priority_queue_node_pointer \
305 private_priority_queue_updated_element; \
309#define CCC_private_priority_queue_decrease_with( \
310 priority_queue_pointer, \
311 private_closure_parameter, \
312 private_decrease_closure_over_closure_parameter... \
315 struct CCC_Priority_queue *const private_priority_queue \
316 = (priority_queue_pointer); \
317 typeof(*private_closure_parameter) \
318 *private_priority_queue_updated_element \
319 = (private_closure_parameter); \
320 if (private_priority_queue \
321 && private_priority_queue_updated_element) { \
322 struct CCC_Priority_queue_node *const \
323 private_priority_queue_node_pointer \
324 = CCC_private_priority_queue_node_in( \
325 private_priority_queue, \
326 private_priority_queue_updated_element \
328 {private_decrease_closure_over_closure_parameter}; \
329 CCC_private_priority_queue_decrease_fixup( \
330 private_priority_queue, private_priority_queue_node_pointer \
333 private_priority_queue_updated_element; \
The type passed by reference to any container function that may need to compare elements....
Definition: types.h:416
Definition: private_priority_queue.h:33
struct CCC_Priority_queue_node * child
Definition: private_priority_queue.h:35
struct CCC_Priority_queue_node * parent
Definition: private_priority_queue.h:41
struct CCC_Priority_queue_node * prev
Definition: private_priority_queue.h:39
struct CCC_Priority_queue_node * next
Definition: private_priority_queue.h:37
Definition: private_priority_queue.h:85
CCC_Order order
Definition: private_priority_queue.h:96
CCC_Comparator comparator
Definition: private_priority_queue.h:98
struct CCC_Priority_queue_node * root
Definition: private_priority_queue.h:87
size_t count
Definition: private_priority_queue.h:89
size_t sizeof_type
Definition: private_priority_queue.h:93
size_t type_intruder_offset
Definition: private_priority_queue.h:91
CCC_Order
A three-way comparison for comparison functions.
Definition: types.h:214