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