28#ifndef LIBDICT_TR_TREE_H__
29#define LIBDICT_TR_TREE_H__
int(* dict_compare_func)(const void *, const void *)
A pointer to a function that compares two keys.
void(* dict_delete_func)(void *, void *)
A pointer to a function that is called when a key-value pair gets removed from a dictionary.
unsigned(* dict_prio_func)(const void *)
A pointer to a function that returns the priority of a key, used by tr_tree (a treap).
bool(* dict_visit_func)(const void *, void *, void *)
A pointer to a function used for iterating over dictionary contents.
void ** tr_itor_datum(tr_itor *itor)
Return the address of the datum |itor| is positioned on, through which it can be read or replaced,...
bool tr_itor_search_le(tr_itor *itor, const void *key)
Position |itor| on the greatest key less than or equal to |key| and return true, or unposition it and...
dict_itor * tr_dict_itor_new(tr_tree *tree)
Like tr_itor_new(), but wrapped in a generic dict_itor for use with the dict_itor_* macros.
dict_remove_result tr_tree_remove(tr_tree *tree, const void *key)
Remove the element with key |key|.
size_t tr_tree_total_path_length(const tr_tree *tree)
Return the sum of the depths of all nodes, the root being at depth 1, or 0 for an empty tree.
void tr_itor_invalidate(tr_itor *itor)
Unposition |itor|, so that it is not positioned on any element.
bool tr_tree_select(tr_tree *tree, size_t n, const void **key, void **datum)
Store the key and datum of the |n|th element in key order (0-based) through |key| and |datum| and ret...
bool tr_itor_last(tr_itor *itor)
Position |itor| on the last element in key order and return true, or unposition it and return false i...
bool tr_itor_search_lt(tr_itor *itor, const void *key)
Position |itor| on the greatest key less than |key| and return true, or unposition it and return fals...
void ** tr_tree_search_le(tr_tree *tree, const void *key)
Return the address of the datum of the greatest key less than or equal to |key|, or NULL if there is ...
bool tr_itor_nextn(tr_itor *itor, size_t count)
Move |itor| |count| elements forward and return whether it is still positioned.
bool tr_itor_remove(tr_itor *itor)
Remove the element |itor| is positioned on and unposition |itor|; return false if it was not position...
size_t tr_tree_clear(tr_tree *tree, dict_delete_func delete_func)
Remove every element, calling |delete_func|(key, datum) for each unless |delete_func| is NULL.
bool tr_itor_next(tr_itor *itor)
Move |itor| to the next element in key order and return true, or unposition it and return false if th...
size_t tr_tree_traverse(tr_tree *tree, dict_visit_func visit, void *user_data)
Call |visit|(key, datum, |user_data|) for each element in key order, stopping early if |visit| return...
size_t tr_tree_free(tr_tree *tree, dict_delete_func delete_func)
Remove every element, calling |delete_func|(key, datum) for each unless |delete_func| is NULL,...
bool tr_itor_first(tr_itor *itor)
Position |itor| on the first element in key order and return true, or unposition it and return false ...
tr_tree * tr_tree_new(dict_compare_func compare_func, dict_prio_func prio_func)
Create an empty treap that orders keys with |compare_func| (must not be NULL) and takes node prioriti...
tr_itor * tr_itor_new(tr_tree *tree)
Create an iterator over |tree| that is not positioned on any element yet.
bool tr_itor_prev(tr_itor *itor)
Move |itor| to the previous element in key order and return true, or unposition it and return false i...
bool tr_itor_search_ge(tr_itor *itor, const void *key)
Position |itor| on the least key greater than or equal to |key| and return true, or unposition it and...
size_t tr_tree_min_path_length(const tr_tree *tree)
Return the shallowest depth at which a child link is absent, the root being at depth 1,...
bool tr_itor_search_gt(tr_itor *itor, const void *key)
Position |itor| on the least key greater than |key| and return true, or unposition it and return fals...
const void * tr_itor_key(const tr_itor *itor)
Return the key |itor| is positioned on, or NULL if it is not positioned.
bool tr_itor_valid(const tr_itor *itor)
Return whether |itor| is positioned on an element.
bool tr_tree_verify(const tr_tree *tree)
Check the internal invariants of the tree and return true if they hold, or print the first failed che...
bool tr_itor_prevn(tr_itor *itor, size_t count)
Move |itor| |count| elements back and return whether it is still positioned.
void tr_itor_free(tr_itor *itor)
Free an iterator.
size_t tr_tree_count(const tr_tree *tree)
Return the number of elements.
int tr_itor_compare(const tr_itor *i1, const tr_itor *i2)
Compare the positions of two iterators over the same tree: return a negative value,...
void ** tr_tree_search_lt(tr_tree *tree, const void *key)
Return the address of the datum of the greatest key less than |key|, or NULL if there is none.
dict * tr_dict_new(dict_compare_func compare_func, dict_prio_func prio_func)
Like tr_tree_new(), but wrapped in a generic dict for use with the dict_* macros.
void ** tr_tree_search_ge(tr_tree *tree, const void *key)
Return the address of the datum of the least key greater than or equal to |key|, or NULL if there is ...
void ** tr_tree_search_gt(tr_tree *tree, const void *key)
Return the address of the datum of the least key greater than |key|, or NULL if there is none.
dict_insert_result tr_tree_insert(tr_tree *tree, void *key)
Insert |key| unless an equal key is present.
bool tr_itor_search(tr_itor *itor, const void *key)
Position |itor| on |key| and return true, or unposition it and return false if |key| is not present.
size_t tr_tree_max_path_length(const tr_tree *tree)
Return the greatest depth of any node, the root being at depth 1, or 0 for an empty tree: the height ...
void ** tr_tree_search(tr_tree *tree, const void *key)
Return the address of the datum stored for |key|, or NULL if |key| is not present.