summaryrefslogtreecommitdiff
path: root/Algorithms/bplus-tree/src/bplus_leaf.c
diff options
context:
space:
mode:
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);
+}