39#ifndef CCC_ADAPTIVE_MAP_H
40#define CCC_ADAPTIVE_MAP_H
88#define CCC_adaptive_map_default( \
89 struct_name, type_intruder_field_name, type_key_field_name, comparator \
91 CCC_private_adaptive_map_default( \
92 struct_name, type_intruder_field_name, type_key_field_name, comparator \
101#define CCC_adaptive_map_for( \
102 struct_name, type_intruder_field_name, type_key_field_name, comparator \
104 CCC_private_adaptive_map_for( \
105 struct_name, type_intruder_field_name, type_key_field_name, comparator \
125#define CCC_adaptive_map_from( \
126 type_intruder_field_name, \
127 type_key_field_name, \
131 compound_literal_array... \
133 CCC_private_adaptive_map_from( \
134 type_intruder_field_name, \
135 type_key_field_name, \
139 compound_literal_array \
205#define CCC_adaptive_map_swap_entry_wrap( \
207 type_intruder_pointer, \
208 temp_intruder_pointer, \
209 allocator_pointer... \
211 &(struct { CCC_Entry private; }){CCC_adaptive_map_swap_entry( \
213 (type_intruder_pointer), \
214 (temp_intruder_pointer), \
243#define CCC_adaptive_map_try_insert_wrap( \
244 map_pointer, type_intruder_pointer, allocator_pointer... \
246 &(struct { CCC_Entry private; }){ \
247 CCC_adaptive_map_try_insert( \
248 (map_pointer), (type_intruder_pointer), allocator_pointer \
266#define CCC_adaptive_map_try_insert_with( \
267 map_pointer, key, allocator_pointer, compound_literal_type... \
269 &(struct { CCC_Entry private; }){ \
270 CCC_private_adaptive_map_try_insert_with( \
271 map_pointer, key, allocator_pointer, compound_literal_type \
299#define CCC_adaptive_map_insert_or_assign_wrap( \
300 map_pointer, type_pointer, allocator_pointer... \
302 &(struct { CCC_Entry private; }){ \
303 CCC_adaptive_map_insert_or_assign( \
304 map_pointer, type_pointer, allocator_pointer \
322#define CCC_adaptive_map_insert_or_assign_with( \
323 map_pointer, key, allocator_pointer, compound_literal_type... \
325 &(struct { CCC_Entry private; }){ \
326 CCC_private_adaptive_map_insert_or_assign_with( \
327 map_pointer, key, allocator_pointer, compound_literal_type \
370#define CCC_adaptive_map_remove_key_value_wrap( \
371 map_pointer, type_output_intruder_pointer, allocator_pointer... \
373 &(struct { CCC_Entry private; }){ \
374 CCC_adaptive_map_remove_key_value( \
375 (map_pointer), (type_output_intruder_pointer), allocator_pointer \
412#define CCC_adaptive_map_entry_wrap(map_pointer, key_pointer...) \
413 &(struct { CCC_Adaptive_map_entry private; }){ \
414 CCC_adaptive_map_entry((map_pointer), key_pointer)} \
460#define CCC_adaptive_map_and_modify_with( \
461 adaptive_map_entry_pointer, \
463 closure_over_closure_parameter... \
465 &(struct { CCC_Adaptive_map_entry private; }){ \
466 CCC_private_adaptive_map_and_modify_with( \
467 adaptive_map_entry_pointer, \
469 closure_over_closure_parameter \
505#define CCC_adaptive_map_or_insert_with( \
506 adaptive_map_entry_pointer, allocator_pointer, type_compound_literal... \
508 CCC_private_adaptive_map_or_insert_with( \
509 adaptive_map_entry_pointer, allocator_pointer, type_compound_literal \
533#define CCC_adaptive_map_insert_entry_with( \
534 adaptive_map_entry_pointer, allocator_pointer, type_compound_literal... \
536 CCC_private_adaptive_map_insert_entry_with( \
537 adaptive_map_entry_pointer, allocator_pointer, type_compound_literal \
566#define CCC_adaptive_map_remove_entry_wrap( \
567 adaptive_map_entry_pointer, allocator_pointer... \
569 &(struct { CCC_Entry private; }){ \
570 CCC_adaptive_map_remove_entry( \
571 (adaptive_map_entry_pointer), allocator_pointer \
644#define CCC_adaptive_map_equal_range_wrap( \
645 map_pointer, begin_and_end_key_pointers... \
647 &(struct { CCC_Range private; }){ \
648 CCC_adaptive_map_equal_range(map_pointer, begin_and_end_key_pointers)} \
676 void const *reverse_begin_key,
677 void const *reverse_end_key
687#define CCC_adaptive_map_equal_range_reverse_wrap( \
688 map_pointer, reverse_begin_and_reverse_end_key_pointers... \
690 &(struct { CCC_Range_reverse private; }){ \
691 CCC_adaptive_map_equal_range_reverse( \
692 map_pointer, reverse_begin_and_reverse_end_key_pointers \
790#ifdef ADAPTIVE_MAP_USING_NAMESPACE_CCC
795# define adaptive_map_default(arguments...) \
796 CCC_adaptive_map_default(arguments)
797# define adaptive_map_for(arguments...) CCC_adaptive_map_for(arguments)
798# define adaptive_map_from(arguments...) CCC_adaptive_map_from(arguments)
799# define adaptive_map_and_modify_with(arguments...) \
800 CCC_adaptive_map_and_modify_with(arguments)
801# define adaptive_map_or_insert_with(arguments...) \
802 CCC_adaptive_map_or_insert_with(arguments)
803# define adaptive_map_insert_entry_with(arguments...) \
804 CCC_adaptive_map_insert_entry_with(arguments)
805# define adaptive_map_try_insert_wrap(arguments...) \
806 CCC_adaptive_map_try_insert_wrap(arguments)
807# define adaptive_map_try_insert_with(arguments...) \
808 CCC_adaptive_map_try_insert_with(arguments)
809# define adaptive_map_insert_or_assign(arguments...) \
810 CCC_adaptive_map_insert_or_assign(arguments)
811# define adaptive_map_insert_or_assign_wrap(arguments...) \
812 CCC_adaptive_map_insert_or_assign_wrap(arguments)
813# define adaptive_map_insert_or_assign_with(arguments...) \
814 CCC_adaptive_map_insert_or_assign_with(arguments)
815# define adaptive_map_swap_entry_wrap(arguments...) \
816 CCC_adaptive_map_swap_entry_wrap(arguments)
817# define adaptive_map_remove_key_value_wrap(arguments...) \
818 CCC_adaptive_map_remove_key_value_wrap(arguments)
819# define adaptive_map_remove_entry_wrap(arguments...) \
820 CCC_adaptive_map_remove_entry_wrap(arguments)
821# define adaptive_map_entry_wrap(arguments...) \
822 CCC_adaptive_map_entry_wrap(arguments)
823# define adaptive_map_and_modify(arguments...) \
824 CCC_adaptive_map_and_modify(arguments)
825# define adaptive_map_and_modify_wrap(arguments...) \
826 CCC_adaptive_map_and_modify_wrap(arguments)
827# define adaptive_map_contains(arguments...) \
828 CCC_adaptive_map_contains(arguments)
829# define adaptive_map_get_key_value(arguments...) \
830 CCC_adaptive_map_get_key_value(arguments)
831# define adaptive_map_get_mut(arguments...) \
832 CCC_adaptive_map_get_mut(arguments)
833# define adaptive_map_swap_entry(arguments...) \
834 CCC_adaptive_map_swap_entry(arguments)
835# define adaptive_map_remove_key_value(arguments...) \
836 CCC_adaptive_map_remove_key_value(arguments)
837# define adaptive_map_entry(arguments...) CCC_adaptive_map_entry(arguments)
838# define adaptive_map_remove_entry(arguments...) \
839 CCC_adaptive_map_remove_entry(arguments)
840# define adaptive_map_or_insert(arguments...) \
841 CCC_adaptive_map_or_insert(arguments)
842# define adaptive_map_insert_entry(arguments...) \
843 CCC_adaptive_map_insert_entry(arguments)
844# define adaptive_map_unwrap(arguments...) CCC_adaptive_map_unwrap(arguments)
845# define adaptive_map_unwrap_mut(arguments...) \
846 CCC_adaptive_map_unwrap_mut(arguments)
847# define adaptive_map_begin(arguments...) CCC_adaptive_map_begin(arguments)
848# define adaptive_map_next(arguments...) CCC_adaptive_map_next(arguments)
849# define adaptive_map_reverse_begin(arguments...) \
850 CCC_adaptive_map_reverse_begin(arguments)
851# define adaptive_map_reverse_next(arguments...) \
852 CCC_adaptive_map_reverse_next(arguments)
853# define adaptive_map_equal_range(arguments...) \
854 CCC_adaptive_map_equal_range(arguments)
855# define adaptive_map_equal_range_wrap(arguments...) \
856 CCC_adaptive_map_equal_range_wrap(arguments)
857# define adaptive_map_equal_range_reverse(arguments...) \
858 CCC_adaptive_map_equal_range_reverse(arguments)
859# define adaptive_map_equal_range_reverse_wrap(arguments...) \
860 CCC_adaptive_map_equal_range_reverse_wrap(arguments)
861# define adaptive_map_end(arguments...) CCC_adaptive_map_end(arguments)
862# define adaptive_map_reverse_end(arguments...) \
863 CCC_adaptive_map_reverse_end(arguments)
864# define adaptive_map_count(arguments...) CCC_adaptive_map_count(arguments)
865# define adaptive_map_is_empty(arguments...) \
866 CCC_adaptive_map_is_empty(arguments)
867# define adaptive_map_clear(arguments...) CCC_adaptive_map_clear(arguments)
868# define adaptive_map_validate(arguments...) \
869 CCC_adaptive_map_validate(arguments)
870# define adaptive_map_entry_status(arguments...) \
871 CCC_adaptive_map_entry_status(arguments)
CCC_Range CCC_adaptive_map_equal_range(CCC_Adaptive_map *map, void const *begin_key, void const *end_key)
Return an iterable range of values from [begin_key, end_key). Amortized O(lg N).
void * CCC_adaptive_map_reverse_end(CCC_Adaptive_map const *map)
Return the reverse_end of a reverse inorder traversal of the map. O(1).
CCC_Tribool CCC_adaptive_map_validate(CCC_Adaptive_map const *map)
Validation of invariants for the map.
CCC_Entry_status CCC_adaptive_map_entry_status(CCC_Adaptive_map_entry const *entry)
Obtain the entry status from a container entry.
void * CCC_adaptive_map_next(CCC_Adaptive_map const *map, CCC_Adaptive_map_node const *iterator_intruder)
Return the next element in an inorder traversal of the map. O(1).
CCC_Adaptive_map_entry * CCC_adaptive_map_and_modify(CCC_Adaptive_map_entry *entry, CCC_Modifier const *modifier)
Modifies the provided entry if it is Occupied.
CCC_Entry CCC_adaptive_map_remove_key_value(CCC_Adaptive_map *map, CCC_Adaptive_map_node *type_output_intruder, CCC_Allocator const *allocator)
Removes the key value in the map storing the old value, if present, in the struct containing type_out...
CCC_Tribool CCC_adaptive_map_contains(CCC_Adaptive_map *map, void const *key)
Searches the map for the presence of key.
CCC_Entry CCC_adaptive_map_remove_entry(CCC_Adaptive_map_entry *entry, CCC_Allocator const *allocator)
Remove the entry from the map if Occupied.
CCC_Entry CCC_adaptive_map_swap_entry(CCC_Adaptive_map *map, CCC_Adaptive_map_node *type_intruder, CCC_Adaptive_map_node *temp_intruder, CCC_Allocator const *allocator)
Invariantly inserts the key value wrapping type_intruder.
void * CCC_adaptive_map_insert_entry(CCC_Adaptive_map_entry const *entry, CCC_Adaptive_map_node *type_intruder, CCC_Allocator const *allocator)
Inserts the provided entry invariantly.
CCC_Tribool CCC_adaptive_map_insert_error(CCC_Adaptive_map_entry const *entry)
Provides the status of the entry should an insertion follow.
void * CCC_adaptive_map_reverse_next(CCC_Adaptive_map const *map, CCC_Adaptive_map_node const *iterator_intruder)
Return the reverse_next element in a reverse inorder traversal of the map. O(1).
CCC_Result CCC_adaptive_map_clear(CCC_Adaptive_map *map, CCC_Destructor const *destructor, CCC_Allocator const *allocator)
Pops every element from the map calling destructor if destructor is non-NULL. O(N).
CCC_Adaptive_map_entry CCC_adaptive_map_entry(CCC_Adaptive_map *map, void const *key)
Obtains an entry for the provided key in the map for future use.
CCC_Entry CCC_adaptive_map_try_insert(CCC_Adaptive_map *map, CCC_Adaptive_map_node *type_intruder, CCC_Allocator const *allocator)
Attempts to insert the key value wrapping type_intruder.
CCC_Tribool CCC_adaptive_map_is_empty(CCC_Adaptive_map const *map)
Returns the size status of the map.
CCC_Entry CCC_adaptive_map_insert_or_assign(CCC_Adaptive_map *map, CCC_Adaptive_map_node *type_intruder, CCC_Allocator const *allocator)
Invariantly inserts or overwrites a user struct into the map.
void * CCC_adaptive_map_end(CCC_Adaptive_map const *map)
Return the end of an inorder traversal of the map. O(1).
void * CCC_adaptive_map_begin(CCC_Adaptive_map const *map)
Return the start of an inorder traversal of the map. Amortized O(lg N).
void * CCC_adaptive_map_get_key_value(CCC_Adaptive_map *map, void const *key)
Returns a reference into the map at entry key.
void * CCC_adaptive_map_reverse_begin(CCC_Adaptive_map const *map)
Return the start of a reverse inorder traversal of the map. Amortized O(lg N).
void * CCC_adaptive_map_or_insert(CCC_Adaptive_map_entry const *entry, CCC_Adaptive_map_node *type_intruder, CCC_Allocator const *allocator)
Inserts the struct with handle type_intruder if the entry is Vacant.
CCC_Tribool CCC_adaptive_map_occupied(CCC_Adaptive_map_entry const *entry)
Returns the Vacant or Occupied status of the entry.
void * CCC_adaptive_map_unwrap(CCC_Adaptive_map_entry const *entry)
Unwraps the provided entry to obtain a view into the map element.
CCC_Range_reverse CCC_adaptive_map_equal_range_reverse(CCC_Adaptive_map *map, void const *reverse_begin_key, void const *reverse_end_key)
Return an iterable range_reverse of values from [begin_key, end_key). Amortized O(lg N).
CCC_Count CCC_adaptive_map_count(CCC_Adaptive_map const *map)
Returns the count of occupied map nodes.
The Adaptive Map Private Interface.
Definition: private_adaptive_map.h:85
CCC_Entry entry
Definition: private_adaptive_map.h:89
struct CCC_Adaptive_map * map
Definition: private_adaptive_map.h:87
Definition: private_adaptive_map.h:42
Definition: private_adaptive_map.h:56
The type passed by reference to any container function that may need to allocate memory....
Definition: types.h:376
A type for returning an unsigned integer from a container for counting. Intended to count sizes,...
Definition: types.h:244
The type passed by reference to any container function that may need to destroy elements....
Definition: types.h:464
An Occupied or Vacant position in a searchable container.
Definition: types.h:135
The type passed by reference to any container function that may need to modify elements....
Definition: types.h:436
The result of a range_reverse query on iterable containers.
Definition: types.h:55
The result of a range query on iterable containers.
Definition: types.h:42
The C Container Collection Fundamental Types.
CCC_Entry_status
The status monitoring and entry state once it is obtained.
Definition: types.h:112
CCC_Tribool
A three state boolean to allow for an error state. Error is -1, False is 0, and True is 1.
Definition: types.h:178
CCC_Result
A result of actions on containers.
Definition: types.h:192