84 while (parent && parent->
llink == node) {
98 while (parent && parent->
rlink == node) {
132 const int cmp = t->
cmp_func(key, node->key);
147 return node ? &node->
datum : NULL;
173 return node ? &node->
datum : NULL;
197 return node ? &node->
datum : NULL;
224 return node ? &node->
datum : NULL;
248 return node ? &node->
datum : NULL;
262 if (!visit(node->
key, node->
datum, user_data))
break;
279 if (n >= t->
count / 2) {
281 n = t->
count - 1 - n;
290 *datum = node->
datum;
297 return ((
const tree*)Tree)->count;
304 const size_t count = t->
count;
312 if (delete_func) delete_func(node->
key, node->
datum);
326 const size_t count =
tree_clear(Tree, delete_func);
332node_min_path_length(
const tree_node* node)
334 size_t l = node->
llink ? node_min_path_length(node->
llink) : 0;
335 size_t r = node->
rlink ? node_min_path_length(node->
rlink) : 0;
336 return 1 +
MIN(l, r);
342 const tree* t = Tree;
343 return t->
root ? node_min_path_length(t->
root) : 0;
347node_max_path_length(
const tree_node* node)
349 size_t l = node->
llink ? node_max_path_length(node->
llink) : 0;
350 size_t r = node->
rlink ? node_max_path_length(node->
rlink) : 0;
351 return 1 +
MAX(l, r);
357 const tree* t = Tree;
358 return t->
root ? node_max_path_length(t->
root) : 0;
362node_path_length(
const tree_node* node,
size_t level)
365 + (node->
llink ? node_path_length(node->
llink, level + 1) : 0)
366 + (node->rlink ? node_path_length(node->rlink, level + 1) : 0);
372 const tree* t = Tree;
373 return t->
root ? node_path_length(t->
root, 1) : 0;
392 iterator->
node = NULL;
402 if(iterator->
node)
return true;
413 if(iterator->
node)
return true;
422 while (iterator->
node && count--)
424 return iterator->
node != NULL;
431 while (iterator->
node && count--)
433 return iterator->
node != NULL;
492 return !itor2->
node ? 0 : -1;
502 return iterator->
node ? iterator->
node->
key : NULL;
void(* dict_delete_func)(void *, void *)
bool(* dict_visit_func)(const void *, void *, void *)
struct tree_node * parent
dict_compare_func cmp_func
bool tree_iterator_last(void *Iterator)
size_t tree_free(void *Tree, dict_delete_func delete_func)
void * tree_search_gt_node(void *Tree, const void *key)
void ** tree_iterator_datum(void *Iterator)
bool tree_iterator_next(void *Iterator)
void * tree_search_le_node(void *Tree, const void *key)
void * tree_node_max(void *Node)
void tree_iterator_invalidate(void *Iterator)
void ** tree_search_gt(void *Tree, const void *key)
int tree_iterator_compare(const void *Iterator1, const void *Iterator2)
void tree_node_rot_left(void *Tree, void *Node)
void * tree_search_node(void *Tree, const void *key)
bool tree_iterator_search_le(void *Iterator, const void *key)
void * tree_search_lt_node(void *Tree, const void *key)
bool tree_iterator_valid(const void *Iterator)
size_t tree_count(const void *Tree)
struct tree_node tree_node
void ** tree_search_lt(void *Tree, const void *key)
size_t tree_clear(void *Tree, dict_delete_func delete_func)
const void * tree_iterator_key(const void *Iterator)
size_t tree_min_path_length(const void *Tree)
void * tree_node_min(void *Node)
void ** tree_search(void *Tree, const void *key)
bool tree_iterator_nextn(void *Iterator, size_t count)
size_t tree_traverse(void *Tree, dict_visit_func visit, void *user_data)
size_t tree_total_path_length(const void *Tree)
bool tree_iterator_first(void *Iterator)
bool tree_select(void *Tree, size_t n, const void **key, void **datum)
void tree_iterator_free(void *Iterator)
bool tree_iterator_prevn(void *Iterator, size_t count)
bool tree_iterator_search_lt(void *Iterator, const void *key)
void * tree_node_prev(void *Node)
bool tree_iterator_search_ge(void *Iterator, const void *key)
size_t tree_max_path_length(const void *Tree)
bool tree_iterator_search_gt(void *Iterator, const void *key)
void ** tree_search_ge(void *Tree, const void *key)
void tree_node_rot_right(void *Tree, void *Node)
void ** tree_search_le(void *Tree, const void *key)
void * tree_search_ge_node(void *Tree, const void *key)
bool tree_iterator_search(void *Iterator, const void *key)
void * tree_node_next(void *Node)
bool tree_iterator_prev(void *Iterator)
#define TREE_NODE_FIELDS(node_type)
#define TREE_ITERATOR_FIELDS(tree_type, node_type)
#define TREE_FIELDS(node_type)