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