b3_stable_structures/
btreemap.rs

1//! This module implements a key/value store based on a B-Tree
2//! in stable memory.
3//!
4//! # V1 layout
5//!
6//! ```text
7//! ---------------------------------------- <- Address 0
8//! Magic "BTR"                 ↕ 3 bytes
9//! ----------------------------------------
10//! Layout version              ↕ 1 byte
11//! ----------------------------------------
12//! Max key size                ↕ 4 bytes
13//! ----------------------------------------
14//! Max value size              ↕ 4 bytes
15//! ----------------------------------------
16//! Root node address           ↕ 8 bytes
17//! ----------------------------------------
18//! Length (number of elements) ↕ 8 bytes
19//! ---------------------------------------- <- Address 28 (PACKED_HEADER_SIZE)
20//! Reserved space              ↕ 24 bytes
21//! ---------------------------------------- <- Address 52 (ALLOCATOR_OFFSET)
22//! Allocator
23//! ----------------------------------------
24//! ... free memory for nodes
25//! ----------------------------------------
26//! ```
27mod allocator;
28mod iter;
29mod node;
30use crate::{
31    types::{Address, NULL},
32    BoundedStorable, Memory,
33};
34use allocator::Allocator;
35pub use iter::Iter;
36use iter::{Cursor, Index};
37use node::{Entry, Node, NodeType};
38use std::borrow::Cow;
39use std::marker::PhantomData;
40use std::ops::{Bound, RangeBounds};
41
42#[cfg(test)]
43mod proptests;
44
45const MAGIC: &[u8; 3] = b"BTR";
46const LAYOUT_VERSION: u8 = 1;
47/// The sum of all the header fields, i.e. size of a packed header.
48const PACKED_HEADER_SIZE: usize = 28;
49/// The offset where the allocator begins.
50const ALLOCATOR_OFFSET: usize = 52;
51
52/// A "stable" map based on a B-tree.
53///
54/// The implementation is based on the algorithm outlined in "Introduction to Algorithms"
55/// by Cormen et al.
56pub struct BTreeMap<K, V, M>
57where
58    K: BoundedStorable + Ord + Clone,
59    V: BoundedStorable,
60    M: Memory,
61{
62    // The address of the root node. If a root node doesn't exist, the address
63    // is set to NULL.
64    root_addr: Address,
65
66    // The maximum size a key can have.
67    max_key_size: u32,
68
69    // The maximum size a value can have.
70    max_value_size: u32,
71
72    // An allocator used for managing memory and allocating nodes.
73    allocator: Allocator<M>,
74
75    // The number of elements in the map.
76    length: u64,
77
78    // A marker to communicate to the Rust compiler that we own these types.
79    _phantom: PhantomData<(K, V)>,
80}
81
82/// The packed header size must be <= ALLOCATOR_OFFSET.
83struct BTreeHeaderV1 {
84    magic: [u8; 3],
85    version: u8,
86    max_key_size: u32,
87    max_value_size: u32,
88    root_addr: Address,
89    length: u64,
90    // Reserved bytes for future extensions
91}
92
93impl<K, V, M> BTreeMap<K, V, M>
94where
95    K: BoundedStorable + Ord + Clone,
96    V: BoundedStorable,
97    M: Memory,
98{
99    /// Initializes a `BTreeMap`.
100    ///
101    /// If the memory provided already contains a `BTreeMap`, then that
102    /// map is loaded. Otherwise, a new `BTreeMap` instance is created.
103    pub fn init(memory: M) -> Self {
104        if memory.size() == 0 {
105            // Memory is empty. Create a new map.
106            return BTreeMap::new(memory);
107        }
108
109        // Check if the magic in the memory corresponds to a BTreeMap.
110        let mut dst = vec![0; 3];
111        memory.read(0, &mut dst);
112        if dst != MAGIC {
113            // No BTreeMap found. Create a new instance.
114            BTreeMap::new(memory)
115        } else {
116            // The memory already contains a BTreeMap. Load it.
117            BTreeMap::load(memory)
118        }
119    }
120
121    /// Creates a new instance a `BTreeMap`.
122    ///
123    /// The given `memory` is assumed to be exclusively reserved for this data
124    /// structure and that it starts at address zero. Typically `memory` will
125    /// be an instance of `RestrictedMemory`.
126    ///
127    /// When initialized, the data structure has the following memory layout:
128    ///
129    ///    |  BTreeHeader  |  Allocator | ... free memory for nodes |
130    ///
131    /// See `Allocator` for more details on its own memory layout.
132    pub fn new(memory: M) -> Self {
133        let btree = Self {
134            root_addr: NULL,
135            allocator: Allocator::new(
136                memory,
137                Address::from(ALLOCATOR_OFFSET as u64),
138                Node::<K>::size(K::MAX_SIZE, V::MAX_SIZE),
139            ),
140            max_key_size: K::MAX_SIZE,
141            max_value_size: V::MAX_SIZE,
142            length: 0,
143            _phantom: PhantomData,
144        };
145
146        btree.save();
147        btree
148    }
149
150    /// Loads the map from memory.
151    pub fn load(memory: M) -> Self {
152        // Read the header from memory.
153        let header = Self::read_header(&memory);
154        assert_eq!(&header.magic, MAGIC, "Bad magic.");
155        assert_eq!(header.version, LAYOUT_VERSION, "Unsupported version.");
156        let expected_key_size = header.max_key_size;
157        // TODO: add test case, and allow smaller values.
158        assert!(
159            K::MAX_SIZE <= expected_key_size,
160            "max_key_size must be <= {expected_key_size}"
161        );
162        let expected_value_size = header.max_value_size;
163        assert!(
164            V::MAX_SIZE <= expected_value_size,
165            "max_value_size must be <= {expected_value_size}"
166        );
167
168        let allocator_addr = Address::from(ALLOCATOR_OFFSET as u64);
169        Self {
170            root_addr: header.root_addr,
171            allocator: Allocator::load(memory, allocator_addr),
172            max_key_size: K::MAX_SIZE,
173            max_value_size: V::MAX_SIZE,
174            length: header.length,
175            _phantom: PhantomData,
176        }
177    }
178
179    /// Reads the header from the specified memory.
180    fn read_header(memory: &M) -> BTreeHeaderV1 {
181        // Read the header
182        let mut buf = [0; PACKED_HEADER_SIZE];
183        memory.read(0, &mut buf);
184        // Deserialize the fields
185        BTreeHeaderV1 {
186            magic: buf[0..3].try_into().unwrap(),
187            version: buf[3],
188            max_key_size: u32::from_le_bytes(buf[4..8].try_into().unwrap()),
189            max_value_size: u32::from_le_bytes(buf[8..12].try_into().unwrap()),
190            root_addr: Address::from(u64::from_le_bytes(buf[12..20].try_into().unwrap())),
191            length: u64::from_le_bytes(buf[20..28].try_into().unwrap()),
192        }
193    }
194
195    /// Inserts a key-value pair into the map.
196    ///
197    /// The previous value of the key, if present, is returned.
198    ///
199    /// PRECONDITION:
200    ///   key.to_bytes().len() <= Key::MAX_SIZE
201    ///   value.to_bytes().len() <= Value::MAX_SIZE
202    pub fn insert(&mut self, key: K, value: V) -> Option<V> {
203        let key_bytes = key.to_bytes();
204        let value_bytes = value.to_bytes();
205
206        assert!(
207            key_bytes.len() <= self.max_key_size as usize,
208            "Key is too large. Expected <= {} bytes, found {} bytes",
209            self.max_key_size,
210            key_bytes.len()
211        );
212
213        assert!(
214            value_bytes.len() <= self.max_value_size as usize,
215            "Value is too large. Expected <= {} bytes, found {} bytes",
216            self.max_value_size,
217            value_bytes.len()
218        );
219
220        let value = value_bytes.to_vec();
221
222        let root = if self.root_addr == NULL {
223            // No root present. Allocate one.
224            let node = self.allocate_node(NodeType::Leaf);
225            self.root_addr = node.address();
226            self.save();
227            node
228        } else {
229            // Load the root from memory.
230            let mut root = self.load_node(self.root_addr);
231
232            // Check if the key already exists in the root.
233            if let Ok(idx) = root.search(&key) {
234                // The key exists. Overwrite it and return the previous value.
235                let (_, previous_value) = root.swap_entry(idx, (key, value), self.memory());
236                root.save(self.memory());
237                return Some(V::from_bytes(Cow::Owned(previous_value)));
238            }
239
240            // If the root is full, we need to introduce a new node as the root.
241            //
242            // NOTE: In the case where we are overwriting an existing key, then introducing
243            // a new root node isn't strictly necessary. However, that's a micro-optimization
244            // that adds more complexity than it's worth.
245            if root.is_full() {
246                // The root is full. Allocate a new node that will be used as the new root.
247                let mut new_root = self.allocate_node(NodeType::Internal);
248
249                // The new root has the old root as its only child.
250                new_root.push_child(self.root_addr);
251
252                // Update the root address.
253                self.root_addr = new_root.address();
254                self.save();
255
256                // Split the old (full) root.
257                self.split_child(&mut new_root, 0);
258
259                new_root
260            } else {
261                root
262            }
263        };
264
265        self.insert_nonfull(root, key, value)
266            .map(Cow::Owned)
267            .map(V::from_bytes)
268    }
269
270    // Inserts an entry into a node that is *not full*.
271    fn insert_nonfull(&mut self, mut node: Node<K>, key: K, value: Vec<u8>) -> Option<Vec<u8>> {
272        // We're guaranteed by the caller that the provided node is not full.
273        assert!(!node.is_full());
274
275        // Look for the key in the node.
276        match node.search(&key) {
277            Ok(idx) => {
278                // The key is already in the node.
279                // Overwrite it and return the previous value.
280                let (_, previous_value) = node.swap_entry(idx, (key, value), self.memory());
281
282                node.save(self.memory());
283                Some(previous_value)
284            }
285            Err(idx) => {
286                // The key isn't in the node. `idx` is where that key should be inserted.
287
288                match node.node_type() {
289                    NodeType::Leaf => {
290                        // The node is a non-full leaf.
291                        // Insert the entry at the proper location.
292                        node.insert_entry(idx, (key, value));
293                        node.save(self.memory());
294
295                        // Update the length.
296                        self.length += 1;
297                        self.save();
298
299                        // No previous value to return.
300                        None
301                    }
302                    NodeType::Internal => {
303                        // The node is an internal node.
304                        // Load the child that we should add the entry to.
305                        let mut child = self.load_node(node.child(idx));
306
307                        if child.is_full() {
308                            // Check if the key already exists in the child.
309                            if let Ok(idx) = child.search(&key) {
310                                // The key exists. Overwrite it and return the previous value.
311                                let (_, previous_value) =
312                                    child.swap_entry(idx, (key, value), self.memory());
313                                child.save(self.memory());
314                                return Some(previous_value);
315                            }
316
317                            // The child is full. Split the child.
318                            self.split_child(&mut node, idx);
319
320                            // The children have now changed. Search again for
321                            // the child where we need to store the entry in.
322                            let idx = node.search(&key).unwrap_or_else(|idx| idx);
323                            child = self.load_node(node.child(idx));
324                        }
325
326                        // The child should now be not full.
327                        assert!(!child.is_full());
328
329                        self.insert_nonfull(child, key, value)
330                    }
331                }
332            }
333        }
334    }
335
336    // Takes as input a nonfull internal `node` and index to its full child, then
337    // splits this child into two, adding an additional child to `node`.
338    //
339    // Example:
340    //
341    //                          [ ... M   Y ... ]
342    //                                  |
343    //                 [ N  O  P  Q  R  S  T  U  V  W  X ]
344    //
345    //
346    // After splitting becomes:
347    //
348    //                         [ ... M  S  Y ... ]
349    //                                 / \
350    //                [ N  O  P  Q  R ]   [ T  U  V  W  X ]
351    //
352    fn split_child(&mut self, node: &mut Node<K>, full_child_idx: usize) {
353        // The node must not be full.
354        assert!(!node.is_full());
355
356        // The node's child must be full.
357        let mut full_child = self.load_node(node.child(full_child_idx));
358        assert!(full_child.is_full());
359
360        // Create a sibling to this full child (which has to be the same type).
361        let mut sibling = self.allocate_node(full_child.node_type());
362        assert_eq!(sibling.node_type(), full_child.node_type());
363
364        // Add sibling as a new child in the node.
365        node.insert_child(full_child_idx + 1, sibling.address());
366
367        let (median_key, median_value) = full_child.split(&mut sibling, self.memory());
368
369        node.insert_entry(full_child_idx, (median_key, median_value));
370
371        sibling.save(self.memory());
372        full_child.save(self.memory());
373        node.save(self.memory());
374    }
375
376    /// Returns the value associated with the given key if it exists.
377    pub fn get(&self, key: &K) -> Option<V> {
378        if self.root_addr == NULL {
379            return None;
380        }
381
382        self.get_helper(self.root_addr, key)
383            .map(Cow::Owned)
384            .map(V::from_bytes)
385    }
386
387    fn get_helper(&self, node_addr: Address, key: &K) -> Option<Vec<u8>> {
388        let node = self.load_node(node_addr);
389        match node.search(key) {
390            Ok(idx) => Some(node.value(idx, self.memory()).to_vec()),
391            Err(idx) => {
392                match node.node_type() {
393                    NodeType::Leaf => None, // Key not found.
394                    NodeType::Internal => {
395                        // The key isn't in the node. Look for the key in the child.
396                        self.get_helper(node.child(idx), key)
397                    }
398                }
399            }
400        }
401    }
402
403    /// Returns `true` if the key exists in the map, `false` otherwise.
404    pub fn contains_key(&self, key: &K) -> bool {
405        self.get(key).is_some()
406    }
407
408    /// Returns `true` if the map contains no elements.
409    pub fn is_empty(&self) -> bool {
410        self.length == 0
411    }
412
413    /// Returns the number of elements in the map.
414    pub fn len(&self) -> u64 {
415        self.length
416    }
417
418    /// Returns the underlying memory.
419    pub fn into_memory(self) -> M {
420        self.allocator.into_memory()
421    }
422
423    /// Removes all elements from the map.
424    pub fn clear(self) -> Self {
425        let mem = self.allocator.into_memory();
426        Self::new(mem)
427    }
428
429    /// Returns the first key-value pair in the map. The key in this
430    /// pair is the minimum key in the map.
431    pub fn first_key_value(&self) -> Option<(K, V)> {
432        if self.root_addr == NULL {
433            return None;
434        }
435        let root = self.load_node(self.root_addr);
436        let (k, encoded_v) = root.get_min(self.memory());
437        Some((k, V::from_bytes(Cow::Owned(encoded_v))))
438    }
439
440    /// Returns the last key-value pair in the map. The key in this
441    /// pair is the maximum key in the map.
442    pub fn last_key_value(&self) -> Option<(K, V)> {
443        if self.root_addr == NULL {
444            return None;
445        }
446        let root = self.load_node(self.root_addr);
447        let (k, encoded_v) = root.get_max(self.memory());
448        Some((k, V::from_bytes(Cow::Owned(encoded_v))))
449    }
450
451    fn memory(&self) -> &M {
452        self.allocator.memory()
453    }
454
455    /// Removes a key from the map, returning the previous value at the key if it exists.
456    pub fn remove(&mut self, key: &K) -> Option<V> {
457        if self.root_addr == NULL {
458            return None;
459        }
460
461        let root_node = self.load_node(self.root_addr);
462        self.remove_helper(root_node, key)
463            .map(Cow::Owned)
464            .map(V::from_bytes)
465    }
466
467    // A helper method for recursively removing a key from the B-tree.
468    fn remove_helper(&mut self, mut node: Node<K>, key: &K) -> Option<Vec<u8>> {
469        if node.address() != self.root_addr {
470            // We're guaranteed that whenever this method is called an entry can be
471            // removed from the node without it needing to be merged into a sibling.
472            // This strengthened condition allows us to delete an entry in a single
473            // pass most of the time without having to back up.
474            assert!(node.can_remove_entry_without_merging());
475        }
476
477        match node.node_type() {
478            NodeType::Leaf => {
479                match node.search(key) {
480                    Ok(idx) => {
481                        // Case 1: The node is a leaf node and the key exists in it.
482                        // This is the simplest case. The key is removed from the leaf.
483                        let value = node.remove_entry(idx, self.memory()).1;
484                        self.length -= 1;
485
486                        if node.entries_len() == 0 {
487                            assert_eq!(
488                                node.address(), self.root_addr,
489                                "Removal can only result in an empty leaf node if that node is the root"
490                            );
491
492                            // Deallocate the empty node.
493                            self.allocator.deallocate(node.address());
494                            self.root_addr = NULL;
495                        } else {
496                            node.save(self.memory());
497                        }
498
499                        self.save();
500                        Some(value)
501                    }
502                    _ => None, // Key not found.
503                }
504            }
505            NodeType::Internal => {
506                match node.search(key) {
507                    Ok(idx) => {
508                        // Case 2: The node is an internal node and the key exists in it.
509
510                        let left_child = self.load_node(node.child(idx));
511                        if left_child.can_remove_entry_without_merging() {
512                            // Case 2.a: A key can be removed from the left child without merging.
513                            //
514                            //                       parent
515                            //                  [..., key, ...]
516                            //                       /   \
517                            //            [left child]   [...]
518                            //           /            \
519                            //        [...]         [..., key predecessor]
520                            //
521                            // In this case, we replace `key` with the key's predecessor from the
522                            // left child's subtree, then we recursively delete the key's
523                            // predecessor for the following end result:
524                            //
525                            //                       parent
526                            //            [..., key predecessor, ...]
527                            //                       /   \
528                            //            [left child]   [...]
529                            //           /            \
530                            //        [...]          [...]
531
532                            // Recursively delete the predecessor.
533                            // TODO(EXC-1034): Do this in a single pass.
534                            let predecessor = left_child.get_max(self.memory());
535                            self.remove_helper(left_child, &predecessor.0)?;
536
537                            // Replace the `key` with its predecessor.
538                            let (_, old_value) = node.swap_entry(idx, predecessor, self.memory());
539
540                            // Save the parent node.
541                            node.save(self.memory());
542                            return Some(old_value);
543                        }
544
545                        let right_child = self.load_node(node.child(idx + 1));
546                        if right_child.can_remove_entry_without_merging() {
547                            // Case 2.b: A key can be removed from the right child without merging.
548                            //
549                            //                       parent
550                            //                  [..., key, ...]
551                            //                       /   \
552                            //                   [...]   [right child]
553                            //                          /             \
554                            //              [key successor, ...]     [...]
555                            //
556                            // In this case, we replace `key` with the key's successor from the
557                            // right child's subtree, then we recursively delete the key's
558                            // successor for the following end result:
559                            //
560                            //                       parent
561                            //            [..., key successor, ...]
562                            //                       /   \
563                            //                  [...]   [right child]
564                            //                           /            \
565                            //                        [...]          [...]
566
567                            // Recursively delete the successor.
568                            // TODO(EXC-1034): Do this in a single pass.
569                            let successor = right_child.get_min(self.memory());
570                            self.remove_helper(right_child, &successor.0)?;
571
572                            // Replace the `key` with its successor.
573                            let (_, old_value) = node.swap_entry(idx, successor, self.memory());
574
575                            // Save the parent node.
576                            node.save(self.memory());
577                            return Some(old_value);
578                        }
579
580                        // Case 2.c: Both the left and right child are at their minimum sizes.
581                        //
582                        //                       parent
583                        //                  [..., key, ...]
584                        //                       /   \
585                        //            [left child]   [right child]
586                        //
587                        // In this case, we merge (left child, key, right child) into a single
588                        // node. The result will look like this:
589                        //
590                        //                       parent
591                        //                     [...  ...]
592                        //                         |
593                        //          [left child, `key`, right child] <= new child
594                        //
595                        // We then recurse on this new child to delete `key`.
596                        //
597                        // If `parent` becomes empty (which can only happen if it's the root),
598                        // then `parent` is deleted and `new_child` becomes the new root.
599                        assert!(left_child.at_minimum());
600                        assert!(right_child.at_minimum());
601
602                        // Merge the right child into the left child.
603                        let new_child = self.merge(
604                            right_child,
605                            left_child,
606                            node.remove_entry(idx, self.memory()),
607                        );
608
609                        // Remove the right child from the parent node.
610                        node.remove_child(idx + 1);
611
612                        if node.entries_len() == 0 {
613                            // Can only happen if this node is root.
614                            assert_eq!(node.address(), self.root_addr);
615                            assert_eq!(node.child(0), new_child.address());
616                            assert_eq!(node.children_len(), 1);
617
618                            self.root_addr = new_child.address();
619
620                            // Deallocate the root node.
621                            self.allocator.deallocate(node.address());
622                            self.save();
623                        }
624
625                        node.save(self.memory());
626                        new_child.save(self.memory());
627
628                        // Recursively delete the key.
629                        self.remove_helper(new_child, key)
630                    }
631                    Err(idx) => {
632                        // Case 3: The node is an internal node and the key does NOT exist in it.
633
634                        // If the key does exist in the tree, it will exist in the subtree at index
635                        // `idx`.
636                        let mut child = self.load_node(node.child(idx));
637
638                        if child.can_remove_entry_without_merging() {
639                            // The child has enough nodes. Recurse to delete the `key` from the
640                            // `child`.
641                            return self.remove_helper(child, key);
642                        }
643
644                        // An entry can't be removed from the child without merging.
645                        // See if it has a sibling where an entry can be removed without merging.
646                        let mut left_sibling = if idx > 0 {
647                            Some(self.load_node(node.child(idx - 1)))
648                        } else {
649                            None
650                        };
651
652                        let mut right_sibling = if idx + 1 < node.children_len() {
653                            Some(self.load_node(node.child(idx + 1)))
654                        } else {
655                            None
656                        };
657
658                        if let Some(ref mut left_sibling) = left_sibling {
659                            if left_sibling.can_remove_entry_without_merging() {
660                                // Case 3.a (left):
661                                // A key can be removed from the left child without merging.
662                                //
663                                //                            [d] (parent)
664                                //                           /   \
665                                //  (left sibling) [a, b, c]     [e, f] (child)
666                                //                         \
667                                //                         [c']
668                                //
669                                // In this case, we move a key down from the parent into the child
670                                // and move a key from the left sibling up into the parent
671                                // resulting in the following tree:
672                                //
673                                //                            [c] (parent)
674                                //                           /   \
675                                //       (left sibling) [a, b]   [d, e, f] (child)
676                                //                              /
677                                //                            [c']
678                                //
679                                // We then recurse to delete the key from the child.
680
681                                // Remove the last entry from the left sibling.
682                                let (left_sibling_key, left_sibling_value) =
683                                    left_sibling.pop_entry(self.memory()).unwrap();
684
685                                // Replace the parent's entry with the one from the left sibling.
686                                let (parent_key, parent_value) = node.swap_entry(
687                                    idx - 1,
688                                    (left_sibling_key, left_sibling_value),
689                                    self.memory(),
690                                );
691
692                                // Move the entry from the parent into the child.
693                                child.insert_entry(0, (parent_key, parent_value));
694
695                                // Move the last child from left sibling into child.
696                                if let Some(last_child) = left_sibling.pop_child() {
697                                    assert_eq!(left_sibling.node_type(), NodeType::Internal);
698                                    assert_eq!(child.node_type(), NodeType::Internal);
699
700                                    child.insert_child(0, last_child);
701                                } else {
702                                    assert_eq!(left_sibling.node_type(), NodeType::Leaf);
703                                    assert_eq!(child.node_type(), NodeType::Leaf);
704                                }
705
706                                left_sibling.save(self.memory());
707                                child.save(self.memory());
708                                node.save(self.memory());
709                                return self.remove_helper(child, key);
710                            }
711                        }
712
713                        if let Some(right_sibling) = &mut right_sibling {
714                            if right_sibling.can_remove_entry_without_merging() {
715                                // Case 3.a (right):
716                                // A key can be removed from the right child without merging.
717                                //
718                                //                            [c] (parent)
719                                //                           /   \
720                                //             (child) [a, b]     [d, e, f] (right sibling)
721                                //                               /
722                                //                            [d']
723                                //
724                                // In this case, we move a key down from the parent into the child
725                                // and move a key from the right sibling up into the parent
726                                // resulting in the following tree:
727                                //
728                                //                            [d] (parent)
729                                //                           /   \
730                                //          (child) [a, b, c]     [e, f] (right sibling)
731                                //                          \
732                                //                           [d']
733                                //
734                                // We then recurse to delete the key from the child.
735
736                                // Remove the first entry from the right sibling.
737                                let (right_sibling_key, right_sibling_value) =
738                                    right_sibling.remove_entry(0, self.memory());
739
740                                // Replace the parent's entry with the one from the right sibling.
741                                let parent_entry = node.swap_entry(
742                                    idx,
743                                    (right_sibling_key, right_sibling_value),
744                                    self.memory(),
745                                );
746
747                                // Move the entry from the parent into the child.
748                                child.push_entry(parent_entry);
749
750                                // Move the first child of right_sibling into `child`.
751                                match right_sibling.node_type() {
752                                    NodeType::Internal => {
753                                        assert_eq!(child.node_type(), NodeType::Internal);
754                                        child.push_child(right_sibling.remove_child(0));
755                                    }
756                                    NodeType::Leaf => {
757                                        assert_eq!(child.node_type(), NodeType::Leaf);
758                                    }
759                                }
760
761                                right_sibling.save(self.memory());
762                                child.save(self.memory());
763                                node.save(self.memory());
764                                return self.remove_helper(child, key);
765                            }
766                        }
767
768                        // Case 3.b: Both the left and right siblings are at their minimum sizes.
769
770                        if let Some(left_sibling) = left_sibling {
771                            // Merge child into left sibling if it exists.
772
773                            assert!(left_sibling.at_minimum());
774                            let left_sibling = self.merge(
775                                child,
776                                left_sibling,
777                                node.remove_entry(idx - 1, self.memory()),
778                            );
779                            // Removing child from parent.
780                            node.remove_child(idx);
781
782                            if node.entries_len() == 0 {
783                                self.allocator.deallocate(node.address());
784
785                                if node.address() == self.root_addr {
786                                    // Update the root.
787                                    self.root_addr = left_sibling.address();
788                                    self.save();
789                                }
790                            } else {
791                                node.save(self.memory());
792                            }
793
794                            return self.remove_helper(left_sibling, key);
795                        }
796
797                        if let Some(right_sibling) = right_sibling {
798                            // Merge child into right sibling.
799
800                            assert!(right_sibling.at_minimum());
801                            let right_sibling = self.merge(
802                                child,
803                                right_sibling,
804                                node.remove_entry(idx, self.memory()),
805                            );
806
807                            // Removing child from parent.
808                            node.remove_child(idx);
809
810                            if node.entries_len() == 0 {
811                                self.allocator.deallocate(node.address());
812
813                                if node.address() == self.root_addr {
814                                    // Update the root.
815                                    self.root_addr = right_sibling.address();
816                                    self.save();
817                                }
818                            } else {
819                                node.save(self.memory());
820                            }
821
822                            return self.remove_helper(right_sibling, key);
823                        }
824
825                        unreachable!("At least one of the siblings must exist.");
826                    }
827                }
828            }
829        }
830    }
831
832    /// Returns an iterator over the entries of the map, sorted by key.
833    pub fn iter(&self) -> Iter<K, V, M> {
834        Iter::new(self)
835    }
836
837    /// Returns an iterator over the entries in the map where keys
838    /// belong to the specified range.
839    pub fn range(&self, key_range: impl RangeBounds<K>) -> Iter<K, V, M> {
840        if self.root_addr == NULL {
841            // Map is empty.
842            return Iter::null(self);
843        }
844
845        let range = (
846            key_range.start_bound().cloned(),
847            key_range.end_bound().cloned(),
848        );
849
850        let mut cursors = vec![];
851
852        match key_range.start_bound() {
853            Bound::Unbounded => {
854                cursors.push(Cursor::Address(self.root_addr));
855                Iter::new_in_range(self, range, cursors)
856            }
857            Bound::Included(key) | Bound::Excluded(key) => {
858                let mut node = self.load_node(self.root_addr);
859                loop {
860                    match node.search(key) {
861                        Ok(idx) => {
862                            if let Bound::Included(_) = key_range.start_bound() {
863                                // We found the key exactly matching the left bound.
864                                // Here is where we'll start the iteration.
865                                cursors.push(Cursor::Node {
866                                    node,
867                                    next: Index::Entry(idx),
868                                });
869                                return Iter::new_in_range(self, range, cursors);
870                            } else {
871                                // We found the key that we must
872                                // exclude.  We add its right neighbor
873                                // to the stack and start iterating
874                                // from its right child.
875                                let right_child = match node.node_type() {
876                                    NodeType::Internal => Some(node.child(idx + 1)),
877                                    NodeType::Leaf => None,
878                                };
879
880                                if idx + 1 != node.entries_len()
881                                    && key_range.contains(node.key(idx + 1))
882                                {
883                                    cursors.push(Cursor::Node {
884                                        node,
885                                        next: Index::Entry(idx + 1),
886                                    });
887                                }
888                                if let Some(right_child) = right_child {
889                                    cursors.push(Cursor::Address(right_child));
890                                }
891                                return Iter::new_in_range(self, range, cursors);
892                            }
893                        }
894                        Err(idx) => {
895                            // The `idx` variable points to the first
896                            // key that is greater than the left
897                            // bound.
898                            //
899                            // If the index points to a valid node, we
900                            // will visit its left subtree and then
901                            // return to this key.
902                            //
903                            // If the index points at the end of
904                            // array, we'll continue with the right
905                            // child of the last key.
906
907                            // Load the left child of the node to visit if it exists.
908                            // This is done first to avoid cloning the node.
909                            let child = match node.node_type() {
910                                NodeType::Internal => {
911                                    // Note that loading a child node cannot fail since
912                                    // len(children) = len(entries) + 1
913                                    Some(self.load_node(node.child(idx)))
914                                }
915                                NodeType::Leaf => None,
916                            };
917
918                            if idx < node.entries_len() && key_range.contains(node.key(idx)) {
919                                cursors.push(Cursor::Node {
920                                    node,
921                                    next: Index::Entry(idx),
922                                });
923                            }
924
925                            match child {
926                                None => {
927                                    // Leaf node. Return an iterator with the found cursors.
928                                    return Iter::new_in_range(self, range, cursors);
929                                }
930                                Some(child) => {
931                                    // Iterate over the child node.
932                                    node = child;
933                                }
934                            }
935                        }
936                    }
937                }
938            }
939        }
940    }
941
942    /// Returns an iterator pointing to the first element below the given bound.
943    /// Returns an empty iterator if there are no keys below the given bound.
944    pub fn iter_upper_bound(&self, bound: &K) -> Iter<K, V, M> {
945        if self.root_addr == NULL {
946            // Map is empty.
947            return Iter::null(self);
948        }
949
950        let dummy_bounds = (Bound::Unbounded, Bound::Unbounded);
951        // INVARIANT: all cursors point to keys greater than or equal to bound.
952        let mut cursors = vec![];
953
954        let mut node = self.load_node(self.root_addr);
955        loop {
956            match node.search(bound) {
957                Ok(idx) | Err(idx) => {
958                    match node.node_type() {
959                        NodeType::Leaf => {
960                            if idx == 0 {
961                                // We descended into a leaf but didn't find a node less than
962                                // the upper bound. Thus we unwind the cursor stack until we
963                                // hit a cursor pointing to an element other than the first key,
964                                // and we shift the position backward. If there is no such cursor,
965                                // the bound must be <= min element, so we return an empty iterator.
966                                while let Some(cursor) = cursors.pop() {
967                                    match cursor {
968                                        Cursor::Node {
969                                            node,
970                                            next: Index::Entry(n),
971                                        } => {
972                                            if n == 0 {
973                                                debug_assert!(node.key(n) >= bound);
974                                                continue;
975                                            } else {
976                                                debug_assert!(node.key(n - 1) < bound);
977                                                cursors.push(Cursor::Node {
978                                                    node,
979                                                    next: Index::Entry(n - 1),
980                                                });
981                                                break;
982                                            }
983                                        }
984                                        _ => panic!("BUG: unexpected cursor shape"),
985                                    }
986                                }
987                                // If the cursors are empty, the iterator will be empty.
988                                return Iter::new_in_range(self, dummy_bounds, cursors);
989                            }
990                            debug_assert!(node.key(idx - 1) < bound);
991
992                            cursors.push(Cursor::Node {
993                                node,
994                                next: Index::Entry(idx - 1),
995                            });
996                            return Iter::new_in_range(self, dummy_bounds, cursors);
997                        }
998                        NodeType::Internal => {
999                            let child = self.load_node(node.child(idx));
1000                            // We push the node even if idx == node.entries_len()
1001                            // If we find the position in the child, the iterator will skip this
1002                            // cursor. But if the all keys in the child are greater than or equal to
1003                            // the bound, we will be able to use this cursor as a fallback.
1004                            cursors.push(Cursor::Node {
1005                                node,
1006                                next: Index::Entry(idx),
1007                            });
1008                            node = child;
1009                        }
1010                    }
1011                }
1012            }
1013        }
1014    }
1015
1016    // Merges one node (`source`) into another (`into`), along with a median entry.
1017    //
1018    // Example (values are not included for brevity):
1019    //
1020    // Input:
1021    //   Source: [1, 2, 3]
1022    //   Into: [5, 6, 7]
1023    //   Median: 4
1024    //
1025    // Output:
1026    //   [1, 2, 3, 4, 5, 6, 7] (stored in the `into` node)
1027    //   `source` is deallocated.
1028    fn merge(&mut self, source: Node<K>, mut into: Node<K>, median: Entry<K>) -> Node<K> {
1029        let source_address = source.address();
1030        into.merge(source, median, self.memory());
1031        into.save(self.memory());
1032        self.allocator.deallocate(source_address);
1033        into
1034    }
1035
1036    fn allocate_node(&mut self, node_type: NodeType) -> Node<K> {
1037        Node::new(
1038            self.allocator.allocate(),
1039            node_type,
1040            self.max_key_size,
1041            self.max_value_size,
1042        )
1043    }
1044
1045    fn load_node(&self, address: Address) -> Node<K> {
1046        Node::load(
1047            address,
1048            self.memory(),
1049            self.max_key_size,
1050            self.max_value_size,
1051        )
1052    }
1053
1054    // Saves the map to memory.
1055    fn save(&self) {
1056        let header = BTreeHeaderV1 {
1057            magic: *MAGIC,
1058            version: LAYOUT_VERSION,
1059            max_key_size: self.max_key_size,
1060            max_value_size: self.max_value_size,
1061            root_addr: self.root_addr,
1062            length: self.length,
1063        };
1064
1065        Self::write_header(&header, self.memory());
1066    }
1067
1068    /// Write the layout header to the memory.
1069    fn write_header(header: &BTreeHeaderV1, memory: &M) {
1070        // Serialize the header
1071        let mut buf = [0; PACKED_HEADER_SIZE];
1072        buf[0..3].copy_from_slice(&header.magic);
1073        buf[3] = header.version;
1074        buf[4..8].copy_from_slice(&header.max_key_size.to_le_bytes());
1075        buf[8..12].copy_from_slice(&header.max_value_size.to_le_bytes());
1076        buf[12..20].copy_from_slice(&header.root_addr.get().to_le_bytes());
1077        buf[20..28].copy_from_slice(&header.length.to_le_bytes());
1078        // Write the header
1079        crate::write(memory, 0, &buf);
1080    }
1081}
1082
1083/// An error returned when inserting entries into the map.
1084#[derive(Debug, PartialEq, Eq)]
1085pub enum InsertError {
1086    KeyTooLarge { given: usize, max: usize },
1087    ValueTooLarge { given: usize, max: usize },
1088}
1089
1090impl std::fmt::Display for InsertError {
1091    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1092        match self {
1093            Self::KeyTooLarge { given, max } => {
1094                write!(
1095                    f,
1096                    "InsertError::KeyTooLarge Expected key to be <= {max} bytes but received key with {given} bytes."
1097                )
1098            }
1099            Self::ValueTooLarge { given, max } => {
1100                write!(
1101                    f,
1102                    "InsertError::ValueTooLarge Expected value to be <= {max} bytes but received value with {given} bytes."
1103                )
1104            }
1105        }
1106    }
1107}
1108
1109#[cfg(test)]
1110mod test {
1111    use super::*;
1112    use crate::storable::Blob;
1113    use std::cell::RefCell;
1114    use std::rc::Rc;
1115
1116    fn make_memory() -> Rc<RefCell<Vec<u8>>> {
1117        Rc::new(RefCell::new(Vec::new()))
1118    }
1119
1120    // A helper method to succinctly create an entry.
1121    fn e(x: u8) -> (Vec<u8>, Vec<u8>) {
1122        (vec![x], vec![])
1123    }
1124
1125    // Make `Vec<u8>` bounded so that it can be used as a key/value in the btree.
1126    impl BoundedStorable for Vec<u8> {
1127        const MAX_SIZE: u32 = 10;
1128        const IS_FIXED_SIZE: bool = false;
1129    }
1130
1131    #[test]
1132    fn init_preserves_data() {
1133        let mem = make_memory();
1134        let mut btree = BTreeMap::init(mem.clone());
1135        assert_eq!(btree.insert(vec![1, 2, 3], vec![4, 5, 6]), None);
1136        assert_eq!(btree.get(&vec![1, 2, 3]), Some(vec![4, 5, 6]));
1137
1138        // Reload the btree
1139        let btree = BTreeMap::init(mem);
1140
1141        // Data still exists.
1142        assert_eq!(btree.get(&vec![1, 2, 3]), Some(vec![4, 5, 6]));
1143    }
1144
1145    #[test]
1146    fn insert_get() {
1147        let mem = make_memory();
1148        let mut btree = BTreeMap::new(mem);
1149
1150        assert_eq!(btree.insert(vec![1, 2, 3], vec![4, 5, 6]), None);
1151        assert_eq!(btree.get(&vec![1, 2, 3]), Some(vec![4, 5, 6]));
1152    }
1153
1154    #[test]
1155    fn insert_overwrites_previous_value() {
1156        let mem = make_memory();
1157        let mut btree = BTreeMap::new(mem);
1158
1159        assert_eq!(btree.insert(vec![1, 2, 3], vec![4, 5, 6]), None);
1160        assert_eq!(
1161            btree.insert(vec![1, 2, 3], vec![7, 8, 9]),
1162            Some(vec![4, 5, 6])
1163        );
1164        assert_eq!(btree.get(&vec![1, 2, 3]), Some(vec![7, 8, 9]));
1165    }
1166
1167    #[test]
1168    fn insert_get_multiple() {
1169        let mem = make_memory();
1170        let mut btree = BTreeMap::new(mem);
1171
1172        assert_eq!(btree.insert(vec![1, 2, 3], vec![4, 5, 6]), None);
1173        assert_eq!(btree.insert(vec![4, 5], vec![7, 8, 9, 10]), None);
1174        assert_eq!(btree.insert(vec![], vec![11]), None);
1175        assert_eq!(btree.get(&vec![1, 2, 3]), Some(vec![4, 5, 6]));
1176        assert_eq!(btree.get(&vec![4, 5]), Some(vec![7, 8, 9, 10]));
1177        assert_eq!(btree.get(&vec![]), Some(vec![11]));
1178    }
1179
1180    #[test]
1181    fn insert_overwrite_median_key_in_full_child_node() {
1182        let mem = make_memory();
1183        let mut btree = BTreeMap::new(mem);
1184
1185        for i in 1..=17 {
1186            assert_eq!(btree.insert(vec![i], vec![]), None);
1187        }
1188
1189        // The result should look like this:
1190        //                [6]
1191        //               /   \
1192        // [1, 2, 3, 4, 5]   [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]
1193
1194        let root = btree.load_node(btree.root_addr);
1195        assert_eq!(root.node_type(), NodeType::Internal);
1196        assert_eq!(root.entries(btree.memory()), vec![(vec![6], vec![])]);
1197        assert_eq!(root.children_len(), 2);
1198
1199        // The right child should now be full, with the median key being "12"
1200        let right_child = btree.load_node(root.child(1));
1201        assert!(right_child.is_full());
1202        let median_index = right_child.entries_len() / 2;
1203        assert_eq!(right_child.key(median_index), &vec![12]);
1204
1205        // Overwrite the median key.
1206        assert_eq!(btree.insert(vec![12], vec![1, 2, 3]), Some(vec![]));
1207
1208        // The key is overwritten successfully.
1209        assert_eq!(btree.get(&vec![12]), Some(vec![1, 2, 3]));
1210
1211        // The child has not been split and is still full.
1212        let right_child = btree.load_node(root.child(1));
1213        assert_eq!(right_child.node_type(), NodeType::Leaf);
1214        assert!(right_child.is_full());
1215    }
1216
1217    #[test]
1218    fn insert_overwrite_key_in_full_root_node() {
1219        let mem = make_memory();
1220        let mut btree = BTreeMap::new(mem);
1221
1222        for i in 1..=11 {
1223            assert_eq!(btree.insert(vec![i], vec![]), None);
1224        }
1225
1226        // We now have a root that is full and looks like this:
1227        //
1228        // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
1229        let root = btree.load_node(btree.root_addr);
1230        assert!(root.is_full());
1231
1232        // Overwrite an element in the root. It should NOT cause the node to be split.
1233        assert_eq!(btree.insert(vec![6], vec![4, 5, 6]), Some(vec![]));
1234
1235        let root = btree.load_node(btree.root_addr);
1236        assert_eq!(root.node_type(), NodeType::Leaf);
1237        assert_eq!(btree.get(&vec![6]), Some(vec![4, 5, 6]));
1238        assert_eq!(root.entries_len(), 11);
1239    }
1240
1241    #[test]
1242    fn allocations() {
1243        let mem = make_memory();
1244        let mut btree = BTreeMap::new(mem);
1245
1246        // Insert entries until the root node is full.
1247        let mut i = 0;
1248        loop {
1249            assert_eq!(btree.insert(vec![i], vec![]), None);
1250            let root = btree.load_node(btree.root_addr);
1251            if root.is_full() {
1252                break;
1253            }
1254            i += 1;
1255        }
1256
1257        // Only need a single allocation to store up to `CAPACITY` elements.
1258        assert_eq!(btree.allocator.num_allocated_chunks(), 1);
1259
1260        assert_eq!(btree.insert(vec![255], vec![]), None);
1261
1262        // The node had to be split into three nodes.
1263        assert_eq!(btree.allocator.num_allocated_chunks(), 3);
1264    }
1265
1266    #[test]
1267    fn allocations_2() {
1268        let mem = make_memory();
1269        let mut btree = BTreeMap::new(mem);
1270        assert_eq!(btree.allocator.num_allocated_chunks(), 0);
1271
1272        assert_eq!(btree.insert(vec![], vec![]), None);
1273        assert_eq!(btree.allocator.num_allocated_chunks(), 1);
1274
1275        assert_eq!(btree.remove(&vec![]), Some(vec![]));
1276        assert_eq!(btree.allocator.num_allocated_chunks(), 0);
1277    }
1278
1279    #[test]
1280    fn insert_same_key_multiple() {
1281        let mem = make_memory();
1282        let mut btree = BTreeMap::new(mem);
1283
1284        assert_eq!(btree.insert(vec![1], vec![2]), None);
1285
1286        for i in 2..10 {
1287            assert_eq!(btree.insert(vec![1], vec![i + 1]), Some(vec![i]));
1288        }
1289    }
1290
1291    #[test]
1292    fn insert_split_node() {
1293        let mem = make_memory();
1294        let mut btree = BTreeMap::new(mem);
1295
1296        for i in 1..=11 {
1297            assert_eq!(btree.insert(vec![i], vec![]), None);
1298        }
1299
1300        // Should now split a node.
1301        assert_eq!(btree.insert(vec![12], vec![]), None);
1302
1303        // The result should look like this:
1304        //                [6]
1305        //               /   \
1306        // [1, 2, 3, 4, 5]   [7, 8, 9, 10, 11, 12]
1307
1308        for i in 1..=12 {
1309            assert_eq!(btree.get(&vec![i]), Some(vec![]));
1310        }
1311    }
1312
1313    #[test]
1314    fn insert_split_multiple_nodes() {
1315        let mem = make_memory();
1316        let mut btree = BTreeMap::new(mem);
1317
1318        for i in 1..=11 {
1319            assert_eq!(btree.insert(vec![i], vec![]), None);
1320        }
1321        // Should now split a node.
1322        assert_eq!(btree.insert(vec![12], vec![]), None);
1323
1324        // The result should look like this:
1325        //                [6]
1326        //               /   \
1327        // [1, 2, 3, 4, 5]   [7, 8, 9, 10, 11, 12]
1328
1329        let root = btree.load_node(btree.root_addr);
1330        assert_eq!(root.node_type(), NodeType::Internal);
1331        assert_eq!(root.entries(btree.memory()), vec![(vec![6], vec![])]);
1332        assert_eq!(root.children_len(), 2);
1333
1334        let child_0 = btree.load_node(root.child(0));
1335        assert_eq!(child_0.node_type(), NodeType::Leaf);
1336        assert_eq!(
1337            child_0.entries(btree.memory()),
1338            vec![
1339                (vec![1], vec![]),
1340                (vec![2], vec![]),
1341                (vec![3], vec![]),
1342                (vec![4], vec![]),
1343                (vec![5], vec![])
1344            ]
1345        );
1346
1347        let child_1 = btree.load_node(root.child(1));
1348        assert_eq!(child_1.node_type(), NodeType::Leaf);
1349        assert_eq!(
1350            child_1.entries(btree.memory()),
1351            vec![
1352                (vec![7], vec![]),
1353                (vec![8], vec![]),
1354                (vec![9], vec![]),
1355                (vec![10], vec![]),
1356                (vec![11], vec![]),
1357                (vec![12], vec![])
1358            ]
1359        );
1360
1361        for i in 1..=12 {
1362            assert_eq!(btree.get(&vec![i]), Some(vec![]));
1363        }
1364
1365        // Insert more to cause more splitting.
1366        assert_eq!(btree.insert(vec![13], vec![]), None);
1367        assert_eq!(btree.insert(vec![14], vec![]), None);
1368        assert_eq!(btree.insert(vec![15], vec![]), None);
1369        assert_eq!(btree.insert(vec![16], vec![]), None);
1370        assert_eq!(btree.insert(vec![17], vec![]), None);
1371        // Should cause another split
1372        assert_eq!(btree.insert(vec![18], vec![]), None);
1373
1374        for i in 1..=18 {
1375            assert_eq!(btree.get(&vec![i]), Some(vec![]));
1376        }
1377
1378        let root = btree.load_node(btree.root_addr);
1379        assert_eq!(root.node_type(), NodeType::Internal);
1380        assert_eq!(
1381            root.entries(btree.memory()),
1382            vec![(vec![6], vec![]), (vec![12], vec![])]
1383        );
1384        assert_eq!(root.children_len(), 3);
1385
1386        let child_0 = btree.load_node(root.child(0));
1387        assert_eq!(child_0.node_type(), NodeType::Leaf);
1388        assert_eq!(
1389            child_0.entries(btree.memory()),
1390            vec![
1391                (vec![1], vec![]),
1392                (vec![2], vec![]),
1393                (vec![3], vec![]),
1394                (vec![4], vec![]),
1395                (vec![5], vec![])
1396            ]
1397        );
1398
1399        let child_1 = btree.load_node(root.child(1));
1400        assert_eq!(child_1.node_type(), NodeType::Leaf);
1401        assert_eq!(
1402            child_1.entries(btree.memory()),
1403            vec![
1404                (vec![7], vec![]),
1405                (vec![8], vec![]),
1406                (vec![9], vec![]),
1407                (vec![10], vec![]),
1408                (vec![11], vec![]),
1409            ]
1410        );
1411
1412        let child_2 = btree.load_node(root.child(2));
1413        assert_eq!(child_2.node_type(), NodeType::Leaf);
1414        assert_eq!(
1415            child_2.entries(btree.memory()),
1416            vec![
1417                (vec![13], vec![]),
1418                (vec![14], vec![]),
1419                (vec![15], vec![]),
1420                (vec![16], vec![]),
1421                (vec![17], vec![]),
1422                (vec![18], vec![]),
1423            ]
1424        );
1425    }
1426
1427    #[test]
1428    fn remove_simple() {
1429        let mem = make_memory();
1430        let mut btree = BTreeMap::new(mem);
1431
1432        assert_eq!(btree.insert(vec![1, 2, 3], vec![4, 5, 6]), None);
1433        assert_eq!(btree.get(&vec![1, 2, 3]), Some(vec![4, 5, 6]));
1434        assert_eq!(btree.remove(&vec![1, 2, 3]), Some(vec![4, 5, 6]));
1435        assert_eq!(btree.get(&vec![1, 2, 3]), None);
1436    }
1437
1438    #[test]
1439    fn remove_case_2a_and_2c() {
1440        let mem = make_memory();
1441        let mut btree = BTreeMap::new(mem.clone());
1442
1443        for i in 1..=11 {
1444            assert_eq!(btree.insert(vec![i], vec![]), None);
1445        }
1446        // Should now split a node.
1447        assert_eq!(btree.insert(vec![0], vec![]), None);
1448
1449        // The result should look like this:
1450        //                    [6]
1451        //                   /   \
1452        // [0, 1, 2, 3, 4, 5]     [7, 8, 9, 10, 11]
1453
1454        for i in 0..=11 {
1455            assert_eq!(btree.get(&vec![i]), Some(vec![]));
1456        }
1457
1458        // Remove node 6. Triggers case 2.a
1459        assert_eq!(btree.remove(&vec![6]), Some(vec![]));
1460
1461        // The result should look like this:
1462        //                [5]
1463        //               /   \
1464        // [0, 1, 2, 3, 4]   [7, 8, 9, 10, 11]
1465        let root = btree.load_node(btree.root_addr);
1466        assert_eq!(root.node_type(), NodeType::Internal);
1467        assert_eq!(root.entries(btree.memory()), vec![e(5)]);
1468        assert_eq!(root.children_len(), 2);
1469
1470        let child_0 = btree.load_node(root.child(0));
1471        assert_eq!(child_0.node_type(), NodeType::Leaf);
1472        assert_eq!(
1473            child_0.entries(btree.memory()),
1474            vec![e(0), e(1), e(2), e(3), e(4)]
1475        );
1476
1477        let child_1 = btree.load_node(root.child(1));
1478        assert_eq!(child_1.node_type(), NodeType::Leaf);
1479        assert_eq!(
1480            child_1.entries(btree.memory()),
1481            vec![e(7), e(8), e(9), e(10), e(11)]
1482        );
1483
1484        // There are three allocated nodes.
1485        assert_eq!(btree.allocator.num_allocated_chunks(), 3);
1486
1487        // Remove node 5. Triggers case 2c
1488        assert_eq!(btree.remove(&vec![5]), Some(vec![]));
1489
1490        // Reload the btree to verify that we saved it correctly.
1491        let btree = BTreeMap::<Vec<u8>, Vec<u8>, _>::load(mem);
1492
1493        // The result should look like this:
1494        // [0, 1, 2, 3, 4, 7, 8, 9, 10, 11]
1495        let root = btree.load_node(btree.root_addr);
1496        assert_eq!(
1497            root.entries(btree.memory()),
1498            vec![e(0), e(1), e(2), e(3), e(4), e(7), e(8), e(9), e(10), e(11)]
1499        );
1500
1501        // There is only one node allocated.
1502        assert_eq!(btree.allocator.num_allocated_chunks(), 1);
1503    }
1504
1505    #[test]
1506    fn remove_case_2b() {
1507        let mem = make_memory();
1508        let mut btree = BTreeMap::new(mem);
1509
1510        for i in 1..=11 {
1511            assert_eq!(btree.insert(vec![i], vec![]), None);
1512        }
1513        // Should now split a node.
1514        assert_eq!(btree.insert(vec![12], vec![]), None);
1515
1516        // The result should look like this:
1517        //                [6]
1518        //               /   \
1519        // [1, 2, 3, 4, 5]   [7, 8, 9, 10, 11, 12]
1520
1521        for i in 1..=12 {
1522            assert_eq!(btree.get(&vec![i]), Some(vec![]));
1523        }
1524
1525        // Remove node 6. Triggers case 2.b
1526        assert_eq!(btree.remove(&vec![6]), Some(vec![]));
1527
1528        // The result should look like this:
1529        //                [7]
1530        //               /   \
1531        // [1, 2, 3, 4, 5]   [8, 9, 10, 11, 12]
1532        let root = btree.load_node(btree.root_addr);
1533        assert_eq!(root.node_type(), NodeType::Internal);
1534        assert_eq!(root.entries(btree.memory()), vec![e(7)]);
1535        assert_eq!(root.children_len(), 2);
1536
1537        let child_0 = btree.load_node(root.child(0));
1538        assert_eq!(child_0.node_type(), NodeType::Leaf);
1539        assert_eq!(
1540            child_0.entries(btree.memory()),
1541            vec![e(1), e(2), e(3), e(4), e(5)]
1542        );
1543
1544        let child_1 = btree.load_node(root.child(1));
1545        assert_eq!(child_1.node_type(), NodeType::Leaf);
1546        assert_eq!(
1547            child_1.entries(btree.memory()),
1548            vec![e(8), e(9), e(10), e(11), e(12)]
1549        );
1550
1551        // Remove node 7. Triggers case 2.c
1552        assert_eq!(btree.remove(&vec![7]), Some(vec![]));
1553        // The result should look like this:
1554        //
1555        // [1, 2, 3, 4, 5, 8, 9, 10, 11, 12]
1556        let root = btree.load_node(btree.root_addr);
1557        assert_eq!(root.node_type(), NodeType::Leaf);
1558        assert_eq!(
1559            root.entries(btree.memory()),
1560            vec![
1561                e(1),
1562                e(2),
1563                e(3),
1564                e(4),
1565                e(5),
1566                e(8),
1567                e(9),
1568                e(10),
1569                e(11),
1570                e(12)
1571            ]
1572        );
1573    }
1574
1575    #[test]
1576    fn remove_case_3a_right() {
1577        let mem = make_memory();
1578        let mut btree = BTreeMap::new(mem);
1579
1580        for i in 1..=11 {
1581            assert_eq!(btree.insert(vec![i], vec![]), None);
1582        }
1583
1584        // Should now split a node.
1585        assert_eq!(btree.insert(vec![12], vec![]), None);
1586
1587        // The result should look like this:
1588        //                [6]
1589        //               /   \
1590        // [1, 2, 3, 4, 5]   [7, 8, 9, 10, 11, 12]
1591
1592        // Remove node 3. Triggers case 3.a
1593        assert_eq!(btree.remove(&vec![3]), Some(vec![]));
1594
1595        // The result should look like this:
1596        //                [7]
1597        //               /   \
1598        // [1, 2, 4, 5, 6]   [8, 9, 10, 11, 12]
1599        let root = btree.load_node(btree.root_addr);
1600        assert_eq!(root.node_type(), NodeType::Internal);
1601        assert_eq!(root.entries(btree.memory()), vec![(vec![7], vec![])]);
1602        assert_eq!(root.children_len(), 2);
1603
1604        let child_0 = btree.load_node(root.child(0));
1605        assert_eq!(child_0.node_type(), NodeType::Leaf);
1606        assert_eq!(
1607            child_0.entries(btree.memory()),
1608            vec![e(1), e(2), e(4), e(5), e(6)]
1609        );
1610
1611        let child_1 = btree.load_node(root.child(1));
1612        assert_eq!(child_1.node_type(), NodeType::Leaf);
1613        assert_eq!(
1614            child_1.entries(btree.memory()),
1615            vec![e(8), e(9), e(10), e(11), e(12)]
1616        );
1617
1618        // There are three allocated nodes.
1619        assert_eq!(btree.allocator.num_allocated_chunks(), 3);
1620    }
1621
1622    #[test]
1623    fn remove_case_3a_left() {
1624        let mem = make_memory();
1625        let mut btree = BTreeMap::new(mem);
1626
1627        for i in 1..=11 {
1628            assert_eq!(btree.insert(vec![i], vec![]), None);
1629        }
1630        // Should now split a node.
1631        assert_eq!(btree.insert(vec![0], vec![]), None);
1632
1633        // The result should look like this:
1634        //                   [6]
1635        //                  /   \
1636        // [0, 1, 2, 3, 4, 5]   [7, 8, 9, 10, 11]
1637
1638        // Remove node 8. Triggers case 3.a left
1639        assert_eq!(btree.remove(&vec![8]), Some(vec![]));
1640
1641        // The result should look like this:
1642        //                [5]
1643        //               /   \
1644        // [0, 1, 2, 3, 4]   [6, 7, 9, 10, 11]
1645        let root = btree.load_node(btree.root_addr);
1646        assert_eq!(root.node_type(), NodeType::Internal);
1647        assert_eq!(root.entries(btree.memory()), vec![(vec![5], vec![])]);
1648        assert_eq!(root.children_len(), 2);
1649
1650        let child_0 = btree.load_node(root.child(0));
1651        assert_eq!(child_0.node_type(), NodeType::Leaf);
1652        assert_eq!(
1653            child_0.entries(btree.memory()),
1654            vec![e(0), e(1), e(2), e(3), e(4)]
1655        );
1656
1657        let child_1 = btree.load_node(root.child(1));
1658        assert_eq!(child_1.node_type(), NodeType::Leaf);
1659        assert_eq!(
1660            child_1.entries(btree.memory()),
1661            vec![e(6), e(7), e(9), e(10), e(11)]
1662        );
1663
1664        // There are three allocated nodes.
1665        assert_eq!(btree.allocator.num_allocated_chunks(), 3);
1666    }
1667
1668    #[test]
1669    fn remove_case_3b_merge_into_right() {
1670        let mem = make_memory();
1671        let mut btree = BTreeMap::new(mem.clone());
1672
1673        for i in 1..=11 {
1674            assert_eq!(btree.insert(vec![i], vec![]), None);
1675        }
1676        // Should now split a node.
1677        assert_eq!(btree.insert(vec![12], vec![]), None);
1678
1679        // The result should look like this:
1680        //                [6]
1681        //               /   \
1682        // [1, 2, 3, 4, 5]   [7, 8, 9, 10, 11, 12]
1683
1684        for i in 1..=12 {
1685            assert_eq!(btree.get(&vec![i]), Some(vec![]));
1686        }
1687
1688        // Remove node 6. Triggers case 2.b
1689        assert_eq!(btree.remove(&vec![6]), Some(vec![]));
1690        // The result should look like this:
1691        //                [7]
1692        //               /   \
1693        // [1, 2, 3, 4, 5]   [8, 9, 10, 11, 12]
1694        let root = btree.load_node(btree.root_addr);
1695        assert_eq!(root.node_type(), NodeType::Internal);
1696        assert_eq!(root.entries(btree.memory()), vec![(vec![7], vec![])]);
1697        assert_eq!(root.children_len(), 2);
1698
1699        let child_0 = btree.load_node(root.child(0));
1700        assert_eq!(child_0.node_type(), NodeType::Leaf);
1701        assert_eq!(
1702            child_0.entries(btree.memory()),
1703            vec![e(1), e(2), e(3), e(4), e(5)]
1704        );
1705
1706        let child_1 = btree.load_node(root.child(1));
1707        assert_eq!(child_1.node_type(), NodeType::Leaf);
1708        assert_eq!(
1709            child_1.entries(btree.memory()),
1710            vec![e(8), e(9), e(10), e(11), e(12)]
1711        );
1712
1713        // There are three allocated nodes.
1714        assert_eq!(btree.allocator.num_allocated_chunks(), 3);
1715
1716        // Remove node 3. Triggers case 3.b
1717        assert_eq!(btree.remove(&vec![3]), Some(vec![]));
1718
1719        // Reload the btree to verify that we saved it correctly.
1720        let btree = BTreeMap::<Vec<u8>, Vec<u8>, _>::load(mem);
1721
1722        // The result should look like this:
1723        //
1724        // [1, 2, 4, 5, 7, 8, 9, 10, 11, 12]
1725        let root = btree.load_node(btree.root_addr);
1726        assert_eq!(root.node_type(), NodeType::Leaf);
1727        assert_eq!(
1728            root.entries(btree.memory()),
1729            vec![
1730                e(1),
1731                e(2),
1732                e(4),
1733                e(5),
1734                e(7),
1735                e(8),
1736                e(9),
1737                e(10),
1738                e(11),
1739                e(12)
1740            ]
1741        );
1742
1743        // There is only one allocated node remaining.
1744        assert_eq!(btree.allocator.num_allocated_chunks(), 1);
1745    }
1746
1747    #[test]
1748    fn remove_case_3b_merge_into_left() {
1749        let mem = make_memory();
1750        let mut btree = BTreeMap::new(mem.clone());
1751
1752        for i in 1..=11 {
1753            assert_eq!(btree.insert(vec![i], vec![]), None);
1754        }
1755
1756        // Should now split a node.
1757        assert_eq!(btree.insert(vec![12], vec![]), None);
1758
1759        // The result should look like this:
1760        //                [6]
1761        //               /   \
1762        // [1, 2, 3, 4, 5]   [7, 8, 9, 10, 11, 12]
1763
1764        for i in 1..=12 {
1765            assert_eq!(btree.get(&vec![i]), Some(vec![]));
1766        }
1767
1768        // Remove node 6. Triggers case 2.b
1769        assert_eq!(btree.remove(&vec![6]), Some(vec![]));
1770
1771        // The result should look like this:
1772        //                [7]
1773        //               /   \
1774        // [1, 2, 3, 4, 5]   [8, 9, 10, 11, 12]
1775        let root = btree.load_node(btree.root_addr);
1776        assert_eq!(root.node_type(), NodeType::Internal);
1777        assert_eq!(root.entries(btree.memory()), vec![(vec![7], vec![])]);
1778        assert_eq!(root.children_len(), 2);
1779
1780        let child_0 = btree.load_node(root.child(0));
1781        assert_eq!(child_0.node_type(), NodeType::Leaf);
1782        assert_eq!(
1783            child_0.entries(btree.memory()),
1784            vec![e(1), e(2), e(3), e(4), e(5)]
1785        );
1786
1787        let child_1 = btree.load_node(root.child(1));
1788        assert_eq!(child_1.node_type(), NodeType::Leaf);
1789        assert_eq!(
1790            child_1.entries(btree.memory()),
1791            vec![e(8), e(9), e(10), e(11), e(12)]
1792        );
1793
1794        // There are three allocated nodes.
1795        assert_eq!(btree.allocator.num_allocated_chunks(), 3);
1796
1797        // Remove node 10. Triggers case 3.b where we merge the right into the left.
1798        assert_eq!(btree.remove(&vec![10]), Some(vec![]));
1799
1800        // Reload the btree to verify that we saved it correctly.
1801        let btree = BTreeMap::<Vec<u8>, Vec<u8>, _>::load(mem);
1802
1803        // The result should look like this:
1804        //
1805        // [1, 2, 3, 4, 5, 7, 8, 9, 11, 12]
1806        let root = btree.load_node(btree.root_addr);
1807        assert_eq!(root.node_type(), NodeType::Leaf);
1808        assert_eq!(
1809            root.entries(btree.memory()),
1810            vec![e(1), e(2), e(3), e(4), e(5), e(7), e(8), e(9), e(11), e(12)]
1811        );
1812
1813        // There is only one allocated node remaining.
1814        assert_eq!(btree.allocator.num_allocated_chunks(), 1);
1815    }
1816
1817    #[test]
1818    fn many_insertions() {
1819        let mem = make_memory();
1820        let mut btree = BTreeMap::new(mem.clone());
1821
1822        for j in 0..=10 {
1823            for i in 0..=255 {
1824                assert_eq!(btree.insert(vec![i, j], vec![i, j]), None);
1825            }
1826        }
1827
1828        for j in 0..=10 {
1829            for i in 0..=255 {
1830                assert_eq!(btree.get(&vec![i, j]), Some(vec![i, j]));
1831            }
1832        }
1833
1834        let mut btree = BTreeMap::load(mem);
1835
1836        for j in 0..=10 {
1837            for i in 0..=255 {
1838                assert_eq!(btree.remove(&vec![i, j]), Some(vec![i, j]));
1839            }
1840        }
1841
1842        for j in 0..=10 {
1843            for i in 0..=255 {
1844                assert_eq!(btree.get(&vec![i, j]), None);
1845            }
1846        }
1847
1848        // We've deallocated everything.
1849        assert_eq!(btree.allocator.num_allocated_chunks(), 0);
1850    }
1851
1852    #[test]
1853    fn many_insertions_2() {
1854        let mem = make_memory();
1855        let mut btree = BTreeMap::new(mem.clone());
1856
1857        for j in (0..=10).rev() {
1858            for i in (0..=255).rev() {
1859                assert_eq!(btree.insert(vec![i, j], vec![i, j]), None);
1860            }
1861        }
1862
1863        for j in 0..=10 {
1864            for i in 0..=255 {
1865                assert_eq!(btree.get(&vec![i, j]), Some(vec![i, j]));
1866            }
1867        }
1868
1869        let mut btree = BTreeMap::load(mem);
1870
1871        for j in (0..=10).rev() {
1872            for i in (0..=255).rev() {
1873                assert_eq!(btree.remove(&vec![i, j]), Some(vec![i, j]));
1874            }
1875        }
1876
1877        for j in 0..=10 {
1878            for i in 0..=255 {
1879                assert_eq!(btree.get(&vec![i, j]), None);
1880            }
1881        }
1882
1883        // We've deallocated everything.
1884        assert_eq!(btree.allocator.num_allocated_chunks(), 0);
1885    }
1886
1887    #[test]
1888    fn reloading() {
1889        let mem = make_memory();
1890        let mut btree = BTreeMap::new(mem.clone());
1891
1892        // The btree is initially empty.
1893        assert_eq!(btree.len(), 0);
1894        assert!(btree.is_empty());
1895
1896        // Add an entry into the btree.
1897        assert_eq!(btree.insert(vec![1, 2, 3], vec![4, 5, 6]), None);
1898        assert_eq!(btree.len(), 1);
1899        assert!(!btree.is_empty());
1900
1901        // Reload the btree. The element should still be there, and `len()`
1902        // should still be `1`.
1903        let btree = BTreeMap::<Vec<u8>, Vec<u8>, _>::load(mem.clone());
1904        assert_eq!(btree.get(&vec![1, 2, 3]), Some(vec![4, 5, 6]));
1905        assert_eq!(btree.len(), 1);
1906        assert!(!btree.is_empty());
1907
1908        // Remove an element. Length should be zero.
1909        let mut btree = BTreeMap::load(mem.clone());
1910        assert_eq!(btree.remove(&vec![1, 2, 3]), Some(vec![4, 5, 6]));
1911        assert_eq!(btree.len(), 0);
1912        assert!(btree.is_empty());
1913
1914        // Reload. Btree should still be empty.
1915        let btree = BTreeMap::<Vec<u8>, Vec<u8>, _>::load(mem);
1916        assert_eq!(btree.get(&vec![1, 2, 3]), None);
1917        assert_eq!(btree.len(), 0);
1918        assert!(btree.is_empty());
1919    }
1920
1921    #[test]
1922    fn len() {
1923        let mem = make_memory();
1924        let mut btree = BTreeMap::new(mem);
1925
1926        for i in 0..1000u32 {
1927            assert_eq!(btree.insert(i.to_le_bytes().to_vec(), vec![]), None);
1928        }
1929
1930        assert_eq!(btree.len(), 1000);
1931        assert!(!btree.is_empty());
1932
1933        for i in 0..1000u32 {
1934            assert_eq!(btree.remove(&i.to_le_bytes().to_vec()), Some(vec![]));
1935        }
1936
1937        assert_eq!(btree.len(), 0);
1938        assert!(btree.is_empty());
1939    }
1940
1941    #[test]
1942    fn contains_key() {
1943        let mem = make_memory();
1944        let mut btree = BTreeMap::new(mem);
1945
1946        // Insert even numbers from 0 to 1000.
1947        for i in (0..1000u32).step_by(2) {
1948            assert_eq!(btree.insert(i.to_le_bytes().to_vec(), vec![]), None);
1949        }
1950
1951        // Contains key should return true on all the even numbers and false on all the odd
1952        // numbers.
1953        for i in 0..1000u32 {
1954            assert_eq!(btree.contains_key(&i.to_le_bytes().to_vec()), i % 2 == 0);
1955        }
1956    }
1957
1958    #[test]
1959    fn range_empty() {
1960        let mem = make_memory();
1961        let btree = BTreeMap::<Vec<u8>, Vec<u8>, _>::new(mem);
1962
1963        // Test prefixes that don't exist in the map.
1964        assert_eq!(btree.range(vec![0]..).collect::<Vec<_>>(), vec![]);
1965        assert_eq!(btree.range(vec![1, 2, 3, 4]..).collect::<Vec<_>>(), vec![]);
1966    }
1967
1968    // Tests the case where the prefix is larger than all the entries in a leaf node.
1969    #[test]
1970    fn range_leaf_prefix_greater_than_all_entries() {
1971        let mem = make_memory();
1972        let mut btree = BTreeMap::new(mem);
1973
1974        btree.insert(vec![0], vec![]);
1975
1976        // Test a prefix that's larger than the value in the leaf node. Should be empty.
1977        assert_eq!(btree.range(vec![1]..).collect::<Vec<_>>(), vec![]);
1978    }
1979
1980    // Tests the case where the prefix is larger than all the entries in an internal node.
1981    #[test]
1982    fn range_internal_prefix_greater_than_all_entries() {
1983        let mem = make_memory();
1984        let mut btree = BTreeMap::new(mem);
1985
1986        for i in 1..=12 {
1987            assert_eq!(btree.insert(vec![i], vec![]), None);
1988        }
1989
1990        // The result should look like this:
1991        //                [6]
1992        //               /   \
1993        // [1, 2, 3, 4, 5]   [7, 8, 9, 10, 11, 12]
1994
1995        // Test a prefix that's larger than the value in the internal node.
1996        assert_eq!(
1997            btree.range(vec![7]..vec![8]).collect::<Vec<_>>(),
1998            vec![(vec![7], vec![])]
1999        );
2000    }
2001
2002    #[test]
2003    fn range_various_prefixes() {
2004        let mem = make_memory();
2005        let mut btree = BTreeMap::new(mem);
2006
2007        btree.insert(vec![0, 1], vec![]);
2008        btree.insert(vec![0, 2], vec![]);
2009        btree.insert(vec![0, 3], vec![]);
2010        btree.insert(vec![0, 4], vec![]);
2011        btree.insert(vec![1, 1], vec![]);
2012        btree.insert(vec![1, 2], vec![]);
2013        btree.insert(vec![1, 3], vec![]);
2014        btree.insert(vec![1, 4], vec![]);
2015        btree.insert(vec![2, 1], vec![]);
2016        btree.insert(vec![2, 2], vec![]);
2017        btree.insert(vec![2, 3], vec![]);
2018        btree.insert(vec![2, 4], vec![]);
2019
2020        // The result should look like this:
2021        //                                         [(1, 2)]
2022        //                                         /     \
2023        // [(0, 1), (0, 2), (0, 3), (0, 4), (1, 1)]       [(1, 3), (1, 4), (2, 1), (2, 2), (2, 3), (2, 4)]
2024
2025        let root = btree.load_node(btree.root_addr);
2026        assert_eq!(root.node_type(), NodeType::Internal);
2027        assert_eq!(root.entries(btree.memory()), vec![(vec![1, 2], vec![])]);
2028        assert_eq!(root.children_len(), 2);
2029
2030        // Tests a prefix that's smaller than the value in the internal node.
2031        assert_eq!(
2032            btree.range(vec![0]..vec![1]).collect::<Vec<_>>(),
2033            vec![
2034                (vec![0, 1], vec![]),
2035                (vec![0, 2], vec![]),
2036                (vec![0, 3], vec![]),
2037                (vec![0, 4], vec![]),
2038            ]
2039        );
2040
2041        // Tests a prefix that crosses several nodes.
2042        assert_eq!(
2043            btree.range(vec![1]..vec![2]).collect::<Vec<_>>(),
2044            vec![
2045                (vec![1, 1], vec![]),
2046                (vec![1, 2], vec![]),
2047                (vec![1, 3], vec![]),
2048                (vec![1, 4], vec![]),
2049            ]
2050        );
2051
2052        // Tests a prefix that's larger than the value in the internal node.
2053        assert_eq!(
2054            btree.range(vec![2]..vec![3]).collect::<Vec<_>>(),
2055            vec![
2056                (vec![2, 1], vec![]),
2057                (vec![2, 2], vec![]),
2058                (vec![2, 3], vec![]),
2059                (vec![2, 4], vec![]),
2060            ]
2061        );
2062    }
2063
2064    #[test]
2065    fn range_various_prefixes_2() {
2066        let mem = make_memory();
2067        let mut btree = BTreeMap::new(mem);
2068
2069        btree.insert(vec![0, 1], vec![]);
2070        btree.insert(vec![0, 2], vec![]);
2071        btree.insert(vec![0, 3], vec![]);
2072        btree.insert(vec![0, 4], vec![]);
2073        btree.insert(vec![1, 2], vec![]);
2074        btree.insert(vec![1, 4], vec![]);
2075        btree.insert(vec![1, 6], vec![]);
2076        btree.insert(vec![1, 8], vec![]);
2077        btree.insert(vec![1, 10], vec![]);
2078        btree.insert(vec![2, 1], vec![]);
2079        btree.insert(vec![2, 2], vec![]);
2080        btree.insert(vec![2, 3], vec![]);
2081        btree.insert(vec![2, 4], vec![]);
2082        btree.insert(vec![2, 5], vec![]);
2083        btree.insert(vec![2, 6], vec![]);
2084        btree.insert(vec![2, 7], vec![]);
2085        btree.insert(vec![2, 8], vec![]);
2086        btree.insert(vec![2, 9], vec![]);
2087
2088        // The result should look like this:
2089        //                                         [(1, 4), (2, 3)]
2090        //                                         /      |       \
2091        // [(0, 1), (0, 2), (0, 3), (0, 4), (1, 2)]       |        [(2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9)]
2092        //                                                |
2093        //                             [(1, 6), (1, 8), (1, 10), (2, 1), (2, 2)]
2094        let root = btree.load_node(btree.root_addr);
2095        assert_eq!(root.node_type(), NodeType::Internal);
2096        assert_eq!(
2097            root.entries(btree.memory()),
2098            vec![(vec![1, 4], vec![]), (vec![2, 3], vec![])]
2099        );
2100        assert_eq!(root.children_len(), 3);
2101
2102        let child_0 = btree.load_node(root.child(0));
2103        assert_eq!(child_0.node_type(), NodeType::Leaf);
2104        assert_eq!(
2105            child_0.entries(btree.memory()),
2106            vec![
2107                (vec![0, 1], vec![]),
2108                (vec![0, 2], vec![]),
2109                (vec![0, 3], vec![]),
2110                (vec![0, 4], vec![]),
2111                (vec![1, 2], vec![]),
2112            ]
2113        );
2114
2115        let child_1 = btree.load_node(root.child(1));
2116        assert_eq!(child_1.node_type(), NodeType::Leaf);
2117        assert_eq!(
2118            child_1.entries(btree.memory()),
2119            vec![
2120                (vec![1, 6], vec![]),
2121                (vec![1, 8], vec![]),
2122                (vec![1, 10], vec![]),
2123                (vec![2, 1], vec![]),
2124                (vec![2, 2], vec![]),
2125            ]
2126        );
2127
2128        let child_2 = btree.load_node(root.child(2));
2129        assert_eq!(
2130            child_2.entries(btree.memory()),
2131            vec![
2132                (vec![2, 4], vec![]),
2133                (vec![2, 5], vec![]),
2134                (vec![2, 6], vec![]),
2135                (vec![2, 7], vec![]),
2136                (vec![2, 8], vec![]),
2137                (vec![2, 9], vec![]),
2138            ]
2139        );
2140
2141        // Tests a prefix that doesn't exist, but is in the middle of the root node.
2142        assert_eq!(
2143            btree.range(vec![1, 5]..vec![1, 6]).collect::<Vec<_>>(),
2144            vec![]
2145        );
2146
2147        // Tests a prefix that crosses several nodes.
2148        assert_eq!(
2149            btree.range(vec![1]..vec![2]).collect::<Vec<_>>(),
2150            vec![
2151                (vec![1, 2], vec![]),
2152                (vec![1, 4], vec![]),
2153                (vec![1, 6], vec![]),
2154                (vec![1, 8], vec![]),
2155                (vec![1, 10], vec![]),
2156            ]
2157        );
2158
2159        // Tests a prefix that starts from a leaf node, then iterates through the root and right
2160        // sibling.
2161        assert_eq!(
2162            btree.range(vec![2]..).collect::<Vec<_>>(),
2163            vec![
2164                (vec![2, 1], vec![]),
2165                (vec![2, 2], vec![]),
2166                (vec![2, 3], vec![]),
2167                (vec![2, 4], vec![]),
2168                (vec![2, 5], vec![]),
2169                (vec![2, 6], vec![]),
2170                (vec![2, 7], vec![]),
2171                (vec![2, 8], vec![]),
2172                (vec![2, 9], vec![]),
2173            ]
2174        );
2175    }
2176
2177    #[test]
2178    fn range_large() {
2179        let mem = make_memory();
2180        let mut btree = BTreeMap::<Vec<u8>, Vec<u8>, _>::new(mem);
2181
2182        // Insert 1000 elements with prefix 0 and another 1000 elements with prefix 1.
2183        for prefix in 0..=1 {
2184            for i in 0..1000u32 {
2185                assert_eq!(
2186                    btree.insert(
2187                        // The key is the prefix followed by the integer's encoding.
2188                        // The encoding is big-endian so that the byte representation of the
2189                        // integers are sorted.
2190                        vec![vec![prefix], i.to_be_bytes().to_vec()]
2191                            .into_iter()
2192                            .flatten()
2193                            .collect(),
2194                        vec![]
2195                    ),
2196                    None
2197                );
2198            }
2199        }
2200
2201        // Getting the range with a prefix should return all 1000 elements with that prefix.
2202        for prefix in 0..=1 {
2203            let mut i: u32 = 0;
2204            for (key, _) in btree.range(vec![prefix]..vec![prefix + 1]) {
2205                assert_eq!(
2206                    key,
2207                    vec![vec![prefix], i.to_be_bytes().to_vec()]
2208                        .into_iter()
2209                        .flatten()
2210                        .collect::<Vec<_>>()
2211                );
2212                i += 1;
2213            }
2214            assert_eq!(i, 1000);
2215        }
2216    }
2217
2218    #[test]
2219    fn range_various_prefixes_with_offset() {
2220        let mem = make_memory();
2221        let mut btree = BTreeMap::new(mem);
2222
2223        btree.insert(vec![0, 1], vec![]);
2224        btree.insert(vec![0, 2], vec![]);
2225        btree.insert(vec![0, 3], vec![]);
2226        btree.insert(vec![0, 4], vec![]);
2227        btree.insert(vec![1, 1], vec![]);
2228        btree.insert(vec![1, 2], vec![]);
2229        btree.insert(vec![1, 3], vec![]);
2230        btree.insert(vec![1, 4], vec![]);
2231        btree.insert(vec![2, 1], vec![]);
2232        btree.insert(vec![2, 2], vec![]);
2233        btree.insert(vec![2, 3], vec![]);
2234        btree.insert(vec![2, 4], vec![]);
2235
2236        // The result should look like this:
2237        //                                         [(1, 2)]
2238        //                                         /     \
2239        // [(0, 1), (0, 2), (0, 3), (0, 4), (1, 1)]       [(1, 3), (1, 4), (2, 1), (2, 2), (2, 3), (2, 4)]
2240
2241        let root = btree.load_node(btree.root_addr);
2242        assert_eq!(root.node_type(), NodeType::Internal);
2243        assert_eq!(root.entries(btree.memory()), vec![(vec![1, 2], vec![])]);
2244        assert_eq!(root.children_len(), 2);
2245
2246        assert_eq!(
2247            btree.range(vec![0]..vec![1]).collect::<Vec<_>>(),
2248            vec![
2249                (vec![0, 1], vec![]),
2250                (vec![0, 2], vec![]),
2251                (vec![0, 3], vec![]),
2252                (vec![0, 4], vec![]),
2253            ]
2254        );
2255
2256        // Tests a offset that has a value somewhere in the range of values of an internal node.
2257        assert_eq!(
2258            btree.range(vec![1, 3]..vec![2]).collect::<Vec<_>>(),
2259            vec![(vec![1, 3], vec![]), (vec![1, 4], vec![]),]
2260        );
2261
2262        // Tests a offset that's larger than the value in the internal node.
2263        assert_eq!(btree.range(vec![2, 5]..).collect::<Vec<_>>(), vec![]);
2264    }
2265
2266    #[test]
2267    fn range_various_prefixes_with_offset_2() {
2268        let mem = make_memory();
2269        let mut btree = BTreeMap::new(mem);
2270
2271        btree.insert(vec![0, 1], vec![]);
2272        btree.insert(vec![0, 2], vec![]);
2273        btree.insert(vec![0, 3], vec![]);
2274        btree.insert(vec![0, 4], vec![]);
2275        btree.insert(vec![1, 2], vec![]);
2276        btree.insert(vec![1, 4], vec![]);
2277        btree.insert(vec![1, 6], vec![]);
2278        btree.insert(vec![1, 8], vec![]);
2279        btree.insert(vec![1, 10], vec![]);
2280        btree.insert(vec![2, 1], vec![]);
2281        btree.insert(vec![2, 2], vec![]);
2282        btree.insert(vec![2, 3], vec![]);
2283        btree.insert(vec![2, 4], vec![]);
2284        btree.insert(vec![2, 5], vec![]);
2285        btree.insert(vec![2, 6], vec![]);
2286        btree.insert(vec![2, 7], vec![]);
2287        btree.insert(vec![2, 8], vec![]);
2288        btree.insert(vec![2, 9], vec![]);
2289
2290        // The result should look like this:
2291        //                                         [(1, 4), (2, 3)]
2292        //                                         /      |       \
2293        // [(0, 1), (0, 2), (0, 3), (0, 4), (1, 2)]       |        [(2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9)]
2294        //                                                |
2295        //                             [(1, 6), (1, 8), (1, 10), (2, 1), (2, 2)]
2296        let root = btree.load_node(btree.root_addr);
2297        assert_eq!(root.node_type(), NodeType::Internal);
2298        assert_eq!(
2299            root.entries(btree.memory()),
2300            vec![(vec![1, 4], vec![]), (vec![2, 3], vec![])]
2301        );
2302        assert_eq!(root.children_len(), 3);
2303
2304        let child_0 = btree.load_node(root.child(0));
2305        assert_eq!(child_0.node_type(), NodeType::Leaf);
2306        assert_eq!(
2307            child_0.entries(btree.memory()),
2308            vec![
2309                (vec![0, 1], vec![]),
2310                (vec![0, 2], vec![]),
2311                (vec![0, 3], vec![]),
2312                (vec![0, 4], vec![]),
2313                (vec![1, 2], vec![]),
2314            ]
2315        );
2316
2317        let child_1 = btree.load_node(root.child(1));
2318        assert_eq!(child_1.node_type(), NodeType::Leaf);
2319        assert_eq!(
2320            child_1.entries(btree.memory()),
2321            vec![
2322                (vec![1, 6], vec![]),
2323                (vec![1, 8], vec![]),
2324                (vec![1, 10], vec![]),
2325                (vec![2, 1], vec![]),
2326                (vec![2, 2], vec![]),
2327            ]
2328        );
2329
2330        let child_2 = btree.load_node(root.child(2));
2331        assert_eq!(
2332            child_2.entries(btree.memory()),
2333            vec![
2334                (vec![2, 4], vec![]),
2335                (vec![2, 5], vec![]),
2336                (vec![2, 6], vec![]),
2337                (vec![2, 7], vec![]),
2338                (vec![2, 8], vec![]),
2339                (vec![2, 9], vec![]),
2340            ]
2341        );
2342
2343        // Tests a offset that crosses several nodes.
2344        assert_eq!(
2345            btree.range(vec![1, 4]..vec![2]).collect::<Vec<_>>(),
2346            vec![
2347                (vec![1, 4], vec![]),
2348                (vec![1, 6], vec![]),
2349                (vec![1, 8], vec![]),
2350                (vec![1, 10], vec![]),
2351            ]
2352        );
2353
2354        // Tests a offset that starts from a leaf node, then iterates through the root and right
2355        // sibling.
2356        assert_eq!(
2357            btree.range(vec![2, 2]..vec![3]).collect::<Vec<_>>(),
2358            vec![
2359                (vec![2, 2], vec![]),
2360                (vec![2, 3], vec![]),
2361                (vec![2, 4], vec![]),
2362                (vec![2, 5], vec![]),
2363                (vec![2, 6], vec![]),
2364                (vec![2, 7], vec![]),
2365                (vec![2, 8], vec![]),
2366                (vec![2, 9], vec![]),
2367            ]
2368        );
2369    }
2370
2371    #[test]
2372    #[should_panic(expected = "max_key_size must be <= 4")]
2373    fn rejects_larger_key_sizes() {
2374        let mem = make_memory();
2375        let btree: BTreeMap<Blob<4>, Blob<3>, _> = BTreeMap::init(mem);
2376        let _btree: BTreeMap<Blob<5>, Blob<3>, _> = BTreeMap::init(btree.into_memory());
2377    }
2378
2379    #[test]
2380    fn accepts_small_or_equal_key_sizes() {
2381        let mem = make_memory();
2382        let btree: BTreeMap<Blob<4>, Blob<3>, _> = BTreeMap::init(mem);
2383        // Smaller key size
2384        let btree: BTreeMap<Blob<3>, Blob<3>, _> = BTreeMap::init(btree.into_memory());
2385        // Equal key size
2386        let _btree: BTreeMap<Blob<4>, Blob<3>, _> = BTreeMap::init(btree.into_memory());
2387    }
2388
2389    #[test]
2390    #[should_panic(expected = "max_value_size must be <= 3")]
2391    fn rejects_larger_value_sizes() {
2392        let mem = make_memory();
2393        let btree: BTreeMap<Blob<4>, Blob<3>, _> = BTreeMap::init(mem);
2394        let _btree: BTreeMap<Blob<4>, Blob<4>, _> = BTreeMap::init(btree.into_memory());
2395    }
2396
2397    #[test]
2398    fn accepts_small_or_equal_value_sizes() {
2399        let mem = make_memory();
2400        let btree: BTreeMap<Blob<4>, Blob<3>, _> = BTreeMap::init(mem);
2401        // Smaller key size
2402        let btree: BTreeMap<Blob<4>, Blob<2>, _> = BTreeMap::init(btree.into_memory());
2403        // Equal key size
2404        let _btree: BTreeMap<Blob<4>, Blob<3>, _> = BTreeMap::init(btree.into_memory());
2405    }
2406
2407    #[test]
2408    fn bruteforce_range_search() {
2409        use super::BTreeMap as StableBTreeMap;
2410        use std::collections::BTreeMap;
2411
2412        const NKEYS: u64 = 60;
2413
2414        let mut std_map = BTreeMap::new();
2415        let mut stable_map = StableBTreeMap::new(make_memory());
2416
2417        for k in 0..NKEYS {
2418            std_map.insert(k, k);
2419            stable_map.insert(k, k);
2420        }
2421
2422        assert_eq!(
2423            std_map.range(..).map(|(k, v)| (*k, *v)).collect::<Vec<_>>(),
2424            stable_map.range(..).collect::<Vec<_>>()
2425        );
2426
2427        for l in 0..=NKEYS {
2428            assert_eq!(
2429                std_map
2430                    .range(l..)
2431                    .map(|(k, v)| (*k, *v))
2432                    .collect::<Vec<_>>(),
2433                stable_map.range(l..).collect::<Vec<_>>()
2434            );
2435
2436            assert_eq!(
2437                std_map
2438                    .range(..l)
2439                    .map(|(k, v)| (*k, *v))
2440                    .collect::<Vec<_>>(),
2441                stable_map.range(..l).collect::<Vec<_>>()
2442            );
2443
2444            assert_eq!(
2445                std_map
2446                    .range(..=l)
2447                    .map(|(k, v)| (*k, *v))
2448                    .collect::<Vec<_>>(),
2449                stable_map.range(..=l).collect::<Vec<_>>()
2450            );
2451
2452            for r in l + 1..=NKEYS {
2453                for lbound in [Bound::Included(l), Bound::Excluded(l)] {
2454                    for rbound in [Bound::Included(r), Bound::Excluded(r)] {
2455                        let range = (lbound, rbound);
2456                        assert_eq!(
2457                            std_map
2458                                .range(range)
2459                                .map(|(k, v)| (*k, *v))
2460                                .collect::<Vec<_>>(),
2461                            stable_map.range(range).collect::<Vec<_>>(),
2462                            "range: {range:?}"
2463                        );
2464                    }
2465                }
2466            }
2467        }
2468    }
2469
2470    #[test]
2471    fn test_iter_upper_bound() {
2472        let mut stable_map = super::BTreeMap::new(make_memory());
2473        for k in 0..100u64 {
2474            stable_map.insert(k, ());
2475            for i in 0..=k {
2476                assert_eq!(
2477                    Some((i, ())),
2478                    stable_map.iter_upper_bound(&(i + 1)).next(),
2479                    "failed to get an upper bound for key {}",
2480                    i + 1
2481                );
2482            }
2483            assert_eq!(
2484                None,
2485                stable_map.iter_upper_bound(&0).next(),
2486                "key 0 must not have an upper bound"
2487            );
2488        }
2489    }
2490
2491    #[test]
2492    #[should_panic(expected = "Key is too large. Expected <= 0 bytes, found 4 bytes")]
2493    fn panics_if_key_is_too_large() {
2494        #[derive(Clone, Ord, PartialOrd, Eq, PartialEq)]
2495        struct K;
2496        impl crate::Storable for K {
2497            fn to_bytes(&self) -> Cow<[u8]> {
2498                Cow::Borrowed(&[1, 2, 3, 4])
2499            }
2500
2501            fn from_bytes(_: Cow<[u8]>) -> Self {
2502                unimplemented!();
2503            }
2504        }
2505
2506        impl crate::BoundedStorable for K {
2507            // A buggy implementation where the MAX_SIZE is smaller than what Storable::to_bytes()
2508            // returns.
2509            const MAX_SIZE: u32 = 0;
2510            const IS_FIXED_SIZE: bool = false;
2511        }
2512
2513        let mut btree: BTreeMap<K, (), _> = BTreeMap::init(make_memory());
2514        btree.insert(K, ());
2515    }
2516
2517    #[test]
2518    #[should_panic(expected = "Value is too large. Expected <= 0 bytes, found 4 bytes")]
2519    fn panics_if_value_is_too_large() {
2520        #[derive(Clone, Ord, PartialOrd, Eq, PartialEq)]
2521        struct V;
2522        impl crate::Storable for V {
2523            fn to_bytes(&self) -> Cow<[u8]> {
2524                Cow::Borrowed(&[1, 2, 3, 4])
2525            }
2526
2527            fn from_bytes(_: Cow<[u8]>) -> Self {
2528                unimplemented!();
2529            }
2530        }
2531
2532        impl crate::BoundedStorable for V {
2533            // A buggy implementation where the MAX_SIZE is smaller than what Storable::to_bytes()
2534            // returns.
2535            const MAX_SIZE: u32 = 0;
2536            const IS_FIXED_SIZE: bool = false;
2537        }
2538
2539        let mut btree: BTreeMap<(), V, _> = BTreeMap::init(make_memory());
2540        btree.insert((), V);
2541    }
2542
2543    // To generate the memory dump file for the current version:
2544    //   cargo test create_btreemap_dump_file -- --include-ignored
2545    #[test]
2546    #[ignore]
2547    fn create_btreemap_dump_file() {
2548        let mem = make_memory();
2549        let mut btree = BTreeMap::init(mem.clone());
2550        assert_eq!(btree.insert(vec![1, 2, 3], vec![4, 5, 6]), None);
2551        assert_eq!(btree.get(&vec![1, 2, 3]), Some(vec![4, 5, 6]));
2552
2553        use std::io::prelude::*;
2554        let mut file =
2555            std::fs::File::create(format!("dumps/btreemap_v{LAYOUT_VERSION}.dump")).unwrap();
2556        file.write_all(&mem.borrow()).unwrap();
2557    }
2558
2559    #[test]
2560    fn produces_layout_identical_to_layout_version_1_with_packed_headers() {
2561        let mem = make_memory();
2562        let mut btree = BTreeMap::init(mem.clone());
2563        assert_eq!(btree.insert(vec![1, 2, 3], vec![4, 5, 6]), None);
2564        assert_eq!(btree.get(&vec![1, 2, 3]), Some(vec![4, 5, 6]));
2565
2566        let btreemap_v1 = include_bytes!("../dumps/btreemap_v1_packed_headers.dump");
2567        assert_eq!(*mem.borrow(), btreemap_v1);
2568    }
2569
2570    #[test]
2571    fn read_write_header_is_identical_to_read_write_struct() {
2572        #[repr(C, packed)]
2573        struct BTreePackedHeader {
2574            magic: [u8; 3],
2575            version: u8,
2576            max_key_size: u32,
2577            max_value_size: u32,
2578            root_addr: Address,
2579            length: u64,
2580            _buffer: [u8; 24],
2581        }
2582        let packed_header = BTreePackedHeader {
2583            magic: *MAGIC,
2584            version: LAYOUT_VERSION,
2585            root_addr: Address::from(0xDEADBEEF),
2586            max_key_size: 0x12345678,
2587            max_value_size: 0x87654321,
2588            length: 0xA1B2D3C4,
2589            _buffer: [0; 24],
2590        };
2591
2592        let packed_mem = make_memory();
2593        crate::write_struct(&packed_header, Address::from(0), &packed_mem);
2594
2595        let v1_header = BTreeHeaderV1 {
2596            magic: *MAGIC,
2597            version: LAYOUT_VERSION,
2598            max_key_size: 0x12345678,
2599            max_value_size: 0x87654321,
2600            root_addr: Address::from(0xDEADBEEF),
2601            length: 0xA1B2D3C4,
2602        };
2603
2604        let v1_mem = make_memory();
2605        BTreeMap::<Vec<_>, Vec<_>, RefCell<Vec<_>>>::write_header(&v1_header, &v1_mem);
2606
2607        assert_eq!(packed_mem, v1_mem);
2608
2609        let packed_header: BTreePackedHeader = crate::read_struct(Address::from(0), &v1_mem);
2610        let v1_header = BTreeMap::<Vec<_>, Vec<_>, RefCell<Vec<_>>>::read_header(&v1_mem);
2611        assert!(packed_header.magic == v1_header.magic);
2612        assert!(packed_header.version == v1_header.version);
2613        assert!(packed_header.max_key_size == v1_header.max_key_size);
2614        assert!(packed_header.max_value_size == v1_header.max_value_size);
2615        assert!(packed_header.root_addr == v1_header.root_addr);
2616        assert!(packed_header.length == v1_header.length);
2617    }
2618}