From 854d66bb73cd131bda6452aac74aae3d9a77b91a Mon Sep 17 00:00:00 2001 From: nasr Date: Mon, 9 Mar 2026 19:44:59 +0000 Subject: refactor(main): simplified the project. going towards a single header file project maybe... --- source/btree.h | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 source/btree.h (limited to 'source/btree.h') diff --git a/source/btree.h b/source/btree.h new file mode 100644 index 0000000..42c8e21 --- /dev/null +++ b/source/btree.h @@ -0,0 +1,108 @@ +#ifndef BTREE_H +#define BTREE_H + +// maximum height of the tree the lower the lower the lower amount +// of disk reads which translates into faster? +#define B_TREE_ORDER 4 + +typedef struct b_tree_node b_tree_node; +struct b_tree_node +{ + + // store the values + string8 keys[B_TREE_ORDER - 1]; + csv_row *rows[B_TREE_ORDER - 1]; + + b_tree_node *parent; + // handle to store children faster than linked list + // because now we can iteratate over the nodes instead of having cache misses + // when jumping through linked nodes + b_tree_node *children[B_TREE_ORDER]; + + // NOTE(nasr): reference count ::: check how many leaves are using this node + // also not needed for now because we don't free individual node because of arena allocator + // s32 *refc; + + s32 key_count; + + b32 leaf; + +}; + +typedef struct b_tree b_tree; +struct b_tree +{ + // NOTE(nasr): make sure this always stays in memory + // so that initial fetch never requires a disk read + b_tree_node *root; + +}; + + + + +// TODO(nasr): 1. splitting the tree when getting too big? (horizontally) 2. joining trees? + +internal b_tree_node * +node_alloc(mem_arena *arena) +{ + b_tree_node *node = PushStructZero(arena, type); + node->leaf = 1; + return node; +} + +// NOTE(nasr): @return the index of of the found element +internal s32 +node_find_pos(mem_arena *arena, string8 value) +{ + s32 i = 0; + while (i < n->key_count && str8_cmp(n->keys[i], k) < 0) + { + ++i; + } + + return i; +} + +interal void +b_tree_create(mem_arena *arena, b_tree *tree) +{ + tree->root = node_alloc(arena); + tree->root->leaf = 1; + tree->root->key_count = 0; +} + +// NOTE(nasr): nodes that get passed as parameters should've already been loaded into memory +internal void +b_tree_search(b_tree_node *node, string8 key) +{ + s32 found_index = node_find_pos(node, key); + + if (found_index < n->key_count && string_compare(n->keys[i], key) == 0) + { + return n->rows[i]; + } + if (n->leaf) + { + return NULL; + + } + + return b_tree_search(n->children[i], key); + + +} + +internal void +b_tree_insert() +{ + +} + +internal void +b_tree_write() +{ + // TODO(nasr): write the b_tree to disk +} + +#endif /* BTREE_H */ -- cgit v1.3