C Container Collection (CCC)
Loading...
Searching...
No Matches
impl_traits.h
1
16#ifndef CCC_IMPL_TRAITS_H
17#define CCC_IMPL_TRAITS_H
18
19/* NOLINTBEGIN */
20#include "../bitset.h"
21#include "../buffer.h"
22#include "../doubly_linked_list.h"
23#include "../flat_double_ended_queue.h"
24#include "../flat_hash_map.h"
25#include "../flat_priority_queue.h"
26#include "../handle_ordered_map.h"
27#include "../handle_realtime_ordered_map.h"
28#include "../ordered_map.h"
29#include "../priority_queue.h"
30#include "../realtime_ordered_map.h"
31#include "../singly_linked_list.h"
32#include "../types.h"
33/* NOLINTEND */
34
35/*==================== Entry/Handle Interface =========================*/
36
37#define ccc_impl_swap_entry(container_ptr, swap_args...) \
38 _Generic((container_ptr), \
39 ccc_flat_hash_map *: ccc_fhm_swap_entry, \
40 ccc_ordered_map *: ccc_om_swap_entry, \
41 ccc_realtime_ordered_map *: ccc_rom_swap_entry)((container_ptr), \
42 swap_args)
43
44#define ccc_impl_swap_entry_r(container_ptr, key_val_container_handle_ptr...) \
45 &(ccc_entry) \
46 { \
47 ccc_impl_swap_entry(container_ptr, key_val_container_handle_ptr).impl \
48 }
49
50#define ccc_impl_swap_handle(container_ptr, swap_args...) \
51 _Generic((container_ptr), \
52 ccc_handle_ordered_map *: ccc_hom_swap_handle, \
53 ccc_handle_realtime_ordered_map \
54 *: ccc_hrm_swap_handle)((container_ptr), swap_args)
55
56#define ccc_impl_swap_handle_r(container_ptr, key_val_container_handle_ptr...) \
57 &(ccc_handle) \
58 { \
59 ccc_impl_swap_handle(container_ptr, key_val_container_handle_ptr).impl \
60 }
61
62#define ccc_impl_try_insert(container_ptr, try_insert_args...) \
63 _Generic((container_ptr), \
64 ccc_handle_ordered_map *: ccc_hom_try_insert, \
65 ccc_handle_realtime_ordered_map *: ccc_hrm_try_insert, \
66 ccc_flat_hash_map *: ccc_fhm_try_insert, \
67 ccc_ordered_map *: ccc_om_try_insert, \
68 ccc_realtime_ordered_map *: ccc_rom_try_insert)((container_ptr), \
69 try_insert_args)
70
71#define ccc_impl_try_insert_r(container_ptr, try_insert_args...) \
72 _Generic((container_ptr), \
73 ccc_handle_ordered_map \
74 *: &(ccc_handle){ccc_hom_try_insert( \
75 (ccc_handle_ordered_map *)container_ptr, \
76 try_insert_args) \
77 .impl}, \
78 ccc_handle_realtime_ordered_map \
79 *: &(ccc_handle){ccc_hrm_try_insert( \
80 (ccc_handle_realtime_ordered_map *) \
81 container_ptr, \
82 try_insert_args) \
83 .impl}, \
84 ccc_flat_hash_map \
85 *: &(ccc_entry){ccc_fhm_try_insert( \
86 (ccc_flat_hash_map *)container_ptr, \
87 try_insert_args) \
88 .impl}, \
89 ccc_ordered_map \
90 *: &( \
91 ccc_entry){ccc_om_try_insert((ccc_ordered_map *)container_ptr, \
92 (ccc_omap_elem *)try_insert_args) \
93 .impl}, \
94 ccc_realtime_ordered_map \
95 *: &(ccc_entry){ \
96 ccc_rom_try_insert((ccc_realtime_ordered_map *)container_ptr, \
97 (ccc_romap_elem *)try_insert_args) \
98 .impl})
99
100#define ccc_impl_insert_or_assign(container_ptr, insert_or_assign_args...) \
101 _Generic((container_ptr), \
102 ccc_handle_ordered_map *: ccc_hom_insert_or_assign, \
103 ccc_handle_realtime_ordered_map *: ccc_hrm_insert_or_assign, \
104 ccc_flat_hash_map *: ccc_fhm_insert_or_assign, \
105 ccc_ordered_map *: ccc_om_insert_or_assign, \
106 ccc_realtime_ordered_map *: ccc_rom_insert_or_assign)( \
107 (container_ptr), insert_or_assign_args)
108
109#define ccc_impl_insert_or_assign_r(container_ptr, insert_or_assign_args...) \
110 _Generic((container_ptr), \
111 ccc_handle_ordered_map \
112 *: &(ccc_handle){ccc_hom_insert_or_assign( \
113 (ccc_handle_ordered_map *)container_ptr, \
114 insert_or_assign_args) \
115 .impl}, \
116 ccc_handle_realtime_ordered_map \
117 *: &(ccc_handle){ccc_hrm_insert_or_assign( \
118 (ccc_handle_realtime_ordered_map *) \
119 container_ptr, \
120 insert_or_assign_args) \
121 .impl}, \
122 ccc_flat_hash_map \
123 *: &(ccc_entry){ccc_fhm_insert_or_assign( \
124 (ccc_flat_hash_map *)container_ptr, \
125 insert_or_assign_args) \
126 .impl}, \
127 ccc_ordered_map \
128 *: &(ccc_entry){ccc_om_insert_or_assign( \
129 (ccc_ordered_map *)container_ptr, \
130 (ccc_omap_elem *)insert_or_assign_args) \
131 .impl}, \
132 ccc_realtime_ordered_map \
133 *: &(ccc_entry){ccc_rom_insert_or_assign( \
134 (ccc_realtime_ordered_map *)container_ptr, \
135 (ccc_romap_elem *)insert_or_assign_args) \
136 .impl})
137
138#define ccc_impl_remove(container_ptr, key_val_container_handle_ptr...) \
139 _Generic((container_ptr), \
140 ccc_handle_ordered_map *: ccc_hom_remove, \
141 ccc_handle_realtime_ordered_map *: ccc_hrm_remove, \
142 ccc_flat_hash_map *: ccc_fhm_remove, \
143 ccc_ordered_map *: ccc_om_remove, \
144 ccc_realtime_ordered_map \
145 *: ccc_rom_remove)((container_ptr), key_val_container_handle_ptr)
146
147#define ccc_impl_remove_r(container_ptr, key_val_container_handle_ptr...) \
148 _Generic((container_ptr), \
149 ccc_handle_ordered_map \
150 *: &(ccc_handle){ccc_hom_remove( \
151 (ccc_handle_ordered_map *)container_ptr, \
152 key_val_container_handle_ptr) \
153 .impl}, \
154 ccc_handle_realtime_ordered_map \
155 *: &( \
156 ccc_handle){ccc_hrm_remove((ccc_handle_realtime_ordered_map *) \
157 container_ptr, \
158 key_val_container_handle_ptr) \
159 .impl}, \
160 ccc_flat_hash_map \
161 *: &(ccc_entry){ccc_fhm_remove((ccc_flat_hash_map *)container_ptr, \
162 key_val_container_handle_ptr) \
163 .impl}, \
164 ccc_ordered_map \
165 *: &(ccc_entry){ccc_om_remove( \
166 (ccc_ordered_map *)container_ptr, \
167 (ccc_omap_elem *)key_val_container_handle_ptr) \
168 .impl}, \
169 ccc_realtime_ordered_map \
170 *: &(ccc_entry){ \
171 ccc_rom_remove((ccc_realtime_ordered_map *)container_ptr, \
172 (ccc_romap_elem *)key_val_container_handle_ptr) \
173 .impl})
174
175#define ccc_impl_remove_entry(container_entry_ptr) \
176 _Generic((container_entry_ptr), \
177 ccc_fhmap_entry *: ccc_fhm_remove_entry, \
178 ccc_omap_entry *: ccc_om_remove_entry, \
179 ccc_romap_entry *: ccc_rom_remove_entry, \
180 ccc_fhmap_entry const *: ccc_fhm_remove_entry, \
181 ccc_omap_entry const *: ccc_om_remove_entry, \
182 ccc_romap_entry const *: ccc_rom_remove_entry)((container_entry_ptr))
183
184#define ccc_impl_remove_entry_r(container_entry_ptr) \
185 &(ccc_entry) \
186 { \
187 ccc_impl_remove_entry(container_entry_ptr).impl \
188 }
189
190#define ccc_impl_remove_handle(container_handle_ptr) \
191 _Generic((container_handle_ptr), \
192 ccc_homap_handle *: ccc_hom_remove_handle, \
193 ccc_homap_handle const *: ccc_hom_remove_handle, \
194 ccc_hromap_handle *: ccc_hrm_remove_handle, \
195 ccc_hromap_handle const *: ccc_hrm_remove_handle)( \
196 (container_handle_ptr))
197
198#define ccc_impl_remove_handle_r(container_handle_ptr) \
199 &(ccc_handle) \
200 { \
201 ccc_impl_remove_handle(container_handle_ptr).impl \
202 }
203
204#define ccc_impl_entry(container_ptr, key_ptr...) \
205 _Generic((container_ptr), \
206 ccc_flat_hash_map *: ccc_fhm_entry, \
207 ccc_flat_hash_map const *: ccc_fhm_entry, \
208 ccc_ordered_map *: ccc_om_entry, \
209 ccc_realtime_ordered_map *: ccc_rom_entry, \
210 ccc_realtime_ordered_map const *: ccc_rom_entry)((container_ptr), \
211 key_ptr)
212
213#define ccc_impl_entry_r(container_ptr, key_ptr...) \
214 _Generic((container_ptr), \
215 ccc_flat_hash_map \
216 *: &(ccc_fhmap_entry){ccc_fhm_entry( \
217 (ccc_flat_hash_map *)(container_ptr), \
218 key_ptr) \
219 .impl}, \
220 ccc_flat_hash_map const *: &( \
221 ccc_fhmap_entry){ccc_fhm_entry( \
222 (ccc_flat_hash_map *)(container_ptr), \
223 key_ptr) \
224 .impl}, \
225 ccc_ordered_map *: &( \
226 ccc_omap_entry){ccc_om_entry( \
227 (ccc_ordered_map *)(container_ptr), \
228 key_ptr) \
229 .impl}, \
230 ccc_realtime_ordered_map *: &( \
231 ccc_romap_entry){ccc_rom_entry((ccc_realtime_ordered_map \
232 *)(container_ptr), \
233 key_ptr) \
234 .impl}, \
235 ccc_realtime_ordered_map const *: &(ccc_romap_entry){ \
236 ccc_rom_entry((ccc_realtime_ordered_map *)(container_ptr), \
237 key_ptr) \
238 .impl})
239
240#define ccc_impl_handle(container_ptr, key_ptr...) \
241 _Generic((container_ptr), \
242 ccc_handle_ordered_map *: ccc_hom_handle, \
243 ccc_handle_realtime_ordered_map *: ccc_hrm_handle, \
244 ccc_handle_realtime_ordered_map const *: ccc_hrm_handle)( \
245 (container_ptr), key_ptr)
246
247#define ccc_impl_handle_r(container_ptr, key_ptr...) \
248 _Generic((container_ptr), \
249 ccc_handle_ordered_map \
250 *: &(ccc_homap_handle){ccc_hom_handle((ccc_handle_ordered_map \
251 *)(container_ptr), \
252 key_ptr) \
253 .impl}, \
254 ccc_handle_realtime_ordered_map \
255 *: &(ccc_hromap_handle){ccc_hrm_handle( \
256 (ccc_handle_realtime_ordered_map \
257 *)(container_ptr), \
258 key_ptr) \
259 .impl}, \
260 ccc_handle_realtime_ordered_map const *: &(ccc_hromap_handle){ \
261 ccc_hrm_handle((ccc_handle_realtime_ordered_map *)(container_ptr), \
262 key_ptr) \
263 .impl})
264
265#define ccc_impl_and_modify(container_entry_ptr, mod_fn) \
266 _Generic((container_entry_ptr), \
267 ccc_fhmap_entry *: ccc_fhm_and_modify, \
268 ccc_omap_entry *: ccc_om_and_modify, \
269 ccc_homap_handle *: ccc_hom_and_modify, \
270 ccc_romap_entry *: ccc_rom_and_modify, \
271 ccc_hromap_handle *: ccc_hrm_and_modify, \
272 ccc_fhmap_entry const *: ccc_fhm_and_modify, \
273 ccc_hromap_handle const *: ccc_hrm_and_modify, \
274 ccc_omap_entry const *: ccc_om_and_modify, \
275 ccc_homap_handle const *: ccc_hom_and_modify, \
276 ccc_romap_entry const *: ccc_rom_and_modify)((container_entry_ptr), \
277 (mod_fn))
278
279#define ccc_impl_and_modify_aux(container_entry_ptr, mod_fn, aux_data_ptr...) \
280 _Generic((container_entry_ptr), \
281 ccc_fhmap_entry *: ccc_fhm_and_modify_aux, \
282 ccc_omap_entry *: ccc_om_and_modify_aux, \
283 ccc_homap_handle *: ccc_hom_and_modify_aux, \
284 ccc_hromap_handle *: ccc_hrm_and_modify_aux, \
285 ccc_romap_entry *: ccc_rom_and_modify_aux, \
286 ccc_fhmap_entry const *: ccc_fhm_and_modify_aux, \
287 ccc_omap_entry const *: ccc_om_and_modify_aux, \
288 ccc_hromap_handle const *: ccc_hrm_and_modify_aux, \
289 ccc_homap_handle const *: ccc_hom_and_modify_aux, \
290 ccc_romap_entry const *: ccc_rom_and_modify_aux)( \
291 (container_entry_ptr), (mod_fn), aux_data_ptr)
292
293#define ccc_impl_insert_entry(container_entry_ptr, \
294 key_val_container_handle_ptr...) \
295 _Generic((container_entry_ptr), \
296 ccc_fhmap_entry *: ccc_fhm_insert_entry, \
297 ccc_omap_entry *: ccc_om_insert_entry, \
298 ccc_romap_entry *: ccc_rom_insert_entry, \
299 ccc_fhmap_entry const *: ccc_fhm_insert_entry, \
300 ccc_omap_entry const *: ccc_om_insert_entry, \
301 ccc_romap_entry const *: ccc_rom_insert_entry)( \
302 (container_entry_ptr), key_val_container_handle_ptr)
303
304#define ccc_impl_insert_handle(container_handle_ptr, \
305 key_val_container_handle_ptr...) \
306 _Generic((container_handle_ptr), \
307 ccc_homap_handle *: ccc_hom_insert_handle, \
308 ccc_homap_handle const *: ccc_hom_insert_handle, \
309 ccc_hromap_handle *: ccc_hrm_insert_handle, \
310 ccc_hromap_handle const *: ccc_hrm_insert_handle)( \
311 (container_handle_ptr), key_val_container_handle_ptr)
312
313#define ccc_impl_or_insert(container_entry_ptr, \
314 key_val_container_handle_ptr...) \
315 _Generic((container_entry_ptr), \
316 ccc_fhmap_entry *: ccc_fhm_or_insert, \
317 ccc_omap_entry *: ccc_om_or_insert, \
318 ccc_homap_handle *: ccc_hom_or_insert, \
319 ccc_romap_entry *: ccc_rom_or_insert, \
320 ccc_hromap_handle *: ccc_hrm_or_insert, \
321 ccc_fhmap_entry const *: ccc_fhm_or_insert, \
322 ccc_omap_entry const *: ccc_om_or_insert, \
323 ccc_hromap_handle const *: ccc_hrm_or_insert, \
324 ccc_homap_handle const *: ccc_hom_or_insert, \
325 ccc_romap_entry const *: ccc_rom_or_insert)( \
326 (container_entry_ptr), key_val_container_handle_ptr)
327
328#define ccc_impl_unwrap(container_entry_ptr) \
329 _Generic((container_entry_ptr), \
330 ccc_entry *: ccc_entry_unwrap, \
331 ccc_entry const *: ccc_entry_unwrap, \
332 ccc_handle *: ccc_handle_unwrap, \
333 ccc_handle const *: ccc_handle_unwrap, \
334 ccc_fhmap_entry *: ccc_fhm_unwrap, \
335 ccc_fhmap_entry const *: ccc_fhm_unwrap, \
336 ccc_omap_entry *: ccc_om_unwrap, \
337 ccc_omap_entry const *: ccc_om_unwrap, \
338 ccc_homap_handle *: ccc_hom_unwrap, \
339 ccc_homap_handle const *: ccc_hom_unwrap, \
340 ccc_hromap_handle *: ccc_hrm_unwrap, \
341 ccc_hromap_handle const *: ccc_hrm_unwrap, \
342 ccc_romap_entry *: ccc_rom_unwrap, \
343 ccc_romap_entry const *: ccc_rom_unwrap)((container_entry_ptr))
344
345#define ccc_impl_occupied(container_entry_ptr) \
346 _Generic((container_entry_ptr), \
347 ccc_entry *: ccc_entry_occupied, \
348 ccc_entry const *: ccc_entry_occupied, \
349 ccc_handle *: ccc_handle_occupied, \
350 ccc_handle const *: ccc_handle_occupied, \
351 ccc_fhmap_entry *: ccc_fhm_occupied, \
352 ccc_fhmap_entry const *: ccc_fhm_occupied, \
353 ccc_omap_entry *: ccc_om_occupied, \
354 ccc_omap_entry const *: ccc_om_occupied, \
355 ccc_homap_handle *: ccc_hom_occupied, \
356 ccc_homap_handle const *: ccc_hom_occupied, \
357 ccc_hromap_handle *: ccc_hrm_occupied, \
358 ccc_hromap_handle const *: ccc_hrm_occupied, \
359 ccc_romap_entry *: ccc_rom_occupied, \
360 ccc_romap_entry const *: ccc_rom_occupied)((container_entry_ptr))
361
362#define ccc_impl_insert_error(container_entry_ptr) \
363 _Generic((container_entry_ptr), \
364 ccc_entry *: ccc_entry_insert_error, \
365 ccc_entry const *: ccc_entry_insert_error, \
366 ccc_handle *: ccc_handle_insert_error, \
367 ccc_handle const *: ccc_handle_insert_error, \
368 ccc_fhmap_entry *: ccc_fhm_insert_error, \
369 ccc_fhmap_entry const *: ccc_fhm_insert_error, \
370 ccc_omap_entry *: ccc_om_insert_error, \
371 ccc_omap_entry const *: ccc_om_insert_error, \
372 ccc_homap_handle *: ccc_hom_insert_error, \
373 ccc_homap_handle const *: ccc_hom_insert_error, \
374 ccc_hromap_handle *: ccc_hrm_insert_error, \
375 ccc_hromap_handle const *: ccc_hrm_insert_error, \
376 ccc_romap_entry *: ccc_rom_insert_error, \
377 ccc_romap_entry const *: ccc_rom_insert_error)((container_entry_ptr))
378
379/*====================== Misc Search Interface ===========================*/
380
381#define ccc_impl_get_key_val(container_ptr, key_ptr...) \
382 _Generic((container_ptr), \
383 ccc_flat_hash_map *: ccc_fhm_get_key_val, \
384 ccc_flat_hash_map const *: ccc_fhm_get_key_val, \
385 ccc_ordered_map *: ccc_om_get_key_val, \
386 ccc_handle_ordered_map *: ccc_hom_get_key_val, \
387 ccc_handle_realtime_ordered_map *: ccc_hrm_get_key_val, \
388 ccc_handle_realtime_ordered_map const *: ccc_hrm_get_key_val, \
389 ccc_realtime_ordered_map *: ccc_rom_get_key_val, \
390 ccc_realtime_ordered_map const *: ccc_rom_get_key_val)( \
391 (container_ptr), key_ptr)
392
393#define ccc_impl_contains(container_ptr, key_ptr...) \
394 _Generic((container_ptr), \
395 ccc_flat_hash_map *: ccc_fhm_contains, \
396 ccc_flat_hash_map const *: ccc_fhm_contains, \
397 ccc_ordered_map *: ccc_om_contains, \
398 ccc_handle_ordered_map *: ccc_hom_contains, \
399 ccc_handle_realtime_ordered_map *: ccc_hrm_contains, \
400 ccc_handle_realtime_ordered_map const *: ccc_hrm_contains, \
401 ccc_realtime_ordered_map *: ccc_rom_contains, \
402 ccc_realtime_ordered_map const *: ccc_rom_contains)((container_ptr), \
403 key_ptr)
404
405/*================ Sequential Containers Interface =====================*/
406
407#define ccc_impl_push(container_ptr, container_handle_ptr...) \
408 _Generic((container_ptr), \
409 ccc_flat_priority_queue *: ccc_fpq_push, \
410 ccc_priority_queue *: ccc_pq_push)((container_ptr), \
411 container_handle_ptr)
412
413#define ccc_impl_push_back(container_ptr, container_handle_ptr...) \
414 _Generic((container_ptr), \
415 ccc_bitset *: ccc_bs_push_back, \
416 ccc_flat_double_ended_queue *: ccc_fdeq_push_back, \
417 ccc_doubly_linked_list *: ccc_dll_push_back, \
418 ccc_buffer *: ccc_buf_push_back)((container_ptr), \
419 container_handle_ptr)
420
421#define ccc_impl_push_front(container_ptr, container_handle_ptr...) \
422 _Generic((container_ptr), \
423 ccc_flat_double_ended_queue *: ccc_fdeq_push_front, \
424 ccc_doubly_linked_list *: ccc_dll_push_front, \
425 ccc_singly_linked_list *: ccc_sll_push_front)((container_ptr), \
426 container_handle_ptr)
427
428#define ccc_impl_pop(container_ptr, ...) \
429 _Generic((container_ptr), \
430 ccc_flat_priority_queue *: ccc_fpq_pop, \
431 ccc_priority_queue \
432 *: ccc_pq_pop)((container_ptr)__VA_OPT__(, __VA_ARGS__))
433
434#define ccc_impl_pop_front(container_ptr) \
435 _Generic((container_ptr), \
436 ccc_flat_double_ended_queue *: ccc_fdeq_pop_front, \
437 ccc_doubly_linked_list *: ccc_dll_pop_front, \
438 ccc_singly_linked_list *: ccc_sll_pop_front)((container_ptr))
439
440#define ccc_impl_pop_back(container_ptr) \
441 _Generic((container_ptr), \
442 ccc_flat_double_ended_queue *: ccc_fdeq_pop_back, \
443 ccc_doubly_linked_list *: ccc_dll_pop_back, \
444 ccc_buffer *: ccc_buf_pop_back)((container_ptr))
445
446#define ccc_impl_front(container_ptr) \
447 _Generic((container_ptr), \
448 ccc_flat_double_ended_queue *: ccc_fdeq_front, \
449 ccc_doubly_linked_list *: ccc_dll_front, \
450 ccc_flat_priority_queue *: ccc_fpq_front, \
451 ccc_priority_queue *: ccc_pq_front, \
452 ccc_singly_linked_list *: ccc_sll_front, \
453 ccc_flat_double_ended_queue const *: ccc_fdeq_front, \
454 ccc_doubly_linked_list const *: ccc_dll_front, \
455 ccc_flat_priority_queue const *: ccc_fpq_front, \
456 ccc_priority_queue const *: ccc_pq_front, \
457 ccc_singly_linked_list const *: ccc_sll_front)((container_ptr))
458
459#define ccc_impl_back(container_ptr) \
460 _Generic((container_ptr), \
461 ccc_flat_double_ended_queue *: ccc_fdeq_back, \
462 ccc_doubly_linked_list *: ccc_dll_back, \
463 ccc_buffer *: ccc_buf_back, \
464 ccc_flat_double_ended_queue const *: ccc_fdeq_back, \
465 ccc_doubly_linked_list const *: ccc_dll_back, \
466 ccc_buffer const *: ccc_buf_back)((container_ptr))
467
468/*================ Priority Queue Update Interface =====================*/
469
470#define ccc_impl_update(container_ptr, update_args...) \
471 _Generic((container_ptr), \
472 ccc_flat_priority_queue *: ccc_fpq_update, \
473 ccc_priority_queue *: ccc_pq_update)((container_ptr), update_args)
474
475#define ccc_impl_increase(container_ptr, increase_args...) \
476 _Generic((container_ptr), \
477 ccc_flat_priority_queue *: ccc_fpq_increase, \
478 ccc_priority_queue *: ccc_pq_increase)((container_ptr), increase_args)
479
480#define ccc_impl_decrease(container_ptr, decrease_args...) \
481 _Generic((container_ptr), \
482 ccc_flat_priority_queue *: ccc_fpq_decrease, \
483 ccc_priority_queue *: ccc_pq_decrease)((container_ptr), decrease_args)
484
485#define ccc_impl_extract(container_ptr, container_handle_ptr...) \
486 _Generic((container_ptr), \
487 ccc_doubly_linked_list *: ccc_dll_extract, \
488 ccc_singly_linked_list *: ccc_sll_extract, \
489 ccc_priority_queue *: ccc_pq_extract)((container_ptr), \
490 container_handle_ptr)
491
492#define ccc_impl_erase(container_ptr, container_handle_ptr...) \
493 _Generic((container_ptr), ccc_flat_priority_queue *: ccc_fpq_erase)( \
494 (container_ptr), container_handle_ptr)
495
496#define ccc_impl_extract_range(container_ptr, \
497 container_handle_begin_end_ptr...) \
498 _Generic((container_ptr), \
499 ccc_doubly_linked_list *: ccc_dll_extract_range, \
500 ccc_singly_linked_list *: ccc_sll_extract_range)( \
501 (container_ptr), container_handle_begin_end_ptr)
502
503/*=================== Iterators Interface ==============================*/
504
505#define ccc_impl_begin(container_ptr) \
506 _Generic((container_ptr), \
507 ccc_buffer *: ccc_buf_begin, \
508 ccc_flat_hash_map *: ccc_fhm_begin, \
509 ccc_ordered_map *: ccc_om_begin, \
510 ccc_handle_ordered_map *: ccc_hom_begin, \
511 ccc_flat_double_ended_queue *: ccc_fdeq_begin, \
512 ccc_singly_linked_list *: ccc_sll_begin, \
513 ccc_doubly_linked_list *: ccc_dll_begin, \
514 ccc_realtime_ordered_map *: ccc_rom_begin, \
515 ccc_handle_realtime_ordered_map *: ccc_hrm_begin, \
516 ccc_buffer const *: ccc_buf_begin, \
517 ccc_flat_hash_map const *: ccc_fhm_begin, \
518 ccc_ordered_map const *: ccc_om_begin, \
519 ccc_handle_ordered_map const *: ccc_hom_begin, \
520 ccc_flat_double_ended_queue const *: ccc_fdeq_begin, \
521 ccc_singly_linked_list const *: ccc_sll_begin, \
522 ccc_doubly_linked_list const *: ccc_dll_begin, \
523 ccc_handle_realtime_ordered_map const *: ccc_hrm_begin, \
524 ccc_realtime_ordered_map const *: ccc_rom_begin)((container_ptr))
525
526#define ccc_impl_rbegin(container_ptr) \
527 _Generic((container_ptr), \
528 ccc_buffer *: ccc_buf_rbegin, \
529 ccc_ordered_map *: ccc_om_rbegin, \
530 ccc_handle_ordered_map *: ccc_hom_rbegin, \
531 ccc_flat_double_ended_queue *: ccc_fdeq_rbegin, \
532 ccc_doubly_linked_list *: ccc_dll_rbegin, \
533 ccc_realtime_ordered_map *: ccc_rom_rbegin, \
534 ccc_handle_realtime_ordered_map *: ccc_hrm_rbegin, \
535 ccc_buffer const *: ccc_buf_rbegin, \
536 ccc_ordered_map const *: ccc_om_rbegin, \
537 ccc_handle_ordered_map const *: ccc_hom_rbegin, \
538 ccc_flat_double_ended_queue const *: ccc_fdeq_rbegin, \
539 ccc_doubly_linked_list const *: ccc_dll_rbegin, \
540 ccc_handle_realtime_ordered_map const *: ccc_hrm_rbegin, \
541 ccc_realtime_ordered_map const *: ccc_rom_rbegin)((container_ptr))
542
543#define ccc_impl_next(container_ptr, void_iter_ptr) \
544 _Generic((container_ptr), \
545 ccc_buffer *: ccc_buf_next, \
546 ccc_flat_hash_map *: ccc_fhm_next, \
547 ccc_ordered_map *: ccc_om_next, \
548 ccc_handle_ordered_map *: ccc_hom_next, \
549 ccc_flat_double_ended_queue *: ccc_fdeq_next, \
550 ccc_singly_linked_list *: ccc_sll_next, \
551 ccc_doubly_linked_list *: ccc_dll_next, \
552 ccc_realtime_ordered_map *: ccc_rom_next, \
553 ccc_handle_realtime_ordered_map *: ccc_hrm_next, \
554 ccc_buffer const *: ccc_buf_next, \
555 ccc_flat_hash_map const *: ccc_fhm_next, \
556 ccc_ordered_map const *: ccc_om_next, \
557 ccc_handle_ordered_map const *: ccc_hom_next, \
558 ccc_flat_double_ended_queue const *: ccc_fdeq_next, \
559 ccc_singly_linked_list const *: ccc_sll_next, \
560 ccc_doubly_linked_list const *: ccc_dll_next, \
561 ccc_handle_realtime_ordered_map const *: ccc_hrm_next, \
562 ccc_realtime_ordered_map const *: ccc_rom_next)((container_ptr), \
563 (void_iter_ptr))
564
565#define ccc_impl_rnext(container_ptr, void_iter_ptr) \
566 _Generic((container_ptr), \
567 ccc_buffer *: ccc_buf_rnext, \
568 ccc_ordered_map *: ccc_om_rnext, \
569 ccc_handle_ordered_map *: ccc_hom_rnext, \
570 ccc_flat_double_ended_queue *: ccc_fdeq_rnext, \
571 ccc_doubly_linked_list *: ccc_dll_rnext, \
572 ccc_realtime_ordered_map *: ccc_rom_rnext, \
573 ccc_handle_realtime_ordered_map *: ccc_hrm_rnext, \
574 ccc_buffer const *: ccc_buf_rnext, \
575 ccc_ordered_map const *: ccc_om_rnext, \
576 ccc_handle_ordered_map const *: ccc_hom_rnext, \
577 ccc_flat_double_ended_queue const *: ccc_fdeq_rnext, \
578 ccc_doubly_linked_list const *: ccc_dll_rnext, \
579 ccc_handle_realtime_ordered_map const *: ccc_hrm_rnext, \
580 ccc_realtime_ordered_map const *: ccc_rom_rnext)((container_ptr), \
581 (void_iter_ptr))
582
583#define ccc_impl_end(container_ptr) \
584 _Generic((container_ptr), \
585 ccc_buffer *: ccc_buf_end, \
586 ccc_flat_hash_map *: ccc_fhm_end, \
587 ccc_ordered_map *: ccc_om_end, \
588 ccc_handle_ordered_map *: ccc_hom_end, \
589 ccc_flat_double_ended_queue *: ccc_fdeq_end, \
590 ccc_singly_linked_list *: ccc_sll_end, \
591 ccc_doubly_linked_list *: ccc_dll_end, \
592 ccc_realtime_ordered_map *: ccc_rom_end, \
593 ccc_handle_realtime_ordered_map *: ccc_hrm_end, \
594 ccc_buffer const *: ccc_buf_end, \
595 ccc_flat_hash_map const *: ccc_fhm_end, \
596 ccc_ordered_map const *: ccc_om_end, \
597 ccc_handle_ordered_map const *: ccc_hom_end, \
598 ccc_flat_double_ended_queue const *: ccc_fdeq_end, \
599 ccc_singly_linked_list const *: ccc_sll_end, \
600 ccc_doubly_linked_list const *: ccc_dll_end, \
601 ccc_handle_realtime_ordered_map const *: ccc_hrm_end, \
602 ccc_realtime_ordered_map const *: ccc_rom_end)((container_ptr))
603
604#define ccc_impl_rend(container_ptr) \
605 _Generic((container_ptr), \
606 ccc_buffer *: ccc_buf_rend, \
607 ccc_ordered_map *: ccc_om_rend, \
608 ccc_handle_ordered_map *: ccc_hom_rend, \
609 ccc_flat_double_ended_queue *: ccc_fdeq_rend, \
610 ccc_doubly_linked_list *: ccc_dll_rend, \
611 ccc_realtime_ordered_map *: ccc_rom_rend, \
612 ccc_handle_realtime_ordered_map *: ccc_hrm_rend, \
613 ccc_buffer const *: ccc_buf_rend, \
614 ccc_ordered_map const *: ccc_om_rend, \
615 ccc_handle_ordered_map const *: ccc_hom_rend, \
616 ccc_flat_double_ended_queue const *: ccc_fdeq_rend, \
617 ccc_doubly_linked_list const *: ccc_dll_rend, \
618 ccc_handle_realtime_ordered_map const *: ccc_hrm_rend, \
619 ccc_realtime_ordered_map const *: ccc_rom_rend)((container_ptr))
620
621#define ccc_impl_equal_range(container_ptr, begin_and_end_key_ptr...) \
622 _Generic((container_ptr), \
623 ccc_ordered_map *: ccc_om_equal_range, \
624 ccc_handle_ordered_map *: ccc_hom_equal_range, \
625 ccc_handle_realtime_ordered_map *: ccc_hrm_equal_range, \
626 ccc_handle_realtime_ordered_map const *: ccc_hrm_equal_range, \
627 ccc_realtime_ordered_map *: ccc_rom_equal_range, \
628 ccc_realtime_ordered_map const *: ccc_rom_equal_range)( \
629 (container_ptr), begin_and_end_key_ptr)
630
631#define ccc_impl_equal_range_r(container_ptr, begin_and_end_key_ptr...) \
632 &(ccc_range) \
633 { \
634 ccc_impl_equal_range(container_ptr, begin_and_end_key_ptr).impl \
635 }
636
637#define ccc_impl_equal_rrange(container_ptr, rbegin_and_rend_key_ptr...) \
638 _Generic((container_ptr), \
639 ccc_ordered_map *: ccc_om_equal_rrange, \
640 ccc_handle_ordered_map *: ccc_hom_equal_rrange, \
641 ccc_handle_realtime_ordered_map *: ccc_hrm_equal_rrange, \
642 ccc_handle_realtime_ordered_map const *: ccc_hrm_equal_rrange, \
643 ccc_realtime_ordered_map *: ccc_rom_equal_rrange, \
644 ccc_realtime_ordered_map const *: ccc_rom_equal_rrange)( \
645 (container_ptr), rbegin_and_rend_key_ptr)
646
647#define ccc_impl_equal_rrange_r(container_ptr, rbegin_and_rend_key_ptr...) \
648 &(ccc_rrange) \
649 { \
650 ccc_impl_equal_rrange(container_ptr, rbegin_and_rend_key_ptr).impl \
651 }
652
653#define ccc_impl_splice(container_ptr, splice_args...) \
654 _Generic((container_ptr), \
655 ccc_singly_linked_list *: ccc_sll_splice, \
656 ccc_singly_linked_list const *: ccc_sll_splice, \
657 ccc_doubly_linked_list *: ccc_dll_splice, \
658 ccc_doubly_linked_list const *: ccc_dll_splice)((container_ptr), \
659 splice_args)
660
661#define ccc_impl_splice_range(container_ptr, splice_range_args...) \
662 _Generic((container_ptr), \
663 ccc_singly_linked_list *: ccc_sll_splice_range, \
664 ccc_singly_linked_list const *: ccc_sll_splice_range, \
665 ccc_doubly_linked_list *: ccc_dll_splice_range, \
666 ccc_doubly_linked_list const *: ccc_dll_splice_range)( \
667 (container_ptr), splice_range_args)
668
669/*=================== Memory Management =======================*/
670
671#define ccc_impl_copy(dst_container_ptr, src_container_ptr, alloc_fn_ptr) \
672 _Generic((dst_container_ptr), \
673 ccc_bitset *: ccc_bs_copy, \
674 ccc_flat_hash_map *: ccc_fhm_copy, \
675 ccc_handle_ordered_map *: ccc_hom_copy, \
676 ccc_flat_priority_queue *: ccc_fpq_copy, \
677 ccc_flat_double_ended_queue *: ccc_fdeq_copy, \
678 ccc_handle_realtime_ordered_map *: ccc_hrm_copy)( \
679 (dst_container_ptr), (src_container_ptr), (alloc_fn_ptr))
680
681#define ccc_impl_reserve(container_ptr, n_to_add, alloc_fn_ptr) \
682 _Generic((container_ptr), \
683 ccc_bitset *: ccc_bs_reserve, \
684 ccc_buffer *: ccc_buf_reserve, \
685 ccc_flat_hash_map *: ccc_fhm_reserve, \
686 ccc_handle_ordered_map *: ccc_hom_reserve, \
687 ccc_flat_priority_queue *: ccc_fpq_reserve, \
688 ccc_flat_double_ended_queue *: ccc_fdeq_reserve, \
689 ccc_handle_realtime_ordered_map \
690 *: ccc_hrm_reserve)((container_ptr), (n_to_add), (alloc_fn_ptr))
691
692#define ccc_impl_clear(container_ptr, ...) \
693 _Generic((container_ptr), \
694 ccc_bitset *: ccc_bs_clear, \
695 ccc_buffer *: ccc_buf_clear, \
696 ccc_flat_hash_map *: ccc_fhm_clear, \
697 ccc_handle_ordered_map *: ccc_hom_clear, \
698 ccc_flat_priority_queue *: ccc_fpq_clear, \
699 ccc_flat_double_ended_queue *: ccc_fdeq_clear, \
700 ccc_singly_linked_list *: ccc_sll_clear, \
701 ccc_doubly_linked_list *: ccc_dll_clear, \
702 ccc_ordered_map *: ccc_om_clear, \
703 ccc_priority_queue *: ccc_pq_clear, \
704 ccc_realtime_ordered_map *: ccc_rom_clear, \
705 ccc_handle_realtime_ordered_map \
706 *: ccc_hrm_clear)((container_ptr)__VA_OPT__(, __VA_ARGS__))
707
708#define ccc_impl_clear_and_free(container_ptr, ...) \
709 _Generic((container_ptr), \
710 ccc_bitset *: ccc_bs_clear_and_free, \
711 ccc_buffer *: ccc_buf_clear_and_free, \
712 ccc_flat_hash_map *: ccc_fhm_clear_and_free, \
713 ccc_handle_ordered_map *: ccc_hom_clear_and_free, \
714 ccc_flat_priority_queue *: ccc_fpq_clear_and_free, \
715 ccc_flat_double_ended_queue *: ccc_fdeq_clear_and_free, \
716 ccc_handle_realtime_ordered_map *: ccc_hrm_clear_and_free)( \
717 (container_ptr)__VA_OPT__(, __VA_ARGS__))
718
719#define ccc_impl_clear_and_free_reserve(container_ptr, \
720 destructor_and_free_args...) \
721 _Generic((container_ptr), \
722 ccc_bitset *: ccc_bs_clear_and_free_reserve, \
723 ccc_buffer *: ccc_buf_clear_and_free_reserve, \
724 ccc_flat_hash_map *: ccc_fhm_clear_and_free_reserve, \
725 ccc_handle_ordered_map *: ccc_hom_clear_and_free_reserve, \
726 ccc_flat_priority_queue *: ccc_fpq_clear_and_free_reserve, \
727 ccc_flat_double_ended_queue *: ccc_fdeq_clear_and_free_reserve, \
728 ccc_handle_realtime_ordered_map *: ccc_hrm_clear_and_free_reserve)( \
729 (container_ptr), destructor_and_free_args)
730
731/*=================== Standard Getters Interface =======================*/
732
733#define ccc_impl_count(container_ptr) \
734 _Generic((container_ptr), \
735 ccc_bitset *: ccc_bs_count, \
736 ccc_buffer *: ccc_buf_count, \
737 ccc_flat_hash_map *: ccc_fhm_count, \
738 ccc_ordered_map *: ccc_om_count, \
739 ccc_handle_ordered_map *: ccc_hom_count, \
740 ccc_flat_priority_queue *: ccc_fpq_count, \
741 ccc_flat_double_ended_queue *: ccc_fdeq_count, \
742 ccc_priority_queue *: ccc_pq_count, \
743 ccc_singly_linked_list *: ccc_sll_count, \
744 ccc_doubly_linked_list *: ccc_dll_count, \
745 ccc_realtime_ordered_map *: ccc_rom_count, \
746 ccc_handle_realtime_ordered_map *: ccc_hrm_count, \
747 ccc_buffer const *: ccc_buf_count, \
748 ccc_flat_hash_map const *: ccc_fhm_count, \
749 ccc_ordered_map const *: ccc_om_count, \
750 ccc_handle_ordered_map const *: ccc_hom_count, \
751 ccc_flat_priority_queue const *: ccc_fpq_count, \
752 ccc_flat_double_ended_queue const *: ccc_fdeq_count, \
753 ccc_priority_queue const *: ccc_pq_count, \
754 ccc_singly_linked_list const *: ccc_sll_count, \
755 ccc_doubly_linked_list const *: ccc_dll_count, \
756 ccc_handle_realtime_ordered_map const *: ccc_hrm_count, \
757 ccc_realtime_ordered_map const *: ccc_rom_count)((container_ptr))
758
759#define ccc_impl_capacity(container_ptr) \
760 _Generic((container_ptr), \
761 ccc_bitset *: ccc_bs_capacity, \
762 ccc_buffer *: ccc_buf_capacity, \
763 ccc_flat_hash_map *: ccc_fhm_capacity, \
764 ccc_handle_ordered_map *: ccc_hom_capacity, \
765 ccc_flat_priority_queue *: ccc_fpq_capacity, \
766 ccc_flat_double_ended_queue *: ccc_fdeq_capacity, \
767 ccc_handle_realtime_ordered_map *: ccc_hrm_capacity, \
768 ccc_bitset const *: ccc_bs_capacity, \
769 ccc_buffer const *: ccc_buf_capacity, \
770 ccc_flat_hash_map const *: ccc_fhm_capacity, \
771 ccc_handle_ordered_map const *: ccc_hom_capacity, \
772 ccc_flat_priority_queue const *: ccc_fpq_capacity, \
773 ccc_flat_double_ended_queue const *: ccc_fdeq_capacity, \
774 ccc_handle_realtime_ordered_map const *: ccc_hrm_capacity)( \
775 (container_ptr))
776
777#define ccc_impl_is_empty(container_ptr) \
778 _Generic((container_ptr), \
779 ccc_buffer *: ccc_buf_is_empty, \
780 ccc_flat_hash_map *: ccc_fhm_is_empty, \
781 ccc_ordered_map *: ccc_om_is_empty, \
782 ccc_handle_ordered_map *: ccc_hom_is_empty, \
783 ccc_flat_priority_queue *: ccc_fpq_is_empty, \
784 ccc_flat_double_ended_queue *: ccc_fdeq_is_empty, \
785 ccc_priority_queue *: ccc_pq_is_empty, \
786 ccc_singly_linked_list *: ccc_sll_is_empty, \
787 ccc_doubly_linked_list *: ccc_dll_is_empty, \
788 ccc_realtime_ordered_map *: ccc_rom_is_empty, \
789 ccc_handle_realtime_ordered_map *: ccc_hrm_is_empty, \
790 ccc_buffer const *: ccc_buf_is_empty, \
791 ccc_flat_hash_map const *: ccc_fhm_is_empty, \
792 ccc_ordered_map const *: ccc_om_is_empty, \
793 ccc_handle_ordered_map const *: ccc_hom_is_empty, \
794 ccc_flat_priority_queue const *: ccc_fpq_is_empty, \
795 ccc_flat_double_ended_queue const *: ccc_fdeq_is_empty, \
796 ccc_priority_queue const *: ccc_pq_is_empty, \
797 ccc_singly_linked_list const *: ccc_sll_is_empty, \
798 ccc_doubly_linked_list const *: ccc_dll_is_empty, \
799 ccc_handle_realtime_ordered_map const *: ccc_hrm_is_empty, \
800 ccc_realtime_ordered_map const *: ccc_rom_is_empty)((container_ptr))
801
802#define ccc_impl_validate(container_ptr) \
803 _Generic((container_ptr), \
804 ccc_flat_hash_map *: ccc_fhm_validate, \
805 ccc_ordered_map *: ccc_om_validate, \
806 ccc_handle_ordered_map *: ccc_hom_validate, \
807 ccc_flat_priority_queue *: ccc_fpq_validate, \
808 ccc_flat_double_ended_queue *: ccc_fdeq_validate, \
809 ccc_priority_queue *: ccc_pq_validate, \
810 ccc_singly_linked_list *: ccc_sll_validate, \
811 ccc_doubly_linked_list *: ccc_dll_validate, \
812 ccc_realtime_ordered_map *: ccc_rom_validate, \
813 ccc_handle_realtime_ordered_map *: ccc_hrm_validate, \
814 ccc_flat_hash_map const *: ccc_fhm_validate, \
815 ccc_ordered_map const *: ccc_om_validate, \
816 ccc_handle_ordered_map const *: ccc_hom_validate, \
817 ccc_flat_priority_queue const *: ccc_fpq_validate, \
818 ccc_flat_double_ended_queue const *: ccc_fdeq_validate, \
819 ccc_priority_queue const *: ccc_pq_validate, \
820 ccc_singly_linked_list const *: ccc_sll_validate, \
821 ccc_doubly_linked_list const *: ccc_dll_validate, \
822 ccc_handle_realtime_ordered_map const *: ccc_hrm_validate, \
823 ccc_realtime_ordered_map const *: ccc_rom_validate)((container_ptr))
824
825#endif /* CCC_IMPL_TRAITS_H */