16#ifndef CCC_PRIVATE_ARRAY_ADAPTIVE_MAP_H
17#define CCC_PRIVATE_ARRAY_ADAPTIVE_MAP_H
112void *CCC_private_array_adaptive_map_data_at(
116void *CCC_private_array_adaptive_map_key_at(
120size_t CCC_private_array_adaptive_map_allocate_slot(
127#define CCC_private_array_adaptive_map_compound_literal_array_capacity( \
128 private_type_compound_literal_array \
130 (sizeof(private_type_compound_literal_array) \
131 / sizeof(*(private_type_compound_literal_array)))
134#define CCC_private_array_adaptive_map_default( \
135 private_type_name, private_key_node_field, private_comparator... \
137 (struct CCC_Array_adaptive_map) { \
138 .sizeof_type = sizeof(private_type_name), \
139 .key_offset = offsetof(private_type_name, private_key_node_field), \
140 .comparator = private_comparator, \
144#define CCC_private_array_adaptive_map_for( \
146 private_comparator, \
148 private_memory_pointer \
150 (struct CCC_Array_adaptive_map) { \
151 .data = (private_memory_pointer), .nodes = NULL, \
152 .capacity = (private_capacity), .count = 0, .root = 0, .free_list = 0, \
153 .sizeof_type = sizeof(private_type_name), \
154 .key_offset = offsetof(private_type_name, private_key_node_field), \
155 .comparator = (private_comparator), \
159#define CCC_private_array_adaptive_map_from( \
161 private_comparator, \
163 private_optional_cap, \
164 private_array_compound_literal... \
166 (struct { struct CCC_Array_adaptive_map private; }){(__extension__({ \
167 typeof(*private_array_compound_literal) \
168 *private_array_adaptive_map_initializer_list \
169 = private_array_compound_literal; \
170 struct CCC_Array_adaptive_map private_array_adaptive_map \
171 = CCC_private_array_adaptive_map_default( \
172 typeof(*private_array_adaptive_map_initializer_list), \
176 size_t const private_array_adaptive_n \
177 = sizeof(private_array_compound_literal) \
178 / sizeof(*private_array_adaptive_map_initializer_list); \
179 size_t const private_cap = private_optional_cap; \
180 CCC_Allocator const *const private_array_adaptive_map_allocator \
181 = &(private_allocator); \
182 if (CCC_array_adaptive_map_reserve( \
183 &private_array_adaptive_map, \
184 (private_array_adaptive_n > private_cap \
185 ? private_array_adaptive_n \
187 private_array_adaptive_map_allocator \
189 == CCC_RESULT_OK) { \
190 for (size_t i = 0; i < private_array_adaptive_n; ++i) { \
191 struct CCC_Array_adaptive_map_handle \
192 private_array_adaptive_entry \
193 = CCC_private_array_adaptive_map_handle( \
194 &private_array_adaptive_map, \
197 )&private_array_adaptive_map_initializer_list[i] \
200 CCC_Handle_index private_index \
201 = private_array_adaptive_entry.index; \
202 if (!(private_array_adaptive_entry.status \
203 & CCC_ENTRY_OCCUPIED)) { \
205 = CCC_private_array_adaptive_map_allocate_slot( \
206 &private_array_adaptive_map, \
207 private_array_adaptive_map_allocator \
210 *((typeof(*private_array_adaptive_map_initializer_list) *) \
211 CCC_private_array_adaptive_map_data_at( \
212 private_array_adaptive_entry.map, private_index \
213 )) = private_array_adaptive_map_initializer_list[i]; \
214 if (!(private_array_adaptive_entry.status \
215 & CCC_ENTRY_OCCUPIED)) { \
216 CCC_private_array_adaptive_map_insert( \
217 private_array_adaptive_entry.map, private_index \
222 private_array_adaptive_map; \
226#define CCC_private_array_adaptive_map_with_capacity( \
229 private_comparator, \
233 (struct { struct CCC_Array_adaptive_map private; }){(__extension__({ \
234 struct CCC_Array_adaptive_map private_array_adaptive_map \
235 = CCC_private_array_adaptive_map_default( \
236 private_type_name, private_key_field, private_comparator \
238 (void)CCC_array_adaptive_map_reserve( \
239 &private_array_adaptive_map, private_cap, &(private_allocator) \
241 private_array_adaptive_map; \
247#define CCC_private_array_adaptive_map_storage_for( \
248 private_type_compound_literal_array, optional_storage_specifier... \
250 (optional_storage_specifier struct { \
252 CCC_private_array_adaptive_map_compound_literal_array_capacity( \
253 private_type_compound_literal_array \
255 "fixed size map must have capacity greater than 1" \
257 typeof(*(private_type_compound_literal_array)) data \
258 [CCC_private_array_adaptive_map_compound_literal_array_capacity( \
259 private_type_compound_literal_array \
261 struct CCC_Array_adaptive_map_node nodes \
262 [CCC_private_array_adaptive_map_compound_literal_array_capacity( \
263 private_type_compound_literal_array \
269#define CCC_private_array_adaptive_map_with_storage( \
270 private_key_node_field, \
271 private_comparator, \
272 private_compound_literal, \
273 private_optional_storage_specifier... \
275 (struct CCC_Array_adaptive_map) { \
276 .data = &CCC_private_array_adaptive_map_storage_for( \
277 private_compound_literal, private_optional_storage_specifier \
281 = CCC_private_array_adaptive_map_compound_literal_array_capacity( \
282 private_compound_literal \
284 .count = 0, .root = 0, .free_list = 0, \
285 .sizeof_type = sizeof(*(private_compound_literal)), \
286 .key_offset = offsetof( \
287 typeof(*(private_compound_literal)), private_key_node_field \
289 .comparator = (private_comparator), \
293#define CCC_private_array_adaptive_map_as( \
294 array_adaptive_map_pointer, type_name, handle... \
296 ((type_name *)CCC_private_array_adaptive_map_data_at( \
297 (array_adaptive_map_pointer), (handle) \
303#define CCC_private_array_adaptive_map_and_modify_with( \
304 array_adaptive_map_handle_pointer, \
306 closure_over_closure_parameter... \
309 struct CCC_Array_adaptive_map_handle const *const \
310 private_array_adaptive_map_mod_hndl_pointer \
311 = (array_adaptive_map_handle_pointer); \
312 struct CCC_Array_adaptive_map_handle \
313 private_array_adaptive_map_mod_hndl \
314 = {.status = CCC_ENTRY_ARGUMENT_ERROR}; \
315 if (private_array_adaptive_map_mod_hndl_pointer) { \
316 private_array_adaptive_map_mod_hndl \
317 = *private_array_adaptive_map_mod_hndl_pointer; \
318 if (private_array_adaptive_map_mod_hndl.status \
319 & CCC_ENTRY_OCCUPIED) { \
320 closure_parameter = CCC_private_array_adaptive_map_data_at( \
321 private_array_adaptive_map_mod_hndl.map, \
322 private_array_adaptive_map_mod_hndl.index \
324 closure_over_closure_parameter \
327 private_array_adaptive_map_mod_hndl; \
331#define CCC_private_array_adaptive_map_or_insert_with( \
332 array_adaptive_map_handle_pointer, \
333 private_allocator_pointer, \
334 type_compound_literal... \
337 struct CCC_Array_adaptive_map_handle const *const \
338 private_array_adaptive_map_or_ins_hndl_pointer \
339 = (array_adaptive_map_handle_pointer); \
340 CCC_Handle_index private_array_adaptive_map_or_ins_ret = 0; \
341 CCC_Allocator const *const private_array_adaptive_map_allocator \
342 = (private_allocator_pointer); \
343 if (private_array_adaptive_map_allocator \
344 && private_array_adaptive_map_or_ins_hndl_pointer) { \
345 if (private_array_adaptive_map_or_ins_hndl_pointer->status \
346 == CCC_ENTRY_OCCUPIED) { \
347 private_array_adaptive_map_or_ins_ret \
348 = private_array_adaptive_map_or_ins_hndl_pointer->index; \
350 private_array_adaptive_map_or_ins_ret \
351 = CCC_private_array_adaptive_map_allocate_slot( \
352 private_array_adaptive_map_or_ins_hndl_pointer->map, \
353 private_array_adaptive_map_allocator \
355 if (private_array_adaptive_map_or_ins_ret) { \
356 *((typeof(type_compound_literal) *) \
357 CCC_private_array_adaptive_map_data_at( \
358 private_array_adaptive_map_or_ins_hndl_pointer \
360 private_array_adaptive_map_or_ins_ret \
361 )) = type_compound_literal; \
362 CCC_private_array_adaptive_map_insert( \
363 private_array_adaptive_map_or_ins_hndl_pointer->map, \
364 private_array_adaptive_map_or_ins_ret \
369 private_array_adaptive_map_or_ins_ret; \
373#define CCC_private_array_adaptive_map_insert_handle_with( \
374 array_adaptive_map_handle_pointer, \
375 private_allocator_pointer, \
376 type_compound_literal... \
379 struct CCC_Array_adaptive_map_handle const *const \
380 private_array_adaptive_map_ins_hndl_pointer \
381 = (array_adaptive_map_handle_pointer); \
382 CCC_Handle_index private_array_adaptive_map_ins_hndl_ret = 0; \
383 CCC_Allocator const *const private_array_adaptive_map_allocator \
384 = (private_allocator_pointer); \
385 if (private_array_adaptive_map_allocator \
386 && private_array_adaptive_map_ins_hndl_pointer) { \
387 if (!(private_array_adaptive_map_ins_hndl_pointer->status \
388 & CCC_ENTRY_OCCUPIED)) { \
389 private_array_adaptive_map_ins_hndl_ret \
390 = CCC_private_array_adaptive_map_allocate_slot( \
391 private_array_adaptive_map_ins_hndl_pointer->map, \
392 private_array_adaptive_map_allocator \
394 if (private_array_adaptive_map_ins_hndl_ret) { \
395 *((typeof(type_compound_literal) *) \
396 CCC_private_array_adaptive_map_data_at( \
397 private_array_adaptive_map_ins_hndl_pointer \
399 private_array_adaptive_map_ins_hndl_ret \
400 )) = type_compound_literal; \
401 CCC_private_array_adaptive_map_insert( \
402 private_array_adaptive_map_ins_hndl_pointer->map, \
403 private_array_adaptive_map_ins_hndl_ret \
406 } else if (private_array_adaptive_map_ins_hndl_pointer->status \
407 == CCC_ENTRY_OCCUPIED) { \
408 *((typeof(type_compound_literal) *) \
409 CCC_private_array_adaptive_map_data_at( \
410 private_array_adaptive_map_ins_hndl_pointer->map, \
411 private_array_adaptive_map_ins_hndl_pointer->index \
412 )) = type_compound_literal; \
413 private_array_adaptive_map_ins_hndl_ret \
414 = private_array_adaptive_map_ins_hndl_pointer->index; \
417 private_array_adaptive_map_ins_hndl_ret; \
421#define CCC_private_array_adaptive_map_try_insert_with( \
422 array_adaptive_map_pointer, \
424 private_allocator_pointer, \
425 type_compound_literal... \
428 struct CCC_Array_adaptive_map *const \
429 private_array_adaptive_map_try_ins_map_pointer \
430 = (array_adaptive_map_pointer); \
431 CCC_Handle private_array_adaptive_map_try_ins_hndl_ret \
432 = {.status = CCC_ENTRY_ARGUMENT_ERROR}; \
433 CCC_Allocator const *const private_array_adaptive_map_allocator \
434 = (private_allocator_pointer); \
435 if (private_array_adaptive_map_allocator \
436 && private_array_adaptive_map_try_ins_map_pointer) { \
437 __auto_type private_array_adaptive_map_key = (key); \
438 struct CCC_Array_adaptive_map_handle \
439 private_array_adaptive_map_try_ins_hndl \
440 = CCC_private_array_adaptive_map_handle( \
441 private_array_adaptive_map_try_ins_map_pointer, \
442 (void *)&private_array_adaptive_map_key \
444 if (!(private_array_adaptive_map_try_ins_hndl.status \
445 & CCC_ENTRY_OCCUPIED)) { \
446 private_array_adaptive_map_try_ins_hndl_ret = (CCC_Handle){ \
447 .index = CCC_private_array_adaptive_map_allocate_slot( \
448 private_array_adaptive_map_try_ins_hndl.map, \
449 private_array_adaptive_map_allocator \
451 .status = CCC_ENTRY_INSERT_ERROR, \
453 if (private_array_adaptive_map_try_ins_hndl_ret.index) { \
454 *((typeof(type_compound_literal) *) \
455 CCC_private_array_adaptive_map_data_at( \
456 private_array_adaptive_map_try_ins_map_pointer, \
457 private_array_adaptive_map_try_ins_hndl_ret \
459 )) = type_compound_literal; \
460 *((typeof(private_array_adaptive_map_key) *) \
461 CCC_private_array_adaptive_map_key_at( \
462 private_array_adaptive_map_try_ins_hndl.map, \
463 private_array_adaptive_map_try_ins_hndl_ret \
465 )) = private_array_adaptive_map_key; \
466 CCC_private_array_adaptive_map_insert( \
467 private_array_adaptive_map_try_ins_hndl.map, \
468 private_array_adaptive_map_try_ins_hndl_ret.index \
470 private_array_adaptive_map_try_ins_hndl_ret.status \
471 = CCC_ENTRY_VACANT; \
473 } else if (private_array_adaptive_map_try_ins_hndl.status \
474 == CCC_ENTRY_OCCUPIED) { \
475 private_array_adaptive_map_try_ins_hndl_ret = (CCC_Handle){ \
476 .index = private_array_adaptive_map_try_ins_hndl.index, \
477 .status = private_array_adaptive_map_try_ins_hndl.status}; \
480 private_array_adaptive_map_try_ins_hndl_ret; \
484#define CCC_private_array_adaptive_map_insert_or_assign_with( \
485 array_adaptive_map_pointer, \
487 private_allocator_pointer, \
488 type_compound_literal... \
491 struct CCC_Array_adaptive_map *const \
492 private_array_adaptive_map_ins_or_assign_map_pointer \
493 = (array_adaptive_map_pointer); \
494 CCC_Handle private_array_adaptive_map_ins_or_assign_hndl_ret \
495 = {.status = CCC_ENTRY_ARGUMENT_ERROR}; \
496 CCC_Allocator const *const private_array_adaptive_map_allocator \
497 = (private_allocator_pointer); \
498 if (private_array_adaptive_map_allocator \
499 && private_array_adaptive_map_ins_or_assign_map_pointer) { \
500 __auto_type private_array_adaptive_map_key = (key); \
501 struct CCC_Array_adaptive_map_handle \
502 private_array_adaptive_map_ins_or_assign_hndl \
503 = CCC_private_array_adaptive_map_handle( \
504 private_array_adaptive_map_ins_or_assign_map_pointer, \
505 (void *)&private_array_adaptive_map_key \
507 if (!(private_array_adaptive_map_ins_or_assign_hndl.status \
508 & CCC_ENTRY_OCCUPIED)) { \
509 private_array_adaptive_map_ins_or_assign_hndl_ret \
511 .index = CCC_private_array_adaptive_map_allocate_slot( \
512 private_array_adaptive_map_ins_or_assign_hndl.map, \
513 private_array_adaptive_map_allocator \
515 .status = CCC_ENTRY_INSERT_ERROR, \
517 if (private_array_adaptive_map_ins_or_assign_hndl_ret.index) { \
518 *((typeof(type_compound_literal) *) \
519 CCC_private_array_adaptive_map_data_at( \
520 private_array_adaptive_map_ins_or_assign_map_pointer, \
521 private_array_adaptive_map_ins_or_assign_hndl_ret \
523 )) = type_compound_literal; \
524 *((typeof(private_array_adaptive_map_key) *) \
525 CCC_private_array_adaptive_map_key_at( \
526 private_array_adaptive_map_ins_or_assign_hndl \
528 private_array_adaptive_map_ins_or_assign_hndl_ret \
530 )) = private_array_adaptive_map_key; \
531 CCC_private_array_adaptive_map_insert( \
532 private_array_adaptive_map_ins_or_assign_hndl.map, \
533 private_array_adaptive_map_ins_or_assign_hndl_ret \
536 private_array_adaptive_map_ins_or_assign_hndl_ret.status \
537 = CCC_ENTRY_VACANT; \
539 } else if (private_array_adaptive_map_ins_or_assign_hndl.status \
540 == CCC_ENTRY_OCCUPIED) { \
541 *((typeof(type_compound_literal) *) \
542 CCC_private_array_adaptive_map_data_at( \
543 private_array_adaptive_map_ins_or_assign_hndl.map, \
544 private_array_adaptive_map_ins_or_assign_hndl.index \
545 )) = type_compound_literal; \
546 private_array_adaptive_map_ins_or_assign_hndl_ret \
549 = private_array_adaptive_map_ins_or_assign_hndl.index, \
551 = private_array_adaptive_map_ins_or_assign_hndl \
554 *((typeof(private_array_adaptive_map_key) *) \
555 CCC_private_array_adaptive_map_key_at( \
556 private_array_adaptive_map_ins_or_assign_hndl.map, \
557 private_array_adaptive_map_ins_or_assign_hndl.index \
558 )) = private_array_adaptive_map_key; \
561 private_array_adaptive_map_ins_or_assign_hndl_ret; \
The type passed by reference to any container function that may need to allocate memory....
Definition: types.h:369
Definition: private_array_adaptive_map.h:91
CCC_Order last_order
Definition: private_array_adaptive_map.h:97
CCC_Entry_status status
Definition: private_array_adaptive_map.h:99
size_t index
Definition: private_array_adaptive_map.h:95
struct CCC_Array_adaptive_map * map
Definition: private_array_adaptive_map.h:93
Definition: private_array_adaptive_map.h:32
size_t branch[2]
Definition: private_array_adaptive_map.h:34
size_t next_free
Definition: private_array_adaptive_map.h:39
size_t parent
Definition: private_array_adaptive_map.h:37
Definition: private_array_adaptive_map.h:68
size_t free_list
Definition: private_array_adaptive_map.h:80
size_t count
Definition: private_array_adaptive_map.h:76
void * data
Definition: private_array_adaptive_map.h:70
size_t sizeof_type
Definition: private_array_adaptive_map.h:82
size_t root
Definition: private_array_adaptive_map.h:78
CCC_Key_comparator comparator
Definition: private_array_adaptive_map.h:86
struct CCC_Array_adaptive_map_node * nodes
Definition: private_array_adaptive_map.h:72
size_t capacity
Definition: private_array_adaptive_map.h:74
size_t key_offset
Definition: private_array_adaptive_map.h:84
The type passed by reference to any container function that may need to compare keys....
Definition: types.h:505
CCC_Order
A three-way comparison for comparison functions.
Definition: types.h:213
CCC_Entry_status
The status monitoring and entry state once it is obtained.
Definition: types.h:112