8 BintreeTraversionFunction func;
12 static int bintree_compare_mem(void *v1, void *v2, Bintree *tree)
14 return memcmp(v1, v2, tree->key_size);
17 Bintree bintree_create(size_t key_size, BintreeComparator cmp)
22 .cmp = cmp ? cmp : &bintree_compare_mem,
26 static BintreeNode **search_recursive(Bintree *tree, BintreeNode **nodeptr, void *key, bool return_existing)
31 if ((cond = tree->cmp((*nodeptr)->key, key, tree)) == 0 && return_existing)
34 return search_recursive(tree, &(*nodeptr)->left, key, return_existing);
36 return search_recursive(tree, &(*nodeptr)->right, key, return_existing);
42 BintreeNode **bintree_search(Bintree *tree, void *key)
44 return search_recursive(tree, &tree->root, key, true);
47 void bintree_add_node(Bintree *tree, BintreeNode **nodeptr, void *key, void *value)
49 *nodeptr = malloc(sizeof(BintreeNode));
50 (*nodeptr)->key = malloc(tree->key_size);
51 memcpy((*nodeptr)->key, key, tree->key_size);
52 (*nodeptr)->value = value;
53 (*nodeptr)->left = (*nodeptr)->right = NULL;
56 void bintree_insert(Bintree *tree, void *key, void *value)
58 bintree_add_node(tree, search_recursive(tree, &tree->root, key, false), key, value);
61 static void bintree_free(BintreeNode *node, void *arg)
63 BintreeFreeData *fdata = arg;
66 fdata->func(node, fdata->arg);
72 void bintree_clear(Bintree *tree, BintreeTraversionFunction func, void *arg)
75 BintreeFreeData fdata = {
80 bintree_traverse(tree, BTT_POSTORDER, &bintree_free, &fdata);
85 static void traverse_recursive(BintreeNode *node, BintreeTraversion traversion, BintreeTraversionFunction func, void *arg)
88 if (traversion == BTT_PREORDER)
91 traverse_recursive(node->left, traversion, func, arg);
93 if (traversion == BTT_INORDER)
96 traverse_recursive(node->right, traversion, func, arg);
98 if (traversion == BTT_POSTORDER)
103 void bintree_traverse(Bintree *tree, BintreeTraversion traversion, BintreeTraversionFunction func, void *arg)
105 traverse_recursive(tree->root, traversion, func, arg);