}
}
+
+
+/* traverse a tree starting at node */
+static void
+trbt_traversearray32_node(trbt_node_t *node, uint32_t keylen,
+ void (*callback)(void *param, void *data),
+ void *param)
+{
+ if (node->left) {
+ trbt_traversearray32_node(node->left, keylen, callback, param);
+ }
+
+ /* this is the smallest node in this subtree
+ if keylen is 0 this means we can just call the callback
+ otherwise we must pull the next subtree and traverse that one as well
+ */
+ if (keylen == 0) {
+ callback(param, node->data);
+ } else {
+ trbt_traversearray32(node->data, keylen, callback, param);
+ }
+
+ if (node->right) {
+ trbt_traversearray32_node(node->right, keylen, callback, param);
+ }
+}
+
+
+/* traverse the tree using an array of uint32 as a key */
+void
+trbt_traversearray32(trbt_tree_t *tree, uint32_t keylen,
+ void (*callback)(void *param, void *data),
+ void *param)
+{
+ trbt_node_t *node;
+
+ if (tree == NULL) {
+ return;
+ }
+
+ node=tree->root;
+ if (node == NULL) {
+ return;
+ }
+
+ trbt_traversearray32_node(node, keylen-1, callback, param);
+}
+
+
+
# if 0
static void printtree(trbt_node_t *node, int levels)
{
return data;
}
+
+void traverse(void *param, void *d)
+{
+ uint32_t *data = (uint32_t *)d;
+
+ printf("traverse data:%d\n",*data);
+}
/*
int i;
trbt_tree_t *tree;
uint32_t *data;
- uint32_t key1[3] = {0,0,0};
- uint32_t key2[3] = {0,0,1};
- uint32_t key3[3] = {0,1,0};
- uint32_t key4[3] = {2,0,0};
+ uint32_t key1[3] = {0,10,20};
+ uint32_t key2[3] = {0,10,21};
+ uint32_t key3[3] = {0,11,20};
+ uint32_t key4[3] = {2,10,20};
pc = poptGetContext(argv[0], argc, argv, popt_options, POPT_CONTEXT_KEEP_FIRST);
trbt_insertarray32_callback(tree, 3, key3, callback, NULL);
trbt_insertarray32_callback(tree, 3, key2, callback, NULL);
trbt_insertarray32_callback(tree, 3, key1, callback, NULL);
+
data = trbt_lookuparray32(tree, 3, key1);
printf("key1 dataptr:0x%08x == %d\n",(int)data,data?*data:-1);
data = trbt_lookuparray32(tree, 3, key2);
printf("key3 dataptr:0x%08x == %d\n",(int)data,data?*data:-1);
data = trbt_lookuparray32(tree, 3, key4);
printf("key4 dataptr:0x%08x == %d\n",(int)data,data?*data:-1);
-
+ trbt_traversearray32(tree, 3, traverse, NULL);
+
printf("\ndeleting key4\n");
trbt_deletearray32(tree, 3, key4);
data = trbt_lookuparray32(tree, 3, key1);
printf("key3 dataptr:0x%08x == %d\n",(int)data,data?*data:-1);
data = trbt_lookuparray32(tree, 3, key4);
printf("key4 dataptr:0x%08x == %d\n",(int)data,data?*data:-1);
+ trbt_traversearray32(tree, 3, traverse, NULL);
printf("\ndeleting key2\n");
trbt_deletearray32(tree, 3, key2);
printf("key3 dataptr:0x%08x == %d\n",(int)data,data?*data:-1);
data = trbt_lookuparray32(tree, 3, key4);
printf("key4 dataptr:0x%08x == %d\n",(int)data,data?*data:-1);
+ trbt_traversearray32(tree, 3, traverse, NULL);
printf("\ndeleting key3\n");
trbt_deletearray32(tree, 3, key3);
printf("key3 dataptr:0x%08x == %d\n",(int)data,data?*data:-1);
data = trbt_lookuparray32(tree, 3, key4);
printf("key4 dataptr:0x%08x == %d\n",(int)data,data?*data:-1);
+ trbt_traversearray32(tree, 3, traverse, NULL);
printf("\ndeleting key1\n");
trbt_deletearray32(tree, 3, key1);
printf("key3 dataptr:0x%08x == %d\n",(int)data,data?*data:-1);
data = trbt_lookuparray32(tree, 3, key4);
printf("key4 dataptr:0x%08x == %d\n",(int)data,data?*data:-1);
+ trbt_traversearray32(tree, 3, traverse, NULL);
return 0;