C Container Collection (CCC)
Loading...
Searching...
No Matches
private_priority_queue.h
Go to the documentation of this file.
1
29#ifndef CCC_PRIVATE_PRIORITY_QUEUE_H
30#define CCC_PRIVATE_PRIORITY_QUEUE_H
31
33#include <stddef.h>
36#include "../../types.h" /* IWYU pragma: keep */
37
38/* NOLINTBEGIN(readability-identifier-naming) */
39
55};
56
102 size_t count;
114};
115
116/*========================= Private Interface ==========================*/
117
121);
124 struct CCC_Priority_queue const *, void const *
125);
129);
133);
137);
138
139/*========================= Macro Implementations ======================*/
140
142#define CCC_private_priority_queue_for( \
143 private_struct_name, \
144 private_type_intruder_field, \
145 private_priority_queue_order, \
146 private_comparator... \
147) \
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), \
156 }
157
159#define CCC_private_priority_queue_default( \
160 private_struct_name, \
161 private_type_intruder_field, \
162 private_priority_queue_order, \
163 private_comparator \
164) \
165 CCC_private_priority_queue_for( \
166 private_struct_name, \
167 private_type_intruder_field, \
168 private_priority_queue_order, \
169 private_comparator \
170 )
171
173#define CCC_private_priority_queue_from( \
174 private_type_intruder_field, \
175 private_priority_queue_order, \
176 private_comparator, \
177 private_allocator, \
178 private_destructor, \
179 private_compound_literal_array... \
180) \
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, \
190 private_comparator \
191 ); \
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; \
199 ++private_i) { \
200 typeof(*private_priority_queue_type_array) *const \
201 private_new_node \
202 = private_priority_queue_allocator->allocate(( \
203 CCC_Allocator_arguments \
204 ){ \
205 .input = NULL, \
206 .bytes = private_priority_queue.sizeof_type, \
207 .alignment = private_priority_queue.alignof_type, \
208 .context = private_priority_queue_allocator->context, \
209 }); \
210 if (!private_new_node) { \
211 CCC_priority_queue_clear( \
212 &private_priority_queue, \
213 &private_destructor, \
214 private_priority_queue_allocator \
215 ); \
216 break; \
217 } \
218 *private_new_node \
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 \
224 ) \
225 ); \
226 } \
227 } \
228 private_priority_queue; \
229 }))}.private
230
232#define CCC_private_priority_queue_emplace( \
233 priority_queue_pointer, \
234 private_allocator_pointer, \
235 type_compound_literal... \
236) \
237 (__extension__({ \
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; \
247 } else { \
248 private_priority_queue_res \
249 = private_priority_queue_allocator->allocate(( \
250 CCC_Allocator_arguments \
251 ){ \
252 .input = NULL, \
253 .bytes = private_priority_queue->sizeof_type, \
254 .alignment = private_priority_queue->alignof_type, \
255 .context = private_priority_queue_allocator->context, \
256 }); \
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 \
263 ) \
264 ); \
265 } \
266 } \
267 } \
268 private_priority_queue_res; \
269 }))
270
272#define CCC_private_priority_queue_update_with( \
273 priority_queue_pointer, \
274 private_closure_parameter, \
275 private_update_closure_over_closure_parameter... \
276) \
277 (__extension__({ \
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 \
290 ); \
291 {private_update_closure_over_closure_parameter}; \
292 CCC_private_priority_queue_update_fixup( \
293 private_priority_queue, private_priority_queue_node_pointer \
294 ); \
295 } \
296 private_priority_queue_updated_element; \
297 }))
298
300#define CCC_private_priority_queue_increase_with( \
301 priority_queue_pointer, \
302 private_closure_parameter, \
303 private_increase_closure_over_closure_parameter... \
304) \
305 (__extension__({ \
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 \
318 ); \
319 {private_increase_closure_over_closure_parameter}; \
320 CCC_private_priority_queue_increase_fixup( \
321 private_priority_queue, private_priority_queue_node_pointer \
322 ); \
323 } \
324 private_priority_queue_updated_element; \
325 }))
326
328#define CCC_private_priority_queue_decrease_with( \
329 priority_queue_pointer, \
330 private_closure_parameter, \
331 private_decrease_closure_over_closure_parameter... \
332) \
333 (__extension__({ \
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 \
346 ); \
347 {private_decrease_closure_over_closure_parameter}; \
348 CCC_private_priority_queue_decrease_fixup( \
349 private_priority_queue, private_priority_queue_node_pointer \
350 ); \
351 } \
352 private_priority_queue_updated_element; \
353 }))
354
355/* NOLINTEND(readability-identifier-naming) */
356
357#endif /* CCC_PRIVATE_PRIORITY_QUEUE_H */
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