7 BintreeTraversionFunction func;
11 static int bintree_compare_mem(void *v1, void *v2, Bintree *tree)
13 return memcmp(v1, v2, tree->key_size);
16 Bintree bintree_create(size_t key_size, BintreeComparator cmp)
21 .cmp = cmp ? cmp : &bintree_compare_mem,
25 static BintreeNode **search_recursive(Bintree *tree, BintreeNode **nodeptr, void *key, bool return_existing)
30 if ((cond = tree->cmp((*nodeptr)->key, key, tree)) == 0 && return_existing)
33 return search_recursive(tree, &(*nodeptr)->left, key, return_existing);
35 return search_recursive(tree, &(*nodeptr)->right, key, return_existing);
41 BintreeNode **bintree_search(Bintree *tree, void *key)
43 return search_recursive(tree, &tree->root, key, true);
46 void bintree_add_node(Bintree *tree, BintreeNode **nodeptr, void *key, void *value)
48 *nodeptr = malloc(sizeof(BintreeNode));
49 (*nodeptr)->key = malloc(tree->key_size);
50 memcpy((*nodeptr)->key, key, tree->key_size);
51 (*nodeptr)->value = value;
52 (*nodeptr)->left = (*nodeptr)->right = NULL;
55 void bintree_insert(Bintree *tree, void *key, void *value)
57 bintree_add_node(tree, search_recursive(tree, &tree->root, key, false), key, value);
60 static void bintree_free(BintreeNode *node, void *arg)
62 BintreeFreeData *fdata = arg;
65 fdata->func(node, fdata->arg);
71 void bintree_clear(Bintree *tree, BintreeTraversionFunction func, void *arg)
74 BintreeFreeData fdata = {
79 bintree_traverse(tree, BTT_POSTORDER, &bintree_free, &fdata);
84 static void traverse_recursive(BintreeNode *node, BintreeTraversion traversion, BintreeTraversionFunction func, void *arg)
87 if (traversion == BTT_PREORDER)
90 traverse_recursive(node->left, traversion, func, arg);
92 if (traversion == BTT_INORDER)
95 traverse_recursive(node->right, traversion, func, arg);
97 if (traversion == BTT_POSTORDER)
102 void bintree_traverse(Bintree *tree, BintreeTraversion traversion, BintreeTraversionFunction func, void *arg)
104 traverse_recursive(tree->root, traversion, func, arg);