1mod 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;
47const PACKED_HEADER_SIZE: usize = 28;
49const ALLOCATOR_OFFSET: usize = 52;
51
52pub struct BTreeMap<K, V, M>
57where
58 K: BoundedStorable + Ord + Clone,
59 V: BoundedStorable,
60 M: Memory,
61{
62 root_addr: Address,
65
66 max_key_size: u32,
68
69 max_value_size: u32,
71
72 allocator: Allocator<M>,
74
75 length: u64,
77
78 _phantom: PhantomData<(K, V)>,
80}
81
82struct 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 }
92
93impl<K, V, M> BTreeMap<K, V, M>
94where
95 K: BoundedStorable + Ord + Clone,
96 V: BoundedStorable,
97 M: Memory,
98{
99 pub fn init(memory: M) -> Self {
104 if memory.size() == 0 {
105 return BTreeMap::new(memory);
107 }
108
109 let mut dst = vec![0; 3];
111 memory.read(0, &mut dst);
112 if dst != MAGIC {
113 BTreeMap::new(memory)
115 } else {
116 BTreeMap::load(memory)
118 }
119 }
120
121 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 pub fn load(memory: M) -> Self {
152 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 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 fn read_header(memory: &M) -> BTreeHeaderV1 {
181 let mut buf = [0; PACKED_HEADER_SIZE];
183 memory.read(0, &mut buf);
184 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 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 let node = self.allocate_node(NodeType::Leaf);
225 self.root_addr = node.address();
226 self.save();
227 node
228 } else {
229 let mut root = self.load_node(self.root_addr);
231
232 if let Ok(idx) = root.search(&key) {
234 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 root.is_full() {
246 let mut new_root = self.allocate_node(NodeType::Internal);
248
249 new_root.push_child(self.root_addr);
251
252 self.root_addr = new_root.address();
254 self.save();
255
256 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 fn insert_nonfull(&mut self, mut node: Node<K>, key: K, value: Vec<u8>) -> Option<Vec<u8>> {
272 assert!(!node.is_full());
274
275 match node.search(&key) {
277 Ok(idx) => {
278 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 match node.node_type() {
289 NodeType::Leaf => {
290 node.insert_entry(idx, (key, value));
293 node.save(self.memory());
294
295 self.length += 1;
297 self.save();
298
299 None
301 }
302 NodeType::Internal => {
303 let mut child = self.load_node(node.child(idx));
306
307 if child.is_full() {
308 if let Ok(idx) = child.search(&key) {
310 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 self.split_child(&mut node, idx);
319
320 let idx = node.search(&key).unwrap_or_else(|idx| idx);
323 child = self.load_node(node.child(idx));
324 }
325
326 assert!(!child.is_full());
328
329 self.insert_nonfull(child, key, value)
330 }
331 }
332 }
333 }
334 }
335
336 fn split_child(&mut self, node: &mut Node<K>, full_child_idx: usize) {
353 assert!(!node.is_full());
355
356 let mut full_child = self.load_node(node.child(full_child_idx));
358 assert!(full_child.is_full());
359
360 let mut sibling = self.allocate_node(full_child.node_type());
362 assert_eq!(sibling.node_type(), full_child.node_type());
363
364 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 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, NodeType::Internal => {
395 self.get_helper(node.child(idx), key)
397 }
398 }
399 }
400 }
401 }
402
403 pub fn contains_key(&self, key: &K) -> bool {
405 self.get(key).is_some()
406 }
407
408 pub fn is_empty(&self) -> bool {
410 self.length == 0
411 }
412
413 pub fn len(&self) -> u64 {
415 self.length
416 }
417
418 pub fn into_memory(self) -> M {
420 self.allocator.into_memory()
421 }
422
423 pub fn clear(self) -> Self {
425 let mem = self.allocator.into_memory();
426 Self::new(mem)
427 }
428
429 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 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 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 fn remove_helper(&mut self, mut node: Node<K>, key: &K) -> Option<Vec<u8>> {
469 if node.address() != self.root_addr {
470 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 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 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, }
504 }
505 NodeType::Internal => {
506 match node.search(key) {
507 Ok(idx) => {
508 let left_child = self.load_node(node.child(idx));
511 if left_child.can_remove_entry_without_merging() {
512 let predecessor = left_child.get_max(self.memory());
535 self.remove_helper(left_child, &predecessor.0)?;
536
537 let (_, old_value) = node.swap_entry(idx, predecessor, self.memory());
539
540 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 let successor = right_child.get_min(self.memory());
570 self.remove_helper(right_child, &successor.0)?;
571
572 let (_, old_value) = node.swap_entry(idx, successor, self.memory());
574
575 node.save(self.memory());
577 return Some(old_value);
578 }
579
580 assert!(left_child.at_minimum());
600 assert!(right_child.at_minimum());
601
602 let new_child = self.merge(
604 right_child,
605 left_child,
606 node.remove_entry(idx, self.memory()),
607 );
608
609 node.remove_child(idx + 1);
611
612 if node.entries_len() == 0 {
613 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 self.allocator.deallocate(node.address());
622 self.save();
623 }
624
625 node.save(self.memory());
626 new_child.save(self.memory());
627
628 self.remove_helper(new_child, key)
630 }
631 Err(idx) => {
632 let mut child = self.load_node(node.child(idx));
637
638 if child.can_remove_entry_without_merging() {
639 return self.remove_helper(child, key);
642 }
643
644 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 let (left_sibling_key, left_sibling_value) =
683 left_sibling.pop_entry(self.memory()).unwrap();
684
685 let (parent_key, parent_value) = node.swap_entry(
687 idx - 1,
688 (left_sibling_key, left_sibling_value),
689 self.memory(),
690 );
691
692 child.insert_entry(0, (parent_key, parent_value));
694
695 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 let (right_sibling_key, right_sibling_value) =
738 right_sibling.remove_entry(0, self.memory());
739
740 let parent_entry = node.swap_entry(
742 idx,
743 (right_sibling_key, right_sibling_value),
744 self.memory(),
745 );
746
747 child.push_entry(parent_entry);
749
750 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 if let Some(left_sibling) = left_sibling {
771 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 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 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 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 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 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 pub fn iter(&self) -> Iter<K, V, M> {
834 Iter::new(self)
835 }
836
837 pub fn range(&self, key_range: impl RangeBounds<K>) -> Iter<K, V, M> {
840 if self.root_addr == NULL {
841 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 cursors.push(Cursor::Node {
866 node,
867 next: Index::Entry(idx),
868 });
869 return Iter::new_in_range(self, range, cursors);
870 } else {
871 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 let child = match node.node_type() {
910 NodeType::Internal => {
911 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 return Iter::new_in_range(self, range, cursors);
929 }
930 Some(child) => {
931 node = child;
933 }
934 }
935 }
936 }
937 }
938 }
939 }
940 }
941
942 pub fn iter_upper_bound(&self, bound: &K) -> Iter<K, V, M> {
945 if self.root_addr == NULL {
946 return Iter::null(self);
948 }
949
950 let dummy_bounds = (Bound::Unbounded, Bound::Unbounded);
951 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 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 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 cursors.push(Cursor::Node {
1005 node,
1006 next: Index::Entry(idx),
1007 });
1008 node = child;
1009 }
1010 }
1011 }
1012 }
1013 }
1014 }
1015
1016 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 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 fn write_header(header: &BTreeHeaderV1, memory: &M) {
1070 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 crate::write(memory, 0, &buf);
1080 }
1081}
1082
1083#[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 fn e(x: u8) -> (Vec<u8>, Vec<u8>) {
1122 (vec![x], vec![])
1123 }
1124
1125 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 let btree = BTreeMap::init(mem);
1140
1141 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 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 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 assert_eq!(btree.insert(vec![12], vec![1, 2, 3]), Some(vec![]));
1207
1208 assert_eq!(btree.get(&vec![12]), Some(vec![1, 2, 3]));
1210
1211 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 let root = btree.load_node(btree.root_addr);
1230 assert!(root.is_full());
1231
1232 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 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 assert_eq!(btree.allocator.num_allocated_chunks(), 1);
1259
1260 assert_eq!(btree.insert(vec![255], vec![]), None);
1261
1262 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 assert_eq!(btree.insert(vec![12], vec![]), None);
1302
1303 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 assert_eq!(btree.insert(vec![12], vec![]), None);
1323
1324 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 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 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 assert_eq!(btree.insert(vec![0], vec![]), None);
1448
1449 for i in 0..=11 {
1455 assert_eq!(btree.get(&vec![i]), Some(vec![]));
1456 }
1457
1458 assert_eq!(btree.remove(&vec![6]), Some(vec![]));
1460
1461 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 assert_eq!(btree.allocator.num_allocated_chunks(), 3);
1486
1487 assert_eq!(btree.remove(&vec![5]), Some(vec![]));
1489
1490 let btree = BTreeMap::<Vec<u8>, Vec<u8>, _>::load(mem);
1492
1493 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 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 assert_eq!(btree.insert(vec![12], vec![]), None);
1515
1516 for i in 1..=12 {
1522 assert_eq!(btree.get(&vec![i]), Some(vec![]));
1523 }
1524
1525 assert_eq!(btree.remove(&vec![6]), Some(vec![]));
1527
1528 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 assert_eq!(btree.remove(&vec![7]), Some(vec![]));
1553 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 assert_eq!(btree.insert(vec![12], vec![]), None);
1586
1587 assert_eq!(btree.remove(&vec![3]), Some(vec![]));
1594
1595 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 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 assert_eq!(btree.insert(vec![0], vec![]), None);
1632
1633 assert_eq!(btree.remove(&vec![8]), Some(vec![]));
1640
1641 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 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 assert_eq!(btree.insert(vec![12], vec![]), None);
1678
1679 for i in 1..=12 {
1685 assert_eq!(btree.get(&vec![i]), Some(vec![]));
1686 }
1687
1688 assert_eq!(btree.remove(&vec![6]), Some(vec![]));
1690 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 assert_eq!(btree.allocator.num_allocated_chunks(), 3);
1715
1716 assert_eq!(btree.remove(&vec![3]), Some(vec![]));
1718
1719 let btree = BTreeMap::<Vec<u8>, Vec<u8>, _>::load(mem);
1721
1722 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 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 assert_eq!(btree.insert(vec![12], vec![]), None);
1758
1759 for i in 1..=12 {
1765 assert_eq!(btree.get(&vec![i]), Some(vec![]));
1766 }
1767
1768 assert_eq!(btree.remove(&vec![6]), Some(vec![]));
1770
1771 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 assert_eq!(btree.allocator.num_allocated_chunks(), 3);
1796
1797 assert_eq!(btree.remove(&vec![10]), Some(vec![]));
1799
1800 let btree = BTreeMap::<Vec<u8>, Vec<u8>, _>::load(mem);
1802
1803 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 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 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 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 assert_eq!(btree.len(), 0);
1894 assert!(btree.is_empty());
1895
1896 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 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 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 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 for i in (0..1000u32).step_by(2) {
1948 assert_eq!(btree.insert(i.to_le_bytes().to_vec(), vec![]), None);
1949 }
1950
1951 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 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 #[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 assert_eq!(btree.range(vec![1]..).collect::<Vec<_>>(), vec![]);
1978 }
1979
1980 #[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 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 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 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 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 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 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 assert_eq!(
2143 btree.range(vec![1, 5]..vec![1, 6]).collect::<Vec<_>>(),
2144 vec![]
2145 );
2146
2147 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 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 for prefix in 0..=1 {
2184 for i in 0..1000u32 {
2185 assert_eq!(
2186 btree.insert(
2187 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 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 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 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 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 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 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 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 let btree: BTreeMap<Blob<3>, Blob<3>, _> = BTreeMap::init(btree.into_memory());
2385 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 let btree: BTreeMap<Blob<4>, Blob<2>, _> = BTreeMap::init(btree.into_memory());
2403 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 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 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 #[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}