summaryrefslogtreecommitdiff
path: root/Algorithms/bplus-tree/src/bplus_leaf.c
diff options
context:
space:
mode:
authorCarlos Maiolino <[email protected]>2025-07-10 22:55:07 +0200
committerCarlos Maiolino <[email protected]>2025-07-10 22:56:55 +0200
commitd98f46ce647846b0aa30b2e16a30fd4e152a1bf5 (patch)
tree267474fcc77cf20b428f6f4c7f768ca09f4cfe0e /Algorithms/bplus-tree/src/bplus_leaf.c
parent869e68986aa8f69af6e7842260a68d1e5c6f796f (diff)
Add new code
Signed-off-by: Carlos Maiolino <[email protected]>
Diffstat (limited to 'Algorithms/bplus-tree/src/bplus_leaf.c')
-rw-r--r--Algorithms/bplus-tree/src/bplus_leaf.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/Algorithms/bplus-tree/src/bplus_leaf.c b/Algorithms/bplus-tree/src/bplus_leaf.c
new file mode 100644
index 0000000..a6b6ae5
--- /dev/null
+++ b/Algorithms/bplus-tree/src/bplus_leaf.c
@@ -0,0 +1,71 @@
+/**
+ * Distributed under the Boost Software License, Version 1.0.
+ * See accompanying file LICENSE or copy at http://www.boost.org/LICENSE_1_0.txt
+ */
+
+#include "bplus_leaf.h"
+
+BplusLeaf* bplus_leaf_new(BplusTree* tree)
+{
+ g_return_val_if_fail(tree != NULL, NULL);
+
+ BplusLeaf* leaf = g_slice_new(BplusLeaf);
+
+ bplus_node_init(&leaf->node, TRUE);
+ leaf->left = NULL;
+ leaf->right = NULL;
+
+#ifdef BPLUS_TREE_GATHER_STATS
+ tree->node_count++;
+ tree->leaf_count++;
+ tree->underflow_count++;
+#endif /* ifdef BPLUS_TREE_GATHER_STATS */
+
+ return leaf;
+}
+
+BplusLeaf* bplus_leaf_new_right(BplusTree* tree, BplusLeaf* leaf_left)
+{
+ g_return_val_if_fail(tree != NULL, NULL);
+ g_return_val_if_fail(leaf_left != NULL, NULL);
+
+ BplusLeaf* leaf_right = bplus_leaf_new(tree);
+
+ leaf_right->left = leaf_left;
+ leaf_right->right = leaf_left->right;
+ leaf_left->right = leaf_right;
+
+ if (leaf_right->right != NULL)
+ leaf_right->right->left = leaf_right;
+
+ if (tree->last == leaf_left)
+ tree->last = leaf_right;
+
+ return leaf_right;
+}
+
+void bplus_leaf_destroy(BplusTree* tree, BplusLeaf* leaf)
+{
+ g_return_if_fail(tree != NULL);
+ g_return_if_fail(leaf != NULL);
+
+ if (leaf->left != NULL)
+ leaf->left->right = leaf->right;
+
+ if (leaf->right != NULL)
+ leaf->right->left = leaf->left;
+
+ if (tree->first == leaf)
+ tree->first = leaf->right;
+
+ if (tree->last == leaf)
+ tree->last = leaf->left;
+
+#ifdef BPLUS_TREE_GATHER_STATS
+ tree->node_count--;
+ tree->leaf_count--;
+ tree->underflow_count--;
+#endif /* ifdef BPLUS_TREE_GATHER_STATS */
+
+ g_slice_free(BplusLeaf, leaf);
+}