117 lines
2.6 KiB
C
117 lines
2.6 KiB
C
|
|
#include <blue/core/btree.h>
|
||
|
|
#include <blue/object/dict.h>
|
||
|
|
#include <blue/object/number.h>
|
||
|
|
#include <blue/object/tree.h>
|
||
|
|
#include <stdio.h>
|
||
|
|
|
||
|
|
#define NITEMS 16
|
||
|
|
|
||
|
|
struct tree_item {
|
||
|
|
int value;
|
||
|
|
b_tree_node node;
|
||
|
|
};
|
||
|
|
|
||
|
|
struct btree_item {
|
||
|
|
int value;
|
||
|
|
b_btree_node node;
|
||
|
|
};
|
||
|
|
|
||
|
|
B_BTREE_DEFINE_SIMPLE_GET(struct btree_item, int, node, value, get_node)
|
||
|
|
B_BTREE_DEFINE_SIMPLE_INSERT(struct btree_item, node, value, put_node)
|
||
|
|
|
||
|
|
int main(void)
|
||
|
|
{
|
||
|
|
b_dict_item items[]
|
||
|
|
= {B_DICT_ITEM("hello", B_RV_INT(32)),
|
||
|
|
B_DICT_ITEM("world", B_RV_INT(64)),
|
||
|
|
B_DICT_ITEM("more", B_RV_INT(128)),
|
||
|
|
B_DICT_ITEM("other", B_RV_INT(256)), B_DICT_ITEM_END};
|
||
|
|
|
||
|
|
b_dict *dict = b_dict_create_with_items(items);
|
||
|
|
|
||
|
|
b_dict_iterator it;
|
||
|
|
b_dict_foreach(&it, dict)
|
||
|
|
{
|
||
|
|
printf("item %zu: %s=%d\n", it.i, it.key,
|
||
|
|
b_number_get_int(B_NUMBER(it.value)));
|
||
|
|
}
|
||
|
|
|
||
|
|
b_tree *tree = b_tree_create();
|
||
|
|
struct tree_item items2[NITEMS];
|
||
|
|
|
||
|
|
for (int i = 0; i < NITEMS; i++) {
|
||
|
|
items2[i].value = i;
|
||
|
|
items2[i].node = B_TREE_NODE_INIT;
|
||
|
|
}
|
||
|
|
|
||
|
|
b_tree_set_root(tree, &items2[0].node);
|
||
|
|
|
||
|
|
b_tree_node_add_child(&items2[0].node, &items2[1].node);
|
||
|
|
b_tree_node_add_child(&items2[0].node, &items2[2].node);
|
||
|
|
b_tree_node_add_child(&items2[0].node, &items2[3].node);
|
||
|
|
b_tree_node_add_child(&items2[0].node, &items2[7].node);
|
||
|
|
b_tree_node_add_child(&items2[1].node, &items2[4].node);
|
||
|
|
b_tree_node_add_child(&items2[1].node, &items2[5].node);
|
||
|
|
b_tree_node_add_child(&items2[4].node, &items2[6].node);
|
||
|
|
|
||
|
|
b_tree_iterator it2;
|
||
|
|
b_tree_foreach(&it2, tree)
|
||
|
|
{
|
||
|
|
struct tree_item *item = b_unbox(struct tree_item, it2.node, node);
|
||
|
|
|
||
|
|
for (size_t i = 0; i < it2.depth; i++) {
|
||
|
|
fputs(" ", stdout);
|
||
|
|
}
|
||
|
|
|
||
|
|
printf("%u\n", item->value);
|
||
|
|
}
|
||
|
|
|
||
|
|
b_btree btree = {};
|
||
|
|
struct btree_item items3[NITEMS] = {};
|
||
|
|
for (int i = 0; i < NITEMS; i++) {
|
||
|
|
items3[i].value = i;
|
||
|
|
put_node(&btree, &items3[i]);
|
||
|
|
}
|
||
|
|
|
||
|
|
printf("\n\n");
|
||
|
|
|
||
|
|
b_btree_iterator it3;
|
||
|
|
b_btree_foreach (&it3, &btree) {
|
||
|
|
struct btree_item *item
|
||
|
|
= b_unbox(struct btree_item, it3.node, node);
|
||
|
|
|
||
|
|
for (size_t i = 0; i < it3.depth; i++) {
|
||
|
|
fputs(" ", stdout);
|
||
|
|
}
|
||
|
|
|
||
|
|
printf("%d\n", item->value);
|
||
|
|
}
|
||
|
|
|
||
|
|
b_btree_iterator_begin(&btree, &it3);
|
||
|
|
while (b_btree_iterator_is_valid(&it3)) {
|
||
|
|
struct btree_item *item
|
||
|
|
= b_unbox(struct btree_item, it3.node, node);
|
||
|
|
|
||
|
|
if (item->value == 9) {
|
||
|
|
b_btree_iterator_erase(&it3);
|
||
|
|
} else {
|
||
|
|
b_btree_iterator_next(&it3);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
printf("\n\n");
|
||
|
|
|
||
|
|
b_btree_foreach (&it3, &btree) {
|
||
|
|
struct btree_item *item
|
||
|
|
= b_unbox(struct btree_item, it3.node, node);
|
||
|
|
|
||
|
|
for (size_t i = 0; i < it3.depth; i++) {
|
||
|
|
fputs(" ", stdout);
|
||
|
|
}
|
||
|
|
|
||
|
|
printf("%d\n", item->value);
|
||
|
|
}
|
||
|
|
|
||
|
|
return 0;
|
||
|
|
}
|