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 */
ccc
impl
impl_traits.h
Generated by
1.9.6