16#ifndef CCC_PRIVATE_ARRAY_TREE_MAP_H
17#define CCC_PRIVATE_ARRAY_TREE_MAP_H
179void CCC_private_array_tree_map_insert(
183size_t CCC_private_array_tree_map_allocate_slot(
192#define CCC_private_array_tree_map_blocks(private_cap) \
194 + ((sizeof(*(struct CCC_Array_tree_map){}.parity) * CHAR_BIT) - 1)) \
195 / (sizeof(*(struct CCC_Array_tree_map){}.parity) * CHAR_BIT))
198#define CCC_private_array_tree_map_compound_literal_array_capacity( \
199 private_type_compound_literal_array \
201 (sizeof(private_type_compound_literal_array) \
202 / sizeof(*(private_type_compound_literal_array)))
207#define CCC_private_array_tree_map_storage_for( \
208 private_type_compound_literal_array, optional_storage_specifier... \
210 (optional_storage_specifier struct { \
212 CCC_private_array_tree_map_compound_literal_array_capacity( \
213 private_type_compound_literal_array \
215 "fixed size map must have capacity greater than 1" \
217 typeof(*(private_type_compound_literal_array)) \
218 data[CCC_private_array_tree_map_compound_literal_array_capacity( \
219 private_type_compound_literal_array \
221 struct CCC_Array_tree_map_node \
222 nodes[CCC_private_array_tree_map_compound_literal_array_capacity( \
223 private_type_compound_literal_array \
225 typeof(*(struct CCC_Array_tree_map){}.parity) \
226 parity[CCC_private_array_tree_map_blocks( \
227 CCC_private_array_tree_map_compound_literal_array_capacity( \
228 private_type_compound_literal_array \
235#define CCC_private_array_tree_map_default( \
236 private_type_name, private_key_field, private_comparator... \
238 (struct CCC_Array_tree_map) { \
239 .sizeof_type = sizeof(private_type_name), \
240 .key_offset = offsetof(private_type_name, private_key_field), \
241 .comparator = (private_comparator), \
249#define CCC_private_array_tree_map_for( \
252 private_comparator, \
254 private_memory_pointer \
256 (struct CCC_Array_tree_map) { \
257 .data = (private_memory_pointer), .nodes = NULL, .parity = NULL, \
258 .capacity = (private_capacity), .count = 0, .root = 0, .free_list = 0, \
259 .sizeof_type = sizeof(private_type_name), \
260 .key_offset = offsetof(private_type_name, private_key_field), \
261 .comparator = (private_comparator), \
265#define CCC_private_array_tree_map_from( \
267 private_comparator, \
269 private_optional_cap, \
270 private_array_compound_literal... \
272 (struct { struct CCC_Array_tree_map private; }){(__extension__({ \
273 typeof(*private_array_compound_literal) \
274 *private_array_tree_map_initializer_list \
275 = private_array_compound_literal; \
276 struct CCC_Array_tree_map private_array_tree_map \
277 = CCC_private_array_tree_map_default( \
278 typeof(*private_array_tree_map_initializer_list), \
282 size_t const private_array_tree_n \
283 = sizeof(private_array_compound_literal) \
284 / sizeof(*private_array_tree_map_initializer_list); \
285 size_t const private_cap = private_optional_cap; \
286 CCC_Allocator const *const private_array_tree_map_allocator \
287 = &(private_allocator); \
288 if (CCC_array_tree_map_reserve( \
289 &private_array_tree_map, \
290 (private_array_tree_n > private_cap ? private_array_tree_n \
292 private_array_tree_map_allocator \
294 == CCC_RESULT_OK) { \
295 for (size_t i = 0; i < private_array_tree_n; ++i) { \
296 struct CCC_Array_tree_map_handle private_array_tree_entry \
297 = CCC_private_array_tree_map_handle( \
298 &private_array_tree_map, \
301 )&private_array_tree_map_initializer_list[i] \
304 CCC_Handle_index private_index \
305 = private_array_tree_entry.index; \
306 if (!(private_array_tree_entry.status & CCC_ENTRY_OCCUPIED)) { \
307 private_index = CCC_private_array_tree_map_allocate_slot( \
308 &private_array_tree_map, \
309 private_array_tree_map_allocator \
312 *((typeof(*private_array_tree_map_initializer_list) *) \
313 CCC_private_array_tree_map_data_at( \
314 private_array_tree_entry.map, private_index \
315 )) = private_array_tree_map_initializer_list[i]; \
316 if (!(private_array_tree_entry.status & CCC_ENTRY_OCCUPIED)) { \
317 CCC_private_array_tree_map_insert( \
318 private_array_tree_entry.map, \
319 private_array_tree_entry.index, \
320 private_array_tree_entry.last_order, \
326 private_array_tree_map; \
330#define CCC_private_array_tree_map_with_capacity( \
333 private_comparator, \
337 (struct { struct CCC_Array_tree_map private; }){(__extension__({ \
338 struct CCC_Array_tree_map private_array_tree_map \
339 = CCC_private_array_tree_map_default( \
340 private_type_name, private_key_field, private_comparator \
342 (void)CCC_array_tree_map_reserve( \
343 &private_array_tree_map, private_cap, &(private_allocator) \
345 private_array_tree_map; \
349#define CCC_private_array_tree_map_with_storage( \
350 private_key_node_field, \
351 private_comparator, \
352 private_compound_literal, \
353 private_optional_storage_specifier... \
355 (struct CCC_Array_tree_map) { \
356 .data = &CCC_private_array_tree_map_storage_for( \
357 private_compound_literal, private_optional_storage_specifier \
359 .nodes = NULL, .parity = NULL, \
361 = CCC_private_array_tree_map_compound_literal_array_capacity( \
362 private_compound_literal \
364 .count = 0, .root = 0, .free_list = 0, \
365 .sizeof_type = sizeof(*(private_compound_literal)), \
366 .key_offset = offsetof( \
367 typeof(*(private_compound_literal)), private_key_node_field \
369 .comparator = (private_comparator), \
373#define CCC_private_array_tree_map_as( \
374 array_tree_map_pointer, type_name, handle... \
376 ((type_name *)CCC_private_array_tree_map_data_at( \
377 (array_tree_map_pointer), (handle) \
383#define CCC_private_array_tree_map_and_modify_with( \
384 array_tree_map_array_pointer, \
386 closure_over_closure_parameter... \
389 __auto_type private_array_tree_map_hndl_pointer \
390 = (array_tree_map_array_pointer); \
391 struct CCC_Array_tree_map_handle private_array_tree_map_mod_hndl \
392 = {.status = CCC_ENTRY_ARGUMENT_ERROR}; \
393 if (private_array_tree_map_hndl_pointer) { \
394 private_array_tree_map_mod_hndl \
395 = *private_array_tree_map_hndl_pointer; \
396 if (private_array_tree_map_mod_hndl.status & CCC_ENTRY_OCCUPIED) { \
397 closure_parameter = CCC_private_array_tree_map_data_at( \
398 private_array_tree_map_mod_hndl.map, \
399 private_array_tree_map_mod_hndl.index \
401 closure_over_closure_parameter \
404 private_array_tree_map_mod_hndl; \
408#define CCC_private_array_tree_map_or_insert_with( \
409 array_tree_map_array_pointer, \
410 private_allocator_pointer, \
411 type_compound_literal... \
414 __auto_type private_or_ins_array_pointer \
415 = (array_tree_map_array_pointer); \
416 CCC_Handle_index private_array_tree_map_or_ins_ret = 0; \
417 CCC_Allocator const *const private_array_tree_map_allocator \
418 = (private_allocator_pointer); \
419 if (private_array_tree_map_allocator \
420 && private_or_ins_array_pointer) { \
421 if (private_or_ins_array_pointer->status == CCC_ENTRY_OCCUPIED) { \
422 private_array_tree_map_or_ins_ret \
423 = private_or_ins_array_pointer->index; \
425 private_array_tree_map_or_ins_ret \
426 = CCC_private_array_tree_map_allocate_slot( \
427 private_or_ins_array_pointer->map, \
428 private_array_tree_map_allocator \
430 if (private_array_tree_map_or_ins_ret) { \
431 *((typeof(type_compound_literal) *) \
432 CCC_private_array_tree_map_data_at( \
433 private_or_ins_array_pointer->map, \
434 private_array_tree_map_or_ins_ret \
435 )) = type_compound_literal; \
436 CCC_private_array_tree_map_insert( \
437 private_or_ins_array_pointer->map, \
438 private_or_ins_array_pointer->index, \
439 private_or_ins_array_pointer->last_order, \
440 private_array_tree_map_or_ins_ret \
445 private_array_tree_map_or_ins_ret; \
449#define CCC_private_array_tree_map_insert_handle_with( \
450 array_tree_map_array_pointer, \
451 private_allocator_pointer, \
452 type_compound_literal... \
455 __auto_type private_ins_array_pointer \
456 = (array_tree_map_array_pointer); \
457 CCC_Handle_index private_array_tree_map_ins_hndl_ret = 0; \
458 CCC_Allocator const *const private_array_tree_map_allocator \
459 = (private_allocator_pointer); \
460 if (private_array_tree_map_allocator && private_ins_array_pointer) { \
461 if (!(private_ins_array_pointer->status & CCC_ENTRY_OCCUPIED)) { \
462 private_array_tree_map_ins_hndl_ret \
463 = CCC_private_array_tree_map_allocate_slot( \
464 private_ins_array_pointer->map, \
465 private_array_tree_map_allocator \
467 if (private_array_tree_map_ins_hndl_ret) { \
468 *((typeof(type_compound_literal) *) \
469 CCC_private_array_tree_map_data_at( \
470 private_ins_array_pointer->map, \
471 private_array_tree_map_ins_hndl_ret \
472 )) = type_compound_literal; \
473 CCC_private_array_tree_map_insert( \
474 private_ins_array_pointer->map, \
475 private_ins_array_pointer->index, \
476 private_ins_array_pointer->last_order, \
477 private_array_tree_map_ins_hndl_ret \
480 } else if (private_ins_array_pointer->status \
481 == CCC_ENTRY_OCCUPIED) { \
482 private_array_tree_map_ins_hndl_ret \
483 = private_ins_array_pointer->index; \
484 *((typeof(type_compound_literal) *) \
485 CCC_private_array_tree_map_data_at( \
486 private_ins_array_pointer->map, \
487 private_array_tree_map_ins_hndl_ret \
488 )) = type_compound_literal; \
491 private_array_tree_map_ins_hndl_ret; \
495#define CCC_private_array_tree_map_try_insert_with( \
496 array_tree_map_pointer, \
498 private_allocator_pointer, \
499 type_compound_literal... \
502 __auto_type private_try_ins_map_pointer = (array_tree_map_pointer); \
503 CCC_Handle private_array_tree_map_try_ins_hndl_ret \
504 = {.status = CCC_ENTRY_ARGUMENT_ERROR}; \
505 CCC_Allocator const *const private_array_tree_map_allocator \
506 = (private_allocator_pointer); \
507 if (private_array_tree_map_allocator && private_try_ins_map_pointer) { \
508 __auto_type private_array_tree_map_key = (key); \
509 struct CCC_Array_tree_map_handle \
510 private_array_tree_map_try_ins_hndl \
511 = CCC_private_array_tree_map_handle( \
512 private_try_ins_map_pointer, \
513 (void *)&private_array_tree_map_key \
515 if (!(private_array_tree_map_try_ins_hndl.status \
516 & CCC_ENTRY_OCCUPIED)) { \
517 private_array_tree_map_try_ins_hndl_ret = (CCC_Handle){ \
518 .index = CCC_private_array_tree_map_allocate_slot( \
519 private_array_tree_map_try_ins_hndl.map, \
520 private_array_tree_map_allocator \
522 .status = CCC_ENTRY_INSERT_ERROR, \
524 if (private_array_tree_map_try_ins_hndl_ret.index) { \
525 *((typeof(type_compound_literal) *) \
526 CCC_private_array_tree_map_data_at( \
527 private_try_ins_map_pointer, \
528 private_array_tree_map_try_ins_hndl_ret.index \
529 )) = type_compound_literal; \
530 *((typeof(private_array_tree_map_key) *) \
531 CCC_private_array_tree_map_key_at( \
532 private_try_ins_map_pointer, \
533 private_array_tree_map_try_ins_hndl_ret.index \
534 )) = private_array_tree_map_key; \
535 CCC_private_array_tree_map_insert( \
536 private_array_tree_map_try_ins_hndl.map, \
537 private_array_tree_map_try_ins_hndl.index, \
538 private_array_tree_map_try_ins_hndl.last_order, \
539 private_array_tree_map_try_ins_hndl_ret.index \
541 private_array_tree_map_try_ins_hndl_ret.status \
542 = CCC_ENTRY_VACANT; \
544 } else if (private_array_tree_map_try_ins_hndl.status \
545 == CCC_ENTRY_OCCUPIED) { \
546 private_array_tree_map_try_ins_hndl_ret = (CCC_Handle){ \
547 .index = private_array_tree_map_try_ins_hndl.index, \
548 .status = private_array_tree_map_try_ins_hndl.status, \
552 private_array_tree_map_try_ins_hndl_ret; \
556#define CCC_private_array_tree_map_insert_or_assign_with( \
557 array_tree_map_pointer, \
559 private_allocator_pointer, \
560 type_compound_literal... \
563 __auto_type private_ins_or_assign_map_pointer \
564 = (array_tree_map_pointer); \
565 CCC_Handle private_array_tree_map_ins_or_assign_hndl_ret \
566 = {.status = CCC_ENTRY_ARGUMENT_ERROR}; \
567 CCC_Allocator const *const private_array_tree_map_allocator \
568 = (private_allocator_pointer); \
569 if (private_array_tree_map_allocator \
570 && private_ins_or_assign_map_pointer) { \
571 __auto_type private_array_tree_map_key = (key); \
572 struct CCC_Array_tree_map_handle \
573 private_array_tree_map_ins_or_assign_hndl \
574 = CCC_private_array_tree_map_handle( \
575 private_ins_or_assign_map_pointer, \
576 (void *)&private_array_tree_map_key \
578 if (!(private_array_tree_map_ins_or_assign_hndl.status \
579 & CCC_ENTRY_OCCUPIED)) { \
580 private_array_tree_map_ins_or_assign_hndl_ret = (CCC_Handle){ \
581 .index = CCC_private_array_tree_map_allocate_slot( \
582 private_array_tree_map_ins_or_assign_hndl.map, \
583 private_array_tree_map_allocator \
585 .status = CCC_ENTRY_INSERT_ERROR, \
587 if (private_array_tree_map_ins_or_assign_hndl_ret.index) { \
588 *((typeof(type_compound_literal) *) \
589 CCC_private_array_tree_map_data_at( \
590 private_array_tree_map_ins_or_assign_hndl.map, \
591 private_array_tree_map_ins_or_assign_hndl_ret \
593 )) = type_compound_literal; \
594 *((typeof(private_array_tree_map_key) *) \
595 CCC_private_array_tree_map_key_at( \
596 private_array_tree_map_ins_or_assign_hndl.map, \
597 private_array_tree_map_ins_or_assign_hndl_ret \
599 )) = private_array_tree_map_key; \
600 CCC_private_array_tree_map_insert( \
601 private_array_tree_map_ins_or_assign_hndl.map, \
602 private_array_tree_map_ins_or_assign_hndl.index, \
603 private_array_tree_map_ins_or_assign_hndl.last_order, \
604 private_array_tree_map_ins_or_assign_hndl_ret.index \
606 private_array_tree_map_ins_or_assign_hndl_ret.status \
607 = CCC_ENTRY_VACANT; \
609 } else if (private_array_tree_map_ins_or_assign_hndl.status \
610 == CCC_ENTRY_OCCUPIED) { \
611 *((typeof(type_compound_literal) *) \
612 CCC_private_array_tree_map_data_at( \
613 private_array_tree_map_ins_or_assign_hndl.map, \
614 private_array_tree_map_ins_or_assign_hndl.index \
615 )) = type_compound_literal; \
616 private_array_tree_map_ins_or_assign_hndl_ret = (CCC_Handle){ \
617 .index = private_array_tree_map_ins_or_assign_hndl.index, \
619 = private_array_tree_map_ins_or_assign_hndl.status, \
621 *((typeof(private_array_tree_map_key) *) \
622 CCC_private_array_tree_map_key_at( \
623 private_array_tree_map_ins_or_assign_hndl.map, \
624 private_array_tree_map_ins_or_assign_hndl.index \
625 )) = private_array_tree_map_key; \
628 private_array_tree_map_ins_or_assign_hndl_ret; \
The type passed by reference to any container function that may need to allocate memory....
Definition: types.h:376
Definition: private_array_tree_map.h:155
CCC_Order last_order
Definition: private_array_tree_map.h:161
size_t index
Definition: private_array_tree_map.h:159
struct CCC_Array_tree_map * map
Definition: private_array_tree_map.h:157
CCC_Entry_status status
Definition: private_array_tree_map.h:163
Definition: private_array_tree_map.h:34
size_t parent
Definition: private_array_tree_map.h:39
size_t branch[2]
Definition: private_array_tree_map.h:36
size_t next_free
Definition: private_array_tree_map.h:41
Definition: private_array_tree_map.h:131
void * data
Definition: private_array_tree_map.h:133
unsigned * parity
Definition: private_array_tree_map.h:137
size_t sizeof_type
Definition: private_array_tree_map.h:147
size_t count
Definition: private_array_tree_map.h:145
size_t capacity
Definition: private_array_tree_map.h:143
size_t root
Definition: private_array_tree_map.h:139
size_t free_list
Definition: private_array_tree_map.h:141
struct CCC_Array_tree_map_node * nodes
Definition: private_array_tree_map.h:135
CCC_Key_comparator comparator
Definition: private_array_tree_map.h:151
size_t key_offset
Definition: private_array_tree_map.h:149
The type passed by reference to any container function that may need to compare keys....
Definition: types.h:512
CCC_Order
A three-way comparison for comparison functions.
Definition: types.h:214
CCC_Entry_status
The status monitoring and entry state once it is obtained.
Definition: types.h:112