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;
281 if (n >= t->
count / 2) {
283 n = t->
count - 1 - n;
294 *datum = node->
datum;
301 return ((
const tree*)Tree)->count;
308node_verify_common(
const tree* t,
const tree_node* node,
const void* lower,
335 const tree* t = Tree;
346 struct frame {
const tree_node* node;
const void* lower;
const void* upper; };
347 struct frame* stack = NULL;
348 size_t size = 0, capacity = 0, count = 0;
349 bool ok =
true, oom =
false;
351#define PUSH(n, lo, hi) \
353 if (size == capacity) { \
354 const size_t cap = capacity ? capacity * 2 : 32; \
355 struct frame* items = MALLOC(cap * sizeof(*items)); \
356 if (!items) { oom = true; break; } \
358 memcpy(items, stack, size * sizeof(*items)); \
364 stack[size].node = (n); \
365 stack[size].lower = (lo); \
366 stack[size].upper = (hi); \
373 while (ok && !oom && size) {
374 const struct frame top = stack[--size];
376 if (!node_verify_common(t, node, top.lower, top.upper)) {
383 if (!oom && node->
rlink)
391 fprintf(stderr,
"%s:%d (%s) out of memory\n", __FILE__, __LINE__, __func__);
404 const size_t count = t->
count;
412 if (delete_func) delete_func(node->
key, node->
datum);
427 const size_t count =
tree_clear(Tree, delete_func);
463 memcpy(items, stack->
items, stack->
size *
sizeof(*items));
466 stack->
items = items;
482tree_path_lengths(
const tree* t,
size_t* min_path,
size_t* max_path,
485 size_t min_len = 0, max_len = 0, total_len = 0;
489 if (t->
root && !node_stack_push(&stack, t->
root, 1))
492 while (ok && stack.
size) {
495 const size_t depth = top.
depth;
501 if (!min_len || depth < min_len)
504 if (node->
llink && !node_stack_push(&stack, node->
llink, depth + 1))
506 if (ok && node->
rlink && !node_stack_push(&stack, node->
rlink, depth + 1))
519 *total_path = total_len;
527 tree_path_lengths(Tree, &len, NULL, NULL);
535 tree_path_lengths(Tree, NULL, &len, NULL);
543 tree_path_lengths(Tree, NULL, NULL, &len);
563 iterator->
node = NULL;
573 if(iterator->
node)
return true;
584 if(iterator->
node)
return true;
593 while (iterator->
node && count--)
595 return iterator->
node != NULL;
602 while (iterator->
node && count--)
604 return iterator->
node != NULL;
663 return !itor2->
node ? 0 : -1;
673 return iterator->
node ? iterator->
node->
key : NULL;
void(* dict_delete_func)(void *, void *)
A pointer to a function that is called when a key-value pair gets removed from a dictionary.
bool(* dict_visit_func)(const void *, void *, void *)
A pointer to a function used for iterating over dictionary contents.
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_verify_common(const void *Tree)
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)
void * tree_iterator_key_vt(void *Iterator)
int tree_iterator_compare_vt(void *Iterator1, void *Iterator2)
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)