C Container Collection (CCC)
Loading...
Searching...
No Matches
private_priority_queue.h
1
16#ifndef CCC_PRIVATE_PRIORITY_QUEUE_H
17#define CCC_PRIVATE_PRIORITY_QUEUE_H
18
20#include <stddef.h>
23#include "../types.h"
24
25/* NOLINTBEGIN(readability-identifier-naming) */
26
42};
43
89 size_t count;
99};
100
101/*========================= Private Interface ==========================*/
102
104void CCC_private_priority_queue_push(
106);
108struct CCC_Priority_queue_node *CCC_private_priority_queue_node_in(
109 struct CCC_Priority_queue const *, void const *
110);
112void CCC_private_priority_queue_update_fixup(
114);
116void CCC_private_priority_queue_increase_fixup(
118);
120void CCC_private_priority_queue_decrease_fixup(
122);
123
124/*========================= Macro Implementations ======================*/
125
127#define CCC_private_priority_queue_for( \
128 private_struct_name, \
129 private_type_intruder_field, \
130 private_priority_queue_order, \
131 private_comparator... \
132) \
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), \
140 }
141
142#define CCC_private_priority_queue_default( \
143 private_struct_name, \
144 private_type_intruder_field, \
145 private_priority_queue_order, \
146 private_comparator \
147) \
148 CCC_private_priority_queue_for( \
149 private_struct_name, \
150 private_type_intruder_field, \
151 private_priority_queue_order, \
152 private_comparator \
153 )
154
156#define CCC_private_priority_queue_from( \
157 private_type_intruder_field, \
158 private_priority_queue_order, \
159 private_comparator, \
160 private_allocator, \
161 private_destructor, \
162 private_compound_literal_array... \
163) \
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, \
173 private_comparator \
174 ); \
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; \
182 ++private_i) { \
183 typeof(*private_priority_queue_type_array) *const \
184 private_new_node \
185 = private_priority_queue_allocator->allocate(( \
186 CCC_Allocator_arguments \
187 ){ \
188 .input = NULL, \
189 .bytes = private_priority_queue.sizeof_type, \
190 .context = private_priority_queue_allocator->context, \
191 }); \
192 if (!private_new_node) { \
193 CCC_priority_queue_clear( \
194 &private_priority_queue, \
195 &private_destructor, \
196 private_priority_queue_allocator \
197 ); \
198 break; \
199 } \
200 *private_new_node \
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 \
206 ) \
207 ); \
208 } \
209 } \
210 private_priority_queue; \
211 }))}.private
212
214#define CCC_private_priority_queue_emplace( \
215 priority_queue_pointer, \
216 private_allocator_pointer, \
217 type_compound_literal... \
218) \
219 (__extension__({ \
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; \
229 } else { \
230 private_priority_queue_res \
231 = private_priority_queue_allocator->allocate(( \
232 CCC_Allocator_arguments \
233 ){ \
234 .input = NULL, \
235 .bytes = private_priority_queue->sizeof_type, \
236 .context = private_priority_queue_allocator->context, \
237 }); \
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 \
244 ) \
245 ); \
246 } \
247 } \
248 } \
249 private_priority_queue_res; \
250 }))
251
253#define CCC_private_priority_queue_update_with( \
254 priority_queue_pointer, \
255 private_closure_parameter, \
256 private_update_closure_over_closure_parameter... \
257) \
258 (__extension__({ \
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 \
271 ); \
272 {private_update_closure_over_closure_parameter}; \
273 CCC_private_priority_queue_update_fixup( \
274 private_priority_queue, private_priority_queue_node_pointer \
275 ); \
276 } \
277 private_priority_queue_updated_element; \
278 }))
279
281#define CCC_private_priority_queue_increase_with( \
282 priority_queue_pointer, \
283 private_closure_parameter, \
284 private_increase_closure_over_closure_parameter... \
285) \
286 (__extension__({ \
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 \
299 ); \
300 {private_increase_closure_over_closure_parameter}; \
301 CCC_private_priority_queue_increase_fixup( \
302 private_priority_queue, private_priority_queue_node_pointer \
303 ); \
304 } \
305 private_priority_queue_updated_element; \
306 }))
307
309#define CCC_private_priority_queue_decrease_with( \
310 priority_queue_pointer, \
311 private_closure_parameter, \
312 private_decrease_closure_over_closure_parameter... \
313) \
314 (__extension__({ \
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 \
327 ); \
328 {private_decrease_closure_over_closure_parameter}; \
329 CCC_private_priority_queue_decrease_fixup( \
330 private_priority_queue, private_priority_queue_node_pointer \
331 ); \
332 } \
333 private_priority_queue_updated_element; \
334 }))
335
336/* NOLINTEND(readability-identifier-naming) */
337
338#endif /* CCC_PRIVATE_PRIORITY_QUEUE_H */
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