C Container Collection (CCC)
Loading...
Searching...
No Matches
private_traits.h
1
16#ifndef CCC_PRIVATE_TRAITS_H
17#define CCC_PRIVATE_TRAITS_H
18
19/* NOLINTBEGIN */
20#include "../adaptive_map.h" /* IWYU pragma: keep */
21#include "../array_adaptive_map.h" /* IWYU pragma: keep */
22#include "../array_tree_map.h" /* IWYU pragma: keep */
23#include "../bitset.h" /* IWYU pragma: keep */
24#include "../buffer.h" /* IWYU pragma: keep */
25#include "../doubly_linked_list.h" /* IWYU pragma: keep */
26#include "../flat_double_ended_queue.h" /* IWYU pragma: keep */
27#include "../flat_hash_map.h" /* IWYU pragma: keep */
28#include "../flat_priority_queue.h" /* IWYU pragma: keep */
29#include "../priority_queue.h" /* IWYU pragma: keep */
30#include "../singly_linked_list.h" /* IWYU pragma: keep */
31#include "../tree_map.h" /* IWYU pragma: keep */
32#include "../types.h" /* IWYU pragma: keep */
33/* NOLINTEND */
34
35// clang-format off
36
37/*==================== Entry/Handle Interface =========================*/
38
39#define CCC_private_swap_entry(container_pointer, swap_arguments...) \
40 _Generic((container_pointer), \
41 CCC_Flat_hash_map *: CCC_flat_hash_map_swap_entry, \
42 CCC_Adaptive_map *: CCC_adaptive_map_swap_entry, \
43 CCC_Tree_map *: CCC_tree_map_swap_entry)((container_pointer), \
44 swap_arguments)
45
46#define CCC_private_swap_handle(container_pointer, swap_arguments...) \
47 _Generic((container_pointer), \
48 CCC_Array_adaptive_map *: CCC_array_adaptive_map_swap_handle, \
49 CCC_Array_tree_map *: CCC_array_tree_map_swap_handle)( \
50 (container_pointer), swap_arguments \
51 )
52
53#define CCC_private_try_insert(container_pointer, try_insert_arguments...) \
54 _Generic((container_pointer), \
55 CCC_Array_adaptive_map *: CCC_array_adaptive_map_try_insert, \
56 CCC_Array_tree_map *: CCC_array_tree_map_try_insert, \
57 CCC_Flat_hash_map *: CCC_flat_hash_map_try_insert, \
58 CCC_Adaptive_map *: CCC_adaptive_map_try_insert, \
59 CCC_Tree_map *: CCC_tree_map_try_insert)((container_pointer), \
60 try_insert_arguments)
61
62#define CCC_private_insert_or_assign(container_pointer, \
63 insert_or_assign_arguments...) \
64 _Generic((container_pointer), \
65 CCC_Array_adaptive_map *: CCC_array_adaptive_map_insert_or_assign, \
66 CCC_Array_tree_map *: CCC_array_tree_map_insert_or_assign, \
67 CCC_Flat_hash_map *: CCC_flat_hash_map_insert_or_assign, \
68 CCC_Adaptive_map *: CCC_adaptive_map_insert_or_assign, \
69 CCC_Tree_map *: CCC_tree_map_insert_or_assign)( \
70 (container_pointer), insert_or_assign_arguments \
71 )
72
73#define CCC_private_remove_key_value(container_pointer, \
74 key_val_container_array_pointer...) \
75 _Generic((container_pointer), \
76 CCC_Array_adaptive_map *: CCC_array_adaptive_map_remove_key_value, \
77 CCC_Array_tree_map *: CCC_array_tree_map_remove_key_value, \
78 CCC_Flat_hash_map *: CCC_flat_hash_map_remove_key_value, \
79 CCC_Adaptive_map *: CCC_adaptive_map_remove_key_value, \
80 CCC_Tree_map *: CCC_tree_map_remove_key_value)( \
81 (container_pointer), key_val_container_array_pointer \
82 )
83
84#define CCC_private_remove_entry(container_entry_pointer, \
85 ...) \
86 _Generic((container_entry_pointer), \
87 CCC_Flat_hash_map_entry *: CCC_flat_hash_map_remove_entry, \
88 CCC_Adaptive_map_entry *: CCC_adaptive_map_remove_entry, \
89 CCC_Tree_map_entry *: CCC_tree_map_remove_entry, \
90 CCC_Flat_hash_map_entry const *: CCC_flat_hash_map_remove_entry, \
91 CCC_Adaptive_map_entry const *: CCC_adaptive_map_remove_entry, \
92 CCC_Tree_map_entry const *: CCC_tree_map_remove_entry)( \
93 (container_entry_pointer) __VA_OPT__(, __VA_ARGS__) \
94 )
95
96#define CCC_private_remove_handle(container_array_pointer) \
97 _Generic((container_array_pointer), \
98 CCC_Array_adaptive_map_handle *: CCC_array_adaptive_map_remove_handle, \
99 CCC_Array_adaptive_map_handle const \
100 *: CCC_array_adaptive_map_remove_handle, \
101 CCC_Array_tree_map_handle *: CCC_array_tree_map_remove_handle, \
102 CCC_Array_tree_map_handle const *: CCC_array_tree_map_remove_handle)( \
103 (container_array_pointer) \
104 )
105
106#define CCC_private_entry(container_pointer, key_pointer, ...) \
107 _Generic((container_pointer), \
108 CCC_Flat_hash_map *: CCC_flat_hash_map_entry, \
109 CCC_Flat_hash_map const *: CCC_flat_hash_map_entry, \
110 CCC_Adaptive_map *: CCC_adaptive_map_entry, \
111 CCC_Tree_map *: CCC_tree_map_entry, \
112 CCC_Tree_map const *: CCC_tree_map_entry)( \
113 (container_pointer), key_pointer __VA_OPT__(, __VA_ARGS__) \
114 )
115
116#define CCC_private_handle(container_pointer, key_pointer...) \
117 _Generic((container_pointer), \
118 CCC_Array_adaptive_map *: CCC_array_adaptive_map_handle, \
119 CCC_Array_tree_map *: CCC_array_tree_map_handle, \
120 CCC_Array_tree_map const *: CCC_array_tree_map_handle)( \
121 (container_pointer), key_pointer \
122 )
123
124#define CCC_private_and_modify(container_entry_pointer, modifier_pointer...) \
125 _Generic((container_entry_pointer), \
126 CCC_Flat_hash_map_entry *: CCC_flat_hash_map_and_modify, \
127 CCC_Adaptive_map_entry *: CCC_adaptive_map_and_modify, \
128 CCC_Array_adaptive_map_handle *: CCC_array_adaptive_map_and_modify, \
129 CCC_Tree_map_entry *: CCC_tree_map_and_modify, \
130 CCC_Array_tree_map_handle *: CCC_array_tree_map_and_modify, \
131 CCC_Flat_hash_map_entry const *: CCC_flat_hash_map_and_modify, \
132 CCC_Array_tree_map_handle const *: CCC_array_tree_map_and_modify, \
133 CCC_Adaptive_map_entry const *: CCC_adaptive_map_and_modify, \
134 CCC_Array_adaptive_map_handle const \
135 *: CCC_array_adaptive_map_and_modify, \
136 CCC_Tree_map_entry const *: CCC_tree_map_and_modify)( \
137 (container_entry_pointer), modifier_pointer \
138 )
139
140#define CCC_private_insert_entry(container_entry_pointer, \
141 key_val_container_array_pointer...) \
142 _Generic((container_entry_pointer), \
143 CCC_Flat_hash_map_entry *: CCC_flat_hash_map_insert_entry, \
144 CCC_Adaptive_map_entry *: CCC_adaptive_map_insert_entry, \
145 CCC_Tree_map_entry *: CCC_tree_map_insert_entry, \
146 CCC_Flat_hash_map_entry const *: CCC_flat_hash_map_insert_entry, \
147 CCC_Adaptive_map_entry const *: CCC_adaptive_map_insert_entry, \
148 CCC_Tree_map_entry const *: CCC_tree_map_insert_entry)( \
149 (container_entry_pointer), key_val_container_array_pointer \
150 )
151
152#define CCC_private_insert_handle(container_array_pointer, \
153 key_val_container_array_pointer...) \
154 _Generic((container_array_pointer), \
155 CCC_Array_adaptive_map_handle *: CCC_array_adaptive_map_insert_handle, \
156 CCC_Array_adaptive_map_handle const \
157 *: CCC_array_adaptive_map_insert_handle, \
158 CCC_Array_tree_map_handle *: CCC_array_tree_map_insert_handle, \
159 CCC_Array_tree_map_handle const *: CCC_array_tree_map_insert_handle)( \
160 (container_array_pointer), key_val_container_array_pointer \
161 )
162
163#define CCC_private_or_insert(container_entry_pointer, \
164 key_val_container_array_pointer...) \
165 _Generic((container_entry_pointer), \
166 CCC_Flat_hash_map_entry *: CCC_flat_hash_map_or_insert, \
167 CCC_Adaptive_map_entry *: CCC_adaptive_map_or_insert, \
168 CCC_Array_adaptive_map_handle *: CCC_array_adaptive_map_or_insert, \
169 CCC_Tree_map_entry *: CCC_tree_map_or_insert, \
170 CCC_Array_tree_map_handle *: CCC_array_tree_map_or_insert, \
171 CCC_Flat_hash_map_entry const *: CCC_flat_hash_map_or_insert, \
172 CCC_Adaptive_map_entry const *: CCC_adaptive_map_or_insert, \
173 CCC_Array_tree_map_handle const *: CCC_array_tree_map_or_insert, \
174 CCC_Array_adaptive_map_handle const \
175 *: CCC_array_adaptive_map_or_insert, \
176 CCC_Tree_map_entry const *: CCC_tree_map_or_insert)( \
177 (container_entry_pointer), key_val_container_array_pointer \
178 )
179
180#define CCC_private_unwrap(container_entry_pointer) \
181 _Generic((container_entry_pointer), \
182 CCC_Entry *: CCC_entry_unwrap, \
183 CCC_Entry const *: CCC_entry_unwrap, \
184 CCC_Handle *: CCC_handle_unwrap, \
185 CCC_Handle const *: CCC_handle_unwrap, \
186 CCC_Flat_hash_map_entry *: CCC_flat_hash_map_unwrap, \
187 CCC_Flat_hash_map_entry const *: CCC_flat_hash_map_unwrap, \
188 CCC_Adaptive_map_entry *: CCC_adaptive_map_unwrap, \
189 CCC_Adaptive_map_entry const *: CCC_adaptive_map_unwrap, \
190 CCC_Array_adaptive_map_handle *: CCC_array_adaptive_map_unwrap, \
191 CCC_Array_adaptive_map_handle const *: CCC_array_adaptive_map_unwrap, \
192 CCC_Array_tree_map_handle *: CCC_array_tree_map_unwrap, \
193 CCC_Array_tree_map_handle const *: CCC_array_tree_map_unwrap, \
194 CCC_Tree_map_entry *: CCC_tree_map_unwrap, \
195 CCC_Tree_map_entry const *: CCC_tree_map_unwrap)( \
196 (container_entry_pointer) \
197 )
198
199#define CCC_private_occupied(container_entry_pointer) \
200 _Generic((container_entry_pointer), \
201 CCC_Entry *: CCC_entry_occupied, \
202 CCC_Entry const *: CCC_entry_occupied, \
203 CCC_Handle *: CCC_handle_occupied, \
204 CCC_Handle const *: CCC_handle_occupied, \
205 CCC_Flat_hash_map_entry *: CCC_flat_hash_map_occupied, \
206 CCC_Flat_hash_map_entry const *: CCC_flat_hash_map_occupied, \
207 CCC_Adaptive_map_entry *: CCC_adaptive_map_occupied, \
208 CCC_Adaptive_map_entry const *: CCC_adaptive_map_occupied, \
209 CCC_Array_adaptive_map_handle *: CCC_array_adaptive_map_occupied, \
210 CCC_Array_adaptive_map_handle const \
211 *: CCC_array_adaptive_map_occupied, \
212 CCC_Array_tree_map_handle *: CCC_array_tree_map_occupied, \
213 CCC_Array_tree_map_handle const *: CCC_array_tree_map_occupied, \
214 CCC_Tree_map_entry *: CCC_tree_map_occupied, \
215 CCC_Tree_map_entry const *: CCC_tree_map_occupied)( \
216 (container_entry_pointer) \
217 )
218
219#define CCC_private_insert_error(container_entry_pointer) \
220 _Generic((container_entry_pointer), \
221 CCC_Entry *: CCC_entry_insert_error, \
222 CCC_Entry const *: CCC_entry_insert_error, \
223 CCC_Handle *: CCC_handle_insert_error, \
224 CCC_Handle const *: CCC_handle_insert_error, \
225 CCC_Flat_hash_map_entry *: CCC_flat_hash_map_insert_error, \
226 CCC_Flat_hash_map_entry const *: CCC_flat_hash_map_insert_error, \
227 CCC_Adaptive_map_entry *: CCC_adaptive_map_insert_error, \
228 CCC_Adaptive_map_entry const *: CCC_adaptive_map_insert_error, \
229 CCC_Array_adaptive_map_handle *: CCC_array_adaptive_map_insert_error, \
230 CCC_Array_adaptive_map_handle const \
231 *: CCC_array_adaptive_map_insert_error, \
232 CCC_Array_tree_map_handle *: CCC_array_tree_map_insert_error, \
233 CCC_Array_tree_map_handle const *: CCC_array_tree_map_insert_error, \
234 CCC_Tree_map_entry *: CCC_tree_map_insert_error, \
235 CCC_Tree_map_entry const *: CCC_tree_map_insert_error)( \
236 (container_entry_pointer) \
237 )
238
239/*====================== Misc Search Interface ===========================*/
240
241#define CCC_private_get_key_value(container_pointer, key_pointer...) \
242 _Generic((container_pointer), \
243 CCC_Flat_hash_map *: CCC_flat_hash_map_get_key_value, \
244 CCC_Flat_hash_map const *: CCC_flat_hash_map_get_key_value, \
245 CCC_Adaptive_map *: CCC_adaptive_map_get_key_value, \
246 CCC_Array_adaptive_map *: CCC_array_adaptive_map_get_key_value, \
247 CCC_Array_tree_map *: CCC_array_tree_map_get_key_value, \
248 CCC_Array_tree_map const *: CCC_array_tree_map_get_key_value, \
249 CCC_Tree_map *: CCC_tree_map_get_key_value, \
250 CCC_Tree_map const *: CCC_tree_map_get_key_value)((container_pointer), \
251 key_pointer)
252
253#define CCC_private_contains(container_pointer, key_pointer...) \
254 _Generic((container_pointer), \
255 CCC_Flat_hash_map *: CCC_flat_hash_map_contains, \
256 CCC_Flat_hash_map const *: CCC_flat_hash_map_contains, \
257 CCC_Adaptive_map *: CCC_adaptive_map_contains, \
258 CCC_Array_adaptive_map *: CCC_array_adaptive_map_contains, \
259 CCC_Array_tree_map *: CCC_array_tree_map_contains, \
260 CCC_Array_tree_map const *: CCC_array_tree_map_contains, \
261 CCC_Tree_map *: CCC_tree_map_contains, \
262 CCC_Tree_map const *: CCC_tree_map_contains)((container_pointer), \
263 key_pointer)
264
265/*================ Sequential Containers Interface =====================*/
266
267#define CCC_private_push(container_pointer, container_array_pointer...) \
268 _Generic((container_pointer), \
269 CCC_Flat_priority_queue *: CCC_flat_priority_queue_push, \
270 CCC_Priority_queue *: CCC_priority_queue_push)( \
271 (container_pointer), container_array_pointer \
272 )
273
274#define CCC_private_push_back(container_pointer, container_array_pointer...) \
275 _Generic((container_pointer), \
276 CCC_Bitset *: CCC_bitset_push_back, \
277 CCC_Flat_double_ended_queue *: CCC_flat_double_ended_queue_push_back, \
278 CCC_Doubly_linked_list *: CCC_doubly_linked_list_push_back, \
279 CCC_Buffer *: CCC_buffer_push_back)((container_pointer), \
280 container_array_pointer)
281
282#define CCC_private_push_front(container_pointer, container_array_pointer...) \
283 _Generic((container_pointer), \
284 CCC_Flat_double_ended_queue *: CCC_flat_double_ended_queue_push_front, \
285 CCC_Doubly_linked_list *: CCC_doubly_linked_list_push_front, \
286 CCC_Singly_linked_list *: CCC_singly_linked_list_push_front)( \
287 (container_pointer), container_array_pointer \
288 )
289
290#define CCC_private_pop(container_pointer, ...) \
291 _Generic((container_pointer), \
292 CCC_Flat_priority_queue *: CCC_flat_priority_queue_pop, \
293 CCC_Priority_queue *: CCC_priority_queue_pop)( \
294 (container_pointer)__VA_OPT__(, __VA_ARGS__) \
295 )
296
297#define CCC_private_pop_front(container_pointer, ...) \
298 _Generic((container_pointer), \
299 CCC_Flat_double_ended_queue *: CCC_flat_double_ended_queue_pop_front, \
300 CCC_Doubly_linked_list *: CCC_doubly_linked_list_pop_front, \
301 CCC_Singly_linked_list *: CCC_singly_linked_list_pop_front)( \
302 (container_pointer)__VA_OPT__(, __VA_ARGS__) \
303 )
304
305#define CCC_private_pop_back(container_pointer, ...) \
306 _Generic((container_pointer), \
307 CCC_Bitset *: CCC_bitset_pop_back, \
308 CCC_Flat_double_ended_queue *: CCC_flat_double_ended_queue_pop_back, \
309 CCC_Doubly_linked_list *: CCC_doubly_linked_list_pop_back, \
310 CCC_Buffer *: CCC_buffer_pop_back)( \
311 (container_pointer)__VA_OPT__(, __VA_ARGS__) \
312 )
313
314#define CCC_private_front(container_pointer) \
315 _Generic((container_pointer), \
316 CCC_Flat_double_ended_queue *: CCC_flat_double_ended_queue_front, \
317 CCC_Doubly_linked_list *: CCC_doubly_linked_list_front, \
318 CCC_Flat_priority_queue *: CCC_flat_priority_queue_front, \
319 CCC_Priority_queue *: CCC_priority_queue_front, \
320 CCC_Singly_linked_list *: CCC_singly_linked_list_front, \
321 CCC_Flat_double_ended_queue const \
322 *: CCC_flat_double_ended_queue_front, \
323 CCC_Doubly_linked_list const *: CCC_doubly_linked_list_front, \
324 CCC_Flat_priority_queue const *: CCC_flat_priority_queue_front, \
325 CCC_Priority_queue const *: CCC_priority_queue_front, \
326 CCC_Singly_linked_list const *: CCC_singly_linked_list_front)( \
327 (container_pointer) \
328 )
329
330#define CCC_private_back(container_pointer) \
331 _Generic((container_pointer), \
332 CCC_Flat_double_ended_queue *: CCC_flat_double_ended_queue_back, \
333 CCC_Doubly_linked_list *: CCC_doubly_linked_list_back, \
334 CCC_Buffer *: CCC_buffer_back, \
335 CCC_Flat_double_ended_queue const *: CCC_flat_double_ended_queue_back, \
336 CCC_Doubly_linked_list const *: CCC_doubly_linked_list_back, \
337 CCC_Buffer const *: CCC_buffer_back)((container_pointer))
338
339/*================ Priority Queue Update Interface =====================*/
340
341#define CCC_private_update(container_pointer, update_arguments...) \
342 _Generic((container_pointer), \
343 CCC_Flat_priority_queue *: CCC_flat_priority_queue_update, \
344 CCC_Priority_queue *: CCC_priority_queue_update)((container_pointer), \
345 update_arguments)
346
347#define CCC_private_increase(container_pointer, increase_arguments...) \
348 _Generic((container_pointer), \
349 CCC_Flat_priority_queue *: CCC_flat_priority_queue_increase, \
350 CCC_Priority_queue *: CCC_priority_queue_increase)( \
351 (container_pointer), increase_arguments \
352 )
353
354#define CCC_private_decrease(container_pointer, decrease_arguments...) \
355 _Generic((container_pointer), \
356 CCC_Flat_priority_queue *: CCC_flat_priority_queue_decrease, \
357 CCC_Priority_queue *: CCC_priority_queue_decrease)( \
358 (container_pointer), decrease_arguments \
359 )
360
361#define CCC_private_extract(container_pointer, container_array_pointer...) \
362 _Generic((container_pointer), \
363 CCC_Doubly_linked_list *: CCC_doubly_linked_list_extract, \
364 CCC_Singly_linked_list *: CCC_singly_linked_list_extract, \
365 CCC_Priority_queue *: CCC_priority_queue_extract)( \
366 (container_pointer), container_array_pointer \
367 )
368
369#define CCC_private_erase(container_pointer, container_array_pointer...) \
370 _Generic((container_pointer), \
371 CCC_Flat_priority_queue *: CCC_flat_priority_queue_erase)( \
372 (container_pointer), container_array_pointer \
373 )
374
375#define CCC_private_extract_range(container_pointer, \
376 container_array_begin_end_pointer...) \
377 _Generic((container_pointer), \
378 CCC_Doubly_linked_list *: CCC_doubly_linked_list_extract_range, \
379 CCC_Singly_linked_list *: CCC_singly_linked_list_extract_range)( \
380 (container_pointer), container_array_begin_end_pointer \
381 )
382
383/*=================== Iterators Interface ==============================*/
384
385#define CCC_private_begin(container_pointer) \
386 _Generic((container_pointer), \
387 CCC_Buffer *: CCC_buffer_begin, \
388 CCC_Flat_hash_map *: CCC_flat_hash_map_begin, \
389 CCC_Adaptive_map *: CCC_adaptive_map_begin, \
390 CCC_Array_adaptive_map *: CCC_array_adaptive_map_begin, \
391 CCC_Flat_double_ended_queue *: CCC_flat_double_ended_queue_begin, \
392 CCC_Singly_linked_list *: CCC_singly_linked_list_begin, \
393 CCC_Doubly_linked_list *: CCC_doubly_linked_list_begin, \
394 CCC_Tree_map *: CCC_tree_map_begin, \
395 CCC_Array_tree_map *: CCC_array_tree_map_begin, \
396 CCC_Buffer const *: CCC_buffer_begin, \
397 CCC_Flat_hash_map const *: CCC_flat_hash_map_begin, \
398 CCC_Adaptive_map const *: CCC_adaptive_map_begin, \
399 CCC_Array_adaptive_map const *: CCC_array_adaptive_map_begin, \
400 CCC_Flat_double_ended_queue const \
401 *: CCC_flat_double_ended_queue_begin, \
402 CCC_Singly_linked_list const *: CCC_singly_linked_list_begin, \
403 CCC_Doubly_linked_list const *: CCC_doubly_linked_list_begin, \
404 CCC_Array_tree_map const *: CCC_array_tree_map_begin, \
405 CCC_Tree_map const *: CCC_tree_map_begin)((container_pointer))
406
407#define CCC_private_reverse_begin(container_pointer) \
408 _Generic((container_pointer), \
409 CCC_Buffer *: CCC_buffer_reverse_begin, \
410 CCC_Adaptive_map *: CCC_adaptive_map_reverse_begin, \
411 CCC_Array_adaptive_map *: CCC_array_adaptive_map_reverse_begin, \
412 CCC_Flat_double_ended_queue \
413 *: CCC_flat_double_ended_queue_reverse_begin, \
414 CCC_Doubly_linked_list *: CCC_doubly_linked_list_reverse_begin, \
415 CCC_Tree_map *: CCC_tree_map_reverse_begin, \
416 CCC_Array_tree_map *: CCC_array_tree_map_reverse_begin, \
417 CCC_Buffer const *: CCC_buffer_reverse_begin, \
418 CCC_Adaptive_map const *: CCC_adaptive_map_reverse_begin, \
419 CCC_Array_adaptive_map const *: CCC_array_adaptive_map_reverse_begin, \
420 CCC_Flat_double_ended_queue const \
421 *: CCC_flat_double_ended_queue_reverse_begin, \
422 CCC_Doubly_linked_list const *: CCC_doubly_linked_list_reverse_begin, \
423 CCC_Array_tree_map const *: CCC_array_tree_map_reverse_begin, \
424 CCC_Tree_map const *: CCC_tree_map_reverse_begin)((container_pointer))
425
426#define CCC_private_next(container_pointer, void_iterator_pointer) \
427 _Generic((container_pointer), \
428 CCC_Buffer *: CCC_buffer_next, \
429 CCC_Flat_hash_map *: CCC_flat_hash_map_next, \
430 CCC_Adaptive_map *: CCC_adaptive_map_next, \
431 CCC_Array_adaptive_map *: CCC_array_adaptive_map_next, \
432 CCC_Flat_double_ended_queue *: CCC_flat_double_ended_queue_next, \
433 CCC_Singly_linked_list *: CCC_singly_linked_list_next, \
434 CCC_Doubly_linked_list *: CCC_doubly_linked_list_next, \
435 CCC_Tree_map *: CCC_tree_map_next, \
436 CCC_Array_tree_map *: CCC_array_tree_map_next, \
437 CCC_Buffer const *: CCC_buffer_next, \
438 CCC_Flat_hash_map const *: CCC_flat_hash_map_next, \
439 CCC_Adaptive_map const *: CCC_adaptive_map_next, \
440 CCC_Array_adaptive_map const *: CCC_array_adaptive_map_next, \
441 CCC_Flat_double_ended_queue const *: CCC_flat_double_ended_queue_next, \
442 CCC_Singly_linked_list const *: CCC_singly_linked_list_next, \
443 CCC_Doubly_linked_list const *: CCC_doubly_linked_list_next, \
444 CCC_Array_tree_map const *: CCC_array_tree_map_next, \
445 CCC_Tree_map const *: CCC_tree_map_next)((container_pointer), \
446 (void_iterator_pointer))
447
448#define CCC_private_reverse_next(container_pointer, void_iterator_pointer) \
449 _Generic((container_pointer), \
450 CCC_Buffer *: CCC_buffer_reverse_next, \
451 CCC_Adaptive_map *: CCC_adaptive_map_reverse_next, \
452 CCC_Array_adaptive_map *: CCC_array_adaptive_map_reverse_next, \
453 CCC_Flat_double_ended_queue \
454 *: CCC_flat_double_ended_queue_reverse_next, \
455 CCC_Doubly_linked_list *: CCC_doubly_linked_list_reverse_next, \
456 CCC_Tree_map *: CCC_tree_map_reverse_next, \
457 CCC_Array_tree_map *: CCC_array_tree_map_reverse_next, \
458 CCC_Buffer const *: CCC_buffer_reverse_next, \
459 CCC_Adaptive_map const *: CCC_adaptive_map_reverse_next, \
460 CCC_Array_adaptive_map const *: CCC_array_adaptive_map_reverse_next, \
461 CCC_Flat_double_ended_queue const \
462 *: CCC_flat_double_ended_queue_reverse_next, \
463 CCC_Doubly_linked_list const *: CCC_doubly_linked_list_reverse_next, \
464 CCC_Array_tree_map const *: CCC_array_tree_map_reverse_next, \
465 CCC_Tree_map const *: CCC_tree_map_reverse_next)( \
466 (container_pointer), (void_iterator_pointer) \
467 )
468
469#define CCC_private_end(container_pointer) \
470 _Generic((container_pointer), \
471 CCC_Buffer *: CCC_buffer_end, \
472 CCC_Flat_hash_map *: CCC_flat_hash_map_end, \
473 CCC_Adaptive_map *: CCC_adaptive_map_end, \
474 CCC_Array_adaptive_map *: CCC_array_adaptive_map_end, \
475 CCC_Flat_double_ended_queue *: CCC_flat_double_ended_queue_end, \
476 CCC_Singly_linked_list *: CCC_singly_linked_list_end, \
477 CCC_Doubly_linked_list *: CCC_doubly_linked_list_end, \
478 CCC_Tree_map *: CCC_tree_map_end, \
479 CCC_Array_tree_map *: CCC_array_tree_map_end, \
480 CCC_Buffer const *: CCC_buffer_end, \
481 CCC_Flat_hash_map const *: CCC_flat_hash_map_end, \
482 CCC_Adaptive_map const *: CCC_adaptive_map_end, \
483 CCC_Array_adaptive_map const *: CCC_array_adaptive_map_end, \
484 CCC_Flat_double_ended_queue const *: CCC_flat_double_ended_queue_end, \
485 CCC_Singly_linked_list const *: CCC_singly_linked_list_end, \
486 CCC_Doubly_linked_list const *: CCC_doubly_linked_list_end, \
487 CCC_Array_tree_map const *: CCC_array_tree_map_end, \
488 CCC_Tree_map const *: CCC_tree_map_end)((container_pointer))
489
490#define CCC_private_reverse_end(container_pointer) \
491 _Generic((container_pointer), \
492 CCC_Buffer *: CCC_buffer_reverse_end, \
493 CCC_Adaptive_map *: CCC_adaptive_map_reverse_end, \
494 CCC_Array_adaptive_map *: CCC_array_adaptive_map_reverse_end, \
495 CCC_Flat_double_ended_queue \
496 *: CCC_flat_double_ended_queue_reverse_end, \
497 CCC_Doubly_linked_list *: CCC_doubly_linked_list_reverse_end, \
498 CCC_Tree_map *: CCC_tree_map_reverse_end, \
499 CCC_Array_tree_map *: CCC_array_tree_map_reverse_end, \
500 CCC_Buffer const *: CCC_buffer_reverse_end, \
501 CCC_Adaptive_map const *: CCC_adaptive_map_reverse_end, \
502 CCC_Array_adaptive_map const *: CCC_array_adaptive_map_reverse_end, \
503 CCC_Flat_double_ended_queue const \
504 *: CCC_flat_double_ended_queue_reverse_end, \
505 CCC_Doubly_linked_list const *: CCC_doubly_linked_list_reverse_end, \
506 CCC_Array_tree_map const *: CCC_array_tree_map_reverse_end, \
507 CCC_Tree_map const *: CCC_tree_map_reverse_end)((container_pointer))
508
509#define CCC_private_equal_range(container_pointer, \
510 begin_and_end_key_pointer...) \
511 _Generic((container_pointer), \
512 CCC_Adaptive_map *: CCC_adaptive_map_equal_range, \
513 CCC_Array_adaptive_map *: CCC_array_adaptive_map_equal_range, \
514 CCC_Array_tree_map *: CCC_array_tree_map_equal_range, \
515 CCC_Array_tree_map const *: CCC_array_tree_map_equal_range, \
516 CCC_Tree_map *: CCC_tree_map_equal_range, \
517 CCC_Tree_map const *: CCC_tree_map_equal_range)( \
518 (container_pointer), begin_and_end_key_pointer \
519 )
520
521#define CCC_private_equal_range_reverse( \
522 container_pointer, reverse_begin_and_reverse_end_key_pointer... \
523) \
524 _Generic((container_pointer), \
525 CCC_Adaptive_map *: CCC_adaptive_map_equal_range_reverse, \
526 CCC_Array_adaptive_map *: CCC_array_adaptive_map_equal_range_reverse, \
527 CCC_Array_tree_map *: CCC_array_tree_map_equal_range_reverse, \
528 CCC_Array_tree_map const *: CCC_array_tree_map_equal_range_reverse, \
529 CCC_Tree_map *: CCC_tree_map_equal_range_reverse, \
530 CCC_Tree_map const *: CCC_tree_map_equal_range_reverse)( \
531 (container_pointer), reverse_begin_and_reverse_end_key_pointer \
532 )
533
538#ifdef range_begin
539# undef range_begin
540#endif
541#ifdef range_end
542# undef range_end
543#endif
544#ifdef range_reverse_begin
545# undef range_reverse_begin
546#endif
547#ifdef range_reverse_end
548# undef range_reverse_end
549#endif
550
551#define CCC_private_range_begin(range_pointer) \
552 _Generic((range_pointer), \
553 CCC_Range *: CCC_range_begin, \
554 CCC_Range const *: CCC_range_begin, \
555 CCC_Handle_range *: CCC_handle_range_begin, \
556 CCC_Handle_range const *: CCC_handle_range_begin)((range_pointer))
557
558#define CCC_private_range_end(range_pointer) \
559 _Generic((range_pointer), \
560 CCC_Range *: CCC_range_end, \
561 CCC_Range const *: CCC_range_end, \
562 CCC_Handle_range *: CCC_handle_range_end, \
563 CCC_Handle_range const *: CCC_handle_range_end)((range_pointer))
564
565#define CCC_private_range_reverse_begin(range_reverse_pointer) \
566 _Generic((range_reverse_pointer), \
567 CCC_Range_reverse *: CCC_range_reverse_begin, \
568 CCC_Range_reverse const *: CCC_range_reverse_begin, \
569 CCC_Handle_range_reverse *: CCC_handle_range_reverse_begin, \
570 CCC_Handle_range_reverse const *: CCC_handle_range_reverse_begin)( \
571 (range_reverse_pointer) \
572 )
573
574#define CCC_private_range_reverse_end(range_reverse_pointer) \
575 _Generic((range_reverse_pointer), \
576 CCC_Range_reverse *: CCC_range_reverse_end, \
577 CCC_Range_reverse const *: CCC_range_reverse_end, \
578 CCC_Handle_range_reverse *: CCC_handle_range_reverse_end, \
579 CCC_Handle_range_reverse const *: CCC_handle_range_reverse_end)( \
580 (range_reverse_pointer) \
581 )
582
583#define CCC_private_splice(container_pointer, splice_arguments...) \
584 _Generic((container_pointer), \
585 CCC_Singly_linked_list *: CCC_singly_linked_list_splice, \
586 CCC_Singly_linked_list const *: CCC_singly_linked_list_splice, \
587 CCC_Doubly_linked_list *: CCC_doubly_linked_list_splice, \
588 CCC_Doubly_linked_list const *: CCC_doubly_linked_list_splice)( \
589 (container_pointer), splice_arguments \
590 )
591
592#define CCC_private_splice_range(container_pointer, splice_range_arguments...) \
593 _Generic((container_pointer), \
594 CCC_Singly_linked_list *: CCC_singly_linked_list_splice_range, \
595 CCC_Singly_linked_list const *: CCC_singly_linked_list_splice_range, \
596 CCC_Doubly_linked_list *: CCC_doubly_linked_list_splice_range, \
597 CCC_Doubly_linked_list const *: CCC_doubly_linked_list_splice_range)( \
598 (container_pointer), splice_range_arguments \
599 )
600
601/*=================== Memory Management =======================*/
602
603#define CCC_private_copy(destination_container_pointer, \
604 source_container_pointer, \
605 allocate_pointer) \
606 _Generic((destination_container_pointer), \
607 CCC_Bitset *: CCC_bitset_copy, \
608 CCC_Flat_hash_map *: CCC_flat_hash_map_copy, \
609 CCC_Array_adaptive_map *: CCC_array_adaptive_map_copy, \
610 CCC_Flat_priority_queue *: CCC_flat_priority_queue_copy, \
611 CCC_Flat_double_ended_queue *: CCC_flat_double_ended_queue_copy, \
612 CCC_Array_tree_map *: CCC_array_tree_map_copy)( \
613 (destination_container_pointer), \
614 (source_container_pointer), \
615 (allocate_pointer) \
616 )
617
618#define CCC_private_reserve(container_pointer, n_to_add, allocate_pointer) \
619 _Generic((container_pointer), \
620 CCC_Bitset *: CCC_bitset_reserve, \
621 CCC_Buffer *: CCC_buffer_reserve, \
622 CCC_Flat_hash_map *: CCC_flat_hash_map_reserve, \
623 CCC_Array_adaptive_map *: CCC_array_adaptive_map_reserve, \
624 CCC_Flat_priority_queue *: CCC_flat_priority_queue_reserve, \
625 CCC_Flat_double_ended_queue *: CCC_flat_double_ended_queue_reserve, \
626 CCC_Array_tree_map *: CCC_array_tree_map_reserve)((container_pointer), \
627 (n_to_add), \
628 (allocate_pointer))
629
630#define CCC_private_clear(container_pointer, ...) \
631 _Generic((container_pointer), \
632 CCC_Bitset *: CCC_bitset_clear, \
633 CCC_Buffer *: CCC_buffer_clear, \
634 CCC_Flat_hash_map *: CCC_flat_hash_map_clear, \
635 CCC_Array_adaptive_map *: CCC_array_adaptive_map_clear, \
636 CCC_Flat_priority_queue *: CCC_flat_priority_queue_clear, \
637 CCC_Flat_double_ended_queue *: CCC_flat_double_ended_queue_clear, \
638 CCC_Singly_linked_list *: CCC_singly_linked_list_clear, \
639 CCC_Doubly_linked_list *: CCC_doubly_linked_list_clear, \
640 CCC_Adaptive_map *: CCC_adaptive_map_clear, \
641 CCC_Priority_queue *: CCC_priority_queue_clear, \
642 CCC_Tree_map *: CCC_tree_map_clear, \
643 CCC_Array_tree_map *: CCC_array_tree_map_clear)( \
644 (container_pointer)__VA_OPT__(, __VA_ARGS__) \
645 )
646
647#define CCC_private_clear_and_free(container_pointer, ...) \
648 _Generic((container_pointer), \
649 CCC_Bitset *: CCC_bitset_clear_and_free, \
650 CCC_Buffer *: CCC_buffer_clear_and_free, \
651 CCC_Flat_hash_map *: CCC_flat_hash_map_clear_and_free, \
652 CCC_Array_adaptive_map *: CCC_array_adaptive_map_clear_and_free, \
653 CCC_Flat_priority_queue *: CCC_flat_priority_queue_clear_and_free, \
654 CCC_Flat_double_ended_queue \
655 *: CCC_flat_double_ended_queue_clear_and_free, \
656 CCC_Array_tree_map *: CCC_array_tree_map_clear_and_free)( \
657 (container_pointer)__VA_OPT__(, __VA_ARGS__) \
658 )
659
660/*=================== Standard Getters Interface =======================*/
661
662#define CCC_private_count(container_pointer) \
663 _Generic((container_pointer), \
664 CCC_Bitset *: CCC_bitset_count, \
665 CCC_Buffer *: CCC_buffer_count, \
666 CCC_Flat_hash_map *: CCC_flat_hash_map_count, \
667 CCC_Adaptive_map *: CCC_adaptive_map_count, \
668 CCC_Array_adaptive_map *: CCC_array_adaptive_map_count, \
669 CCC_Flat_priority_queue *: CCC_flat_priority_queue_count, \
670 CCC_Flat_double_ended_queue *: CCC_flat_double_ended_queue_count, \
671 CCC_Priority_queue *: CCC_priority_queue_count, \
672 CCC_Singly_linked_list *: CCC_singly_linked_list_count, \
673 CCC_Doubly_linked_list *: CCC_doubly_linked_list_count, \
674 CCC_Tree_map *: CCC_tree_map_count, \
675 CCC_Array_tree_map *: CCC_array_tree_map_count, \
676 CCC_Bitset const *: CCC_bitset_count, \
677 CCC_Buffer const *: CCC_buffer_count, \
678 CCC_Flat_hash_map const *: CCC_flat_hash_map_count, \
679 CCC_Adaptive_map const *: CCC_adaptive_map_count, \
680 CCC_Array_adaptive_map const *: CCC_array_adaptive_map_count, \
681 CCC_Flat_priority_queue const *: CCC_flat_priority_queue_count, \
682 CCC_Flat_double_ended_queue const \
683 *: CCC_flat_double_ended_queue_count, \
684 CCC_Priority_queue const *: CCC_priority_queue_count, \
685 CCC_Singly_linked_list const *: CCC_singly_linked_list_count, \
686 CCC_Doubly_linked_list const *: CCC_doubly_linked_list_count, \
687 CCC_Array_tree_map const *: CCC_array_tree_map_count, \
688 CCC_Tree_map const *: CCC_tree_map_count)((container_pointer))
689
690#define CCC_private_capacity(container_pointer) \
691 _Generic((container_pointer), \
692 CCC_Bitset *: CCC_bitset_capacity, \
693 CCC_Buffer *: CCC_buffer_capacity, \
694 CCC_Flat_hash_map *: CCC_flat_hash_map_capacity, \
695 CCC_Array_adaptive_map *: CCC_array_adaptive_map_capacity, \
696 CCC_Flat_priority_queue *: CCC_flat_priority_queue_capacity, \
697 CCC_Flat_double_ended_queue *: CCC_flat_double_ended_queue_capacity, \
698 CCC_Array_tree_map *: CCC_array_tree_map_capacity, \
699 CCC_Bitset const *: CCC_bitset_capacity, \
700 CCC_Buffer const *: CCC_buffer_capacity, \
701 CCC_Flat_hash_map const *: CCC_flat_hash_map_capacity, \
702 CCC_Array_adaptive_map const *: CCC_array_adaptive_map_capacity, \
703 CCC_Flat_priority_queue const *: CCC_flat_priority_queue_capacity, \
704 CCC_Flat_double_ended_queue const \
705 *: CCC_flat_double_ended_queue_capacity, \
706 CCC_Array_tree_map const *: CCC_array_tree_map_capacity)( \
707 (container_pointer) \
708 )
709
710#define CCC_private_is_empty(container_pointer) \
711 _Generic((container_pointer), \
712 CCC_Bitset *: CCC_bitset_is_empty, \
713 CCC_Buffer *: CCC_buffer_is_empty, \
714 CCC_Flat_hash_map *: CCC_flat_hash_map_is_empty, \
715 CCC_Adaptive_map *: CCC_adaptive_map_is_empty, \
716 CCC_Array_adaptive_map *: CCC_array_adaptive_map_is_empty, \
717 CCC_Flat_priority_queue *: CCC_flat_priority_queue_is_empty, \
718 CCC_Flat_double_ended_queue *: CCC_flat_double_ended_queue_is_empty, \
719 CCC_Priority_queue *: CCC_priority_queue_is_empty, \
720 CCC_Singly_linked_list *: CCC_singly_linked_list_is_empty, \
721 CCC_Doubly_linked_list *: CCC_doubly_linked_list_is_empty, \
722 CCC_Tree_map *: CCC_tree_map_is_empty, \
723 CCC_Array_tree_map *: CCC_array_tree_map_is_empty, \
724 CCC_Bitset const *: CCC_bitset_is_empty, \
725 CCC_Buffer const *: CCC_buffer_is_empty, \
726 CCC_Flat_hash_map const *: CCC_flat_hash_map_is_empty, \
727 CCC_Adaptive_map const *: CCC_adaptive_map_is_empty, \
728 CCC_Array_adaptive_map const *: CCC_array_adaptive_map_is_empty, \
729 CCC_Flat_priority_queue const *: CCC_flat_priority_queue_is_empty, \
730 CCC_Flat_double_ended_queue const \
731 *: CCC_flat_double_ended_queue_is_empty, \
732 CCC_Priority_queue const *: CCC_priority_queue_is_empty, \
733 CCC_Singly_linked_list const *: CCC_singly_linked_list_is_empty, \
734 CCC_Doubly_linked_list const *: CCC_doubly_linked_list_is_empty, \
735 CCC_Array_tree_map const *: CCC_array_tree_map_is_empty, \
736 CCC_Tree_map const *: CCC_tree_map_is_empty)((container_pointer))
737
738#define CCC_private_validate(container_pointer) \
739 _Generic((container_pointer), \
740 CCC_Flat_hash_map *: CCC_flat_hash_map_validate, \
741 CCC_Adaptive_map *: CCC_adaptive_map_validate, \
742 CCC_Array_adaptive_map *: CCC_array_adaptive_map_validate, \
743 CCC_Flat_priority_queue *: CCC_flat_priority_queue_validate, \
744 CCC_Flat_double_ended_queue *: CCC_flat_double_ended_queue_validate, \
745 CCC_Priority_queue *: CCC_priority_queue_validate, \
746 CCC_Singly_linked_list *: CCC_singly_linked_list_validate, \
747 CCC_Doubly_linked_list *: CCC_doubly_linked_list_validate, \
748 CCC_Tree_map *: CCC_tree_map_validate, \
749 CCC_Array_tree_map *: CCC_array_tree_map_validate, \
750 CCC_Flat_hash_map const *: CCC_flat_hash_map_validate, \
751 CCC_Adaptive_map const *: CCC_adaptive_map_validate, \
752 CCC_Array_adaptive_map const *: CCC_array_adaptive_map_validate, \
753 CCC_Flat_priority_queue const *: CCC_flat_priority_queue_validate, \
754 CCC_Flat_double_ended_queue const \
755 *: CCC_flat_double_ended_queue_validate, \
756 CCC_Priority_queue const *: CCC_priority_queue_validate, \
757 CCC_Singly_linked_list const *: CCC_singly_linked_list_validate, \
758 CCC_Doubly_linked_list const *: CCC_doubly_linked_list_validate, \
759 CCC_Array_tree_map const *: CCC_array_tree_map_validate, \
760 CCC_Tree_map const *: CCC_tree_map_validate)((container_pointer))
761
762// clang-format on
763
764#endif /* CCC_PRIVATE_TRAITS_H */