MCPcopy Create free account
hub / github.com/carsonpo/haystackdb / insert_non_full

Method insert_non_full

src/structures/tree.rs:42–77  ·  view source on GitHub ↗
(
        &mut self,
        node: &mut Node<K, V>,
        key: K,
        value: V,
    )

Source from the content-addressed store, hash-verified

40 }
41
42 fn insert_non_full(
43 &mut self,
44 node: &mut Node<K, V>,
45 key: K,
46 value: V,
47 ) -> Result<(), io::Error> {
48 match &mut node.node_type {
49 NodeType::Leaf => {
50 let idx = node.keys.binary_search(&key).unwrap_or_else(|x| x);
51 node.keys.insert(idx, key);
52 node.values.insert(idx, Some(value));
53 Ok(())
54 }
55 NodeType::Internal => {
56 let idx = node.keys.binary_search(&key).unwrap_or_else(|x| x);
57 let child_idx = if idx == node.keys.len() || key < node.keys[idx] {
58 idx
59 } else {
60 idx + 1
61 };
62
63 if self.is_node_full(&node.children[child_idx])? {
64 let (median, sibling) = node.children[child_idx].split()?;
65 node.keys.insert(idx, median);
66 node.children.insert(child_idx + 1, Box::new(sibling));
67 if key >= node.keys[idx] {
68 self.insert_non_full(&mut *node.children[child_idx + 1], key, value)
69 } else {
70 self.insert_non_full(&mut *node.children[child_idx], key, value)
71 }
72 } else {
73 self.insert_non_full(&mut *node.children[child_idx], key, value)
74 }
75 }
76 }
77 }
78
79 fn is_node_full(&self, node: &Node<K, V>) -> Result<bool, io::Error> {
80 Ok(node.keys.len() == node.max_keys)

Callers 1

insertMethod · 0.45

Calls 4

lenMethod · 0.80
is_node_fullMethod · 0.80
insertMethod · 0.45
splitMethod · 0.45

Tested by

no test coverage detected