cbtree: add walker function
authorMarko Kreen <markokr@gmail.com>
Sun, 27 Dec 2009 10:40:12 +0000 (12:40 +0200)
committerMarko Kreen <markokr@gmail.com>
Tue, 2 Mar 2010 14:53:48 +0000 (16:53 +0200)
usual/cbtree.c
usual/cbtree.h

index 4e3108ebae1a3269b62b79816c3a73125ff7bbd4..390e9c968f79e3aa0d6f40c4936d86f33978cde9 100644 (file)
@@ -334,3 +334,22 @@ void cbtree_destroy(struct CBTree *tree)
        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);
+}
+
index c767be9567d8af428ea071f3c65887b25494d32f..cb0f62b1143dd4cfea38e25908ec017014f92e25 100644 (file)
@@ -26,6 +26,8 @@ typedef unsigned int  (*cbtree_getkey_func)(void *obj, const void **dst_p);
 /* 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;
 
@@ -41,5 +43,7 @@ bool cbtree_delete(struct CBTree *tree, const void *key, unsigned klen);
 
 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