tree->cb_free(tree->alloc_arg, tree);
}
+/*
+ * walk over tree
+ */
+
+static bool walk(struct Node *node, cbtree_walker_func cb_func, void *cb_arg)
+{
+ if (!is_node(node))
+ return cb_func(cb_arg, get_external(node));
+ return walk(node->child[0], cb_func, cb_arg)
+ && walk(node->child[1], cb_func, cb_arg);
+}
+
+bool cbtree_walk(struct CBTree *tree, cbtree_walker_func cb_func, void *cb_arg)
+{
+ if (!tree->root)
+ return true;
+ return walk(tree->root, cb_func, cb_arg);
+}
+
/* custom alloc */
typedef void * (*cbtree_alloc_func)(void *arg, unsigned len);
typedef void (*cbtree_free_func)(void *arg, void *ptr);
+/* walk */
+typedef bool (*cbtree_walker_func)(void *arg, void *obj);
struct CBTree;
void *cbtree_lookup(struct CBTree *tree, const void *key, unsigned klen);
+bool cbtree_walk(struct CBTree *tree, cbtree_walker_func cb_func, void *cb_arg);
+
#endif