Files
bluelib/object-test/trees.c

117 lines
2.6 KiB
C
Raw Normal View History

2024-10-24 21:33:19 +01:00
#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;
}