#include <stdlib.h>
#include "bintree.h"
-Bintree bintree_create(size_t key_size)
+static int bintree_compare_mem(void *v1, void *v2, Bintree *tree)
+{
+ return memcmp(v1, v2, tree->key_size);
+}
+
+Bintree bintree_create(size_t key_size, BintreeComparator cmp)
{
return (Bintree) {
.root = NULL,
.key_size = key_size,
+ .cmp = cmp ? cmp : &bintree_compare_mem,
};
}
if (*nodeptr) {
int cond;
- if ((cond = memcmp((*nodeptr)->key, key, tree->key_size)) == 0)
+ if ((cond = tree->cmp((*nodeptr)->key, key, tree)) == 0)
return nodeptr;
else if (cond > 0)
return search_recursive(tree, &(*nodeptr)->left, key);
#include <stddef.h>
+struct Bintree;
+
+typedef int (*BintreeComparator)(void *v1, void *v2, struct Bintree *tree);
+typedef void (*BintreeFreeFunction)(void *value, void *arg);
+
typedef struct BintreeNode
{
void *key;
struct BintreeNode *right;
} BintreeNode;
-typedef struct
+typedef struct Bintree
{
BintreeNode *root;
size_t key_size;
+ BintreeComparator cmp;
} Bintree;
-typedef void (*BintreeFreeFunction)(void *value, void *arg);
-
-Bintree bintree_create(size_t key_size);
+Bintree bintree_create(size_t key_size, BintreeComparator cmp);
BintreeNode **bintree_search(Bintree *tree, void *key);
void bintree_add_node(Bintree *tree, BintreeNode **nodeptr, void *key, void *value);
void bintree_clear(Bintree *tree, BintreeFreeFunction func, void *arg);