C Container Collection (CCC)
Loading...
Searching...
No Matches
tree_map.h
Go to the documentation of this file.
1
32#ifndef CCC_TREE_MAP_H
33#define CCC_TREE_MAP_H
34
36#include <stddef.h>
39#include "private/private_tree_map.h"
40#include "types.h"
41
53
64
70
88#define CCC_tree_map_initialize(type_name, type_intruder_field_name, \
89 type_key_field_name, compare, allocate, \
90 context_data) \
91 CCC_private_tree_map_initialize(type_name, type_intruder_field_name, \
92 type_key_field_name, compare, allocate, \
93 context_data)
94
115#define CCC_tree_map_from(type_intruder_field_name, type_key_field_name, \
116 compare, allocate, destroy, context_data, \
117 compound_literal_array...) \
118 CCC_private_tree_map_from(type_intruder_field_name, type_key_field_name, \
119 compare, allocate, destroy, context_data, \
120 compound_literal_array)
121
134 void const *key);
135
140[[nodiscard]] void *CCC_tree_map_get_key_value(CCC_Tree_map const *map,
141 void const *key);
142
162[[nodiscard]] CCC_Entry
164 CCC_Tree_map_node *temp_intruder);
165
181#define CCC_tree_map_swap_entry_wrap(map_pointer, type_intruder_pointer, \
182 temp_intruder_pointer) \
183 &(CCC_Entry) \
184 { \
185 CCC_tree_map_swap_entry((map_pointer), (type_intruder_pointer), \
186 (temp_intruder_pointer)) \
187 .private \
188 }
189
197[[nodiscard]] CCC_Entry
199
209#define CCC_tree_map_try_insert_wrap(map_pointer, type_intruder_pointer) \
210 &(CCC_Entry) \
211 { \
212 CCC_tree_map_try_insert((map_pointer), (type_intruder_pointer)) \
213 .private \
214 }
215
229#define CCC_tree_map_try_insert_with(map_pointer, key, \
230 type_compound_literal...) \
231 &(CCC_Entry) \
232 { \
233 CCC_private_tree_map_try_insert_with(map_pointer, key, \
234 type_compound_literal) \
235 }
236
245[[nodiscard]] CCC_Entry
247 CCC_Tree_map_node *type_intruder);
248
261#define CCC_tree_map_insert_or_assign_wrap(map_pointer, \
262 type_intruder_pointer...) \
263 &(CCC_Entry) \
264 { \
265 CCC_tree_map_insert_or_assign((map_pointer), type_intruder_pointer) \
266 .private \
267 }
268
282#define CCC_tree_map_insert_or_assign_with(map_pointer, key, \
283 type_compound_literal...) \
284 &(CCC_Entry) \
285 { \
286 CCC_private_tree_map_insert_or_assign_with(map_pointer, key, \
287 type_compound_literal) \
288 }
289
305[[nodiscard]] CCC_Entry
307 CCC_Tree_map_node *output_intruder);
308
325#define CCC_tree_map_remove_key_value_wrap(map_pointer, \
326 output_intruder_pointer) \
327 &(CCC_Entry) \
328 { \
329 CCC_tree_map_remove_key_value((map_pointer), \
330 (output_intruder_pointer)) \
331 .private \
332 }
333
349 void const *key);
350
367#define CCC_tree_map_entry_wrap(map_pointer, key_pointer) \
368 &(CCC_Tree_map_entry) \
369 { \
370 CCC_tree_map_entry((map_pointer), (key_pointer)).private \
371 }
372
382[[nodiscard]] CCC_Tree_map_entry *
384
393[[nodiscard]] CCC_Tree_map_entry *
395 CCC_Type_modifier *modify, void *context);
396
433#define CCC_tree_map_and_modify_with(map_pointer, type_name, \
434 closure_over_T...) \
435 &(CCC_Tree_map_entry) \
436 { \
437 CCC_private_tree_map_and_modify_with(map_pointer, type_name, \
438 closure_over_T) \
439 }
440
453[[nodiscard]] void *CCC_tree_map_or_insert(CCC_Tree_map_entry const *entry,
454 CCC_Tree_map_node *type_intruder);
455
467#define CCC_tree_map_or_insert_with(map_pointer, type_compound_literal...) \
468 CCC_private_tree_map_or_insert_with(map_pointer, type_compound_literal)
469
477[[nodiscard]] void *CCC_tree_map_insert_entry(CCC_Tree_map_entry const *entry,
478 CCC_Tree_map_node *type_intruder);
479
486#define CCC_tree_map_insert_entry_with(map_pointer, type_compound_literal...) \
487 CCC_private_tree_map_insert_entry_with(map_pointer, type_compound_literal)
488
499[[nodiscard]] CCC_Entry
501
512#define CCC_tree_map_remove_entry_wrap(map_pointer) \
513 &(CCC_Entry) \
514 { \
515 CCC_tree_map_remove_entry((map_pointer)).private \
516 }
517
521[[nodiscard]] void *CCC_tree_map_unwrap(CCC_Tree_map_entry const *entry);
522
526[[nodiscard]] CCC_Tribool
528
534[[nodiscard]] CCC_Tribool
536
546[[nodiscard]] CCC_Entry_status
548
570
596 void const *begin_key,
597 void const *end_key);
598
606#define CCC_tree_map_equal_range_wrap(map_pointer, \
607 begin_and_end_key_pointers...) \
608 &(CCC_Range) \
609 { \
610 CCC_tree_map_equal_range((map_pointer), (begin_and_end_key_pointers)) \
611 .private \
612 }
613
635[[nodiscard]] CCC_Range_reverse
637 void const *reverse_begin_key,
638 void const *reverse_end_key);
639
647#define CCC_tree_map_equal_range_reverse_wrap( \
648 map_pointer, reverse_begin_and_reverse_end_key_pointers...) \
649 &(CCC_Range_reverse) \
650 { \
651 CCC_tree_map_equal_range_reverse( \
652 (map_pointer), (reverse_begin_and_reverse_end_key_pointers)) \
653 .private \
654 }
655
660[[nodiscard]] void *CCC_tree_map_begin(CCC_Tree_map const *map);
661
666[[nodiscard]] void *CCC_tree_map_reverse_begin(CCC_Tree_map const *map);
667
673[[nodiscard]] void *
675 CCC_Tree_map_node const *iterator_intruder);
676
684[[nodiscard]] void *
686 CCC_Tree_map_node const *iterator_intruder);
687
691[[nodiscard]] void *CCC_tree_map_end(CCC_Tree_map const *map);
692
697[[nodiscard]] void *CCC_tree_map_reverse_end(CCC_Tree_map const *map);
698
708[[nodiscard]] CCC_Count CCC_tree_map_count(CCC_Tree_map const *map);
709
714
720
725#ifdef TREE_MAP_USING_NAMESPACE_CCC
726typedef CCC_Tree_map_node Tree_map_node;
727typedef CCC_Tree_map Tree_map;
728typedef CCC_Tree_map_entry Tree_map_entry;
729# define tree_map_initialize(args...) CCC_tree_map_initialize(args)
730# define tree_map_from(args...) CCC_tree_map_from(args)
731# define tree_map_and_modify_with(args...) CCC_tree_map_and_modify_with(args)
732# define tree_map_or_insert_with(args...) CCC_tree_map_or_insert_with(args)
733# define tree_map_insert_entry_with(args...) \
734 CCC_tree_map_insert_entry_with(args)
735# define tree_map_try_insert_with(args...) CCC_tree_map_try_insert_with(args)
736# define tree_map_insert_or_assign(args...) \
737 CCC_tree_map_insert_or_assign(args)
738# define tree_map_insert_or_assign_wrap(args...) \
739 CCC_tree_map_insert_or_assign_wrap(args)
740# define tree_map_insert_or_assign_with(args...) \
741 CCC_tree_map_insert_or_assign_with(args)
742# define tree_map_swap_entry_wrap(args...) CCC_tree_map_swap_entry_wrap(args)
743# define tree_map_remove_key_value_wrap(args...) \
744 CCC_tree_map_remove_key_value_wrap(args)
745# define tree_map_remove_entry_wrap(args...) \
746 CCC_tree_map_remove_entry_wrap(args)
747# define tree_map_entry_wrap(args...) CCC_tree_map_entry_wrap(args)
748# define tree_map_and_modify_wrap(args...) CCC_tree_map_and_modify_wrap(args)
749# define tree_map_and_modify_context_wrap(args...) \
750 CCC_tree_map_and_modify_context_wrap(args)
751# define tree_map_contains(args...) CCC_tree_map_contains(args)
752# define tree_map_get_key_value(args...) CCC_tree_map_get_key_value(args)
753# define tree_map_get_mut(args...) CCC_tree_map_get_mut(args)
754# define tree_map_swap_entry(args...) CCC_tree_map_swap_entry(args)
755# define tree_map_remove_key_value(args...) \
756 CCC_tree_map_remove_key_value(args)
757# define tree_map_entry(args...) CCC_tree_map_entry(args)
758# define tree_map_remove_entry(args...) CCC_tree_map_remove_entry(args)
759# define tree_map_or_insert(args...) CCC_tree_map_or_insert(args)
760# define tree_map_insert_entry(args...) CCC_tree_map_insert_entry(args)
761# define tree_map_unwrap(args...) CCC_tree_map_unwrap(args)
762# define tree_map_unwrap_mut(args...) CCC_tree_map_unwrap_mut(args)
763# define tree_map_begin(args...) CCC_tree_map_begin(args)
764# define tree_map_next(args...) CCC_tree_map_next(args)
765# define tree_map_reverse_begin(args...) CCC_tree_map_reverse_begin(args)
766# define tree_map_reverse_next(args...) CCC_tree_map_reverse_next(args)
767# define tree_map_end(args...) CCC_tree_map_end(args)
768# define tree_map_reverse_end(args...) CCC_tree_map_reverse_end(args)
769# define tree_map_count(args...) CCC_tree_map_count(args)
770# define tree_map_is_empty(args...) CCC_tree_map_is_empty(args)
771# define tree_map_clear(args...) CCC_tree_map_clear(args)
772# define tree_map_validate(args...) CCC_tree_map_validate(args)
773#endif
774
775#endif /* CCC_TREE_MAP_H */
A type for returning an unsigned integer from a container for counting. Intended to count sizes,...
Definition: types.h:202
Definition: private_types.h:53
Definition: private_types.h:112
Definition: private_tree_map.h:78
Definition: private_tree_map.h:32
Definition: private_tree_map.h:54
CCC_Tribool CCC_tree_map_is_empty(CCC_Tree_map const *map)
Returns the size status of the map.
CCC_Tribool CCC_tree_map_validate(CCC_Tree_map const *map)
Validation of invariants for the map.
void * CCC_tree_map_reverse_begin(CCC_Tree_map const *map)
Return the start of a reverse inorder traversal of the map. Amortized O(lg N).
CCC_Range CCC_tree_map_equal_range(CCC_Tree_map const *map, void const *begin_key, void const *end_key)
Return an iterable range of values from [begin_key, end_key). Amortized O(lg N).
CCC_Entry_status CCC_tree_map_entry_status(CCC_Tree_map_entry const *entry)
Obtain the entry status from a container entry.
CCC_Range_reverse CCC_tree_map_equal_range_reverse(CCC_Tree_map const *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_Tribool CCC_tree_map_insert_error(CCC_Tree_map_entry const *entry)
Returns the Vacant or Occupied status of the entry.
CCC_Tree_map_entry CCC_tree_map_entry(CCC_Tree_map const *map, void const *key)
Obtains an entry for the provided key in the map for future use.
CCC_Tribool CCC_tree_map_contains(CCC_Tree_map const *map, void const *key)
Searches the map for the presence of key.
void * CCC_tree_map_next(CCC_Tree_map const *map, CCC_Tree_map_node const *iterator_intruder)
Return the next element in an inorder traversal of the map. O(1).
CCC_Entry CCC_tree_map_swap_entry(CCC_Tree_map *map, CCC_Tree_map_node *type_intruder, CCC_Tree_map_node *temp_intruder)
Invariantly inserts the key value wrapping type_intruder.
void * CCC_tree_map_end(CCC_Tree_map const *map)
Return the end of an inorder traversal of the map. O(1).
CCC_Entry CCC_tree_map_remove_key_value(CCC_Tree_map *map, CCC_Tree_map_node *output_intruder)
Removes the key value in the map storing the old value, if present, in the struct containing output_i...
CCC_Count CCC_tree_map_count(CCC_Tree_map const *map)
Returns the count of map occupied nodes.
CCC_Result CCC_tree_map_clear(CCC_Tree_map *map, CCC_Type_destructor *destroy)
Pops every element from the map calling destructor if destructor is non-NULL. O(N).
CCC_Tree_map_entry * CCC_tree_map_and_modify_context(CCC_Tree_map_entry *entry, CCC_Type_modifier *modify, void *context)
Modifies the provided entry if it is Occupied.
void * CCC_tree_map_reverse_next(CCC_Tree_map const *map, CCC_Tree_map_node const *iterator_intruder)
Return the reverse_next element in a reverse inorder traversal of the map. O(1).
CCC_Entry CCC_tree_map_try_insert(CCC_Tree_map *map, CCC_Tree_map_node *type_intruder)
Attempts to insert the key value wrapping type_intruder.
CCC_Entry CCC_tree_map_insert_or_assign(CCC_Tree_map *map, CCC_Tree_map_node *type_intruder)
Invariantly inserts or overwrites a user struct into the map.
void * CCC_tree_map_insert_entry(CCC_Tree_map_entry const *entry, CCC_Tree_map_node *type_intruder)
Inserts the provided entry invariantly.
CCC_Tree_map_entry * CCC_tree_map_and_modify(CCC_Tree_map_entry *entry, CCC_Type_modifier *modify)
Modifies the provided entry if it is Occupied.
void * CCC_tree_map_reverse_end(CCC_Tree_map const *map)
Return the reverse_end of a reverse inorder traversal of the map. O(1).
CCC_Tribool CCC_tree_map_occupied(CCC_Tree_map_entry const *entry)
Provides the status of the entry should an insertion follow.
void * CCC_tree_map_or_insert(CCC_Tree_map_entry const *entry, CCC_Tree_map_node *type_intruder)
Inserts the struct with handle type_intruder if the entry is Vacant.
void * CCC_tree_map_unwrap(CCC_Tree_map_entry const *entry)
Unwraps the provided entry to obtain a view into the map element.
void * CCC_tree_map_begin(CCC_Tree_map const *map)
Return the start of an inorder traversal of the map. Amortized O(lg N).
void * CCC_tree_map_get_key_value(CCC_Tree_map const *map, void const *key)
Returns a reference into the map at entry key.
CCC_Entry CCC_tree_map_remove_entry(CCC_Tree_map_entry const *entry)
Remove the entry from the map if Occupied.
The C Container Collection Fundamental Types.
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:133
void CCC_Type_destructor(CCC_Type_context)
A callback function for destroying an element in the container.
Definition: types.h:376
CCC_Result
A result of actions on containers.
Definition: types.h:148
void CCC_Type_modifier(CCC_Type_context)
A callback function for modifying an element in the container.
Definition: types.h:358
Definition: private_types.h:160
Definition: private_tree_map.h:94