1mod entry;
2mod impls;
3mod iter;
4
5use super::lookup_map as lm;
6use crate::store::free_list::{FreeList, FreeListIndex};
7use crate::store::key::{Sha256, ToKey};
8use crate::store::LookupMap;
9use crate::{env, IntoStorageKey};
10use borsh::{BorshDeserialize, BorshSerialize};
11pub use entry::Entry;
12pub use iter::{Iter, IterMut, Keys, Range, RangeMut, Values, ValuesMut};
13use std::borrow::Borrow;
14use std::fmt;
15use std::ops::RangeBounds;
16
17use unc_sdk_macros::unc;
18
19type NodeAndIndex<'a, K> = (FreeListIndex, &'a Node<K>);
20
21fn expect<T>(val: Option<T>) -> T {
22 val.unwrap_or_else(|| env::abort())
23}
24
25#[derive(BorshDeserialize, BorshSerialize)]
34pub struct TreeMap<K, V, H = Sha256>
35where
36 K: BorshSerialize + Ord,
37 V: BorshSerialize,
38 H: ToKey,
39{
40 #[borsh(bound(serialize = "", deserialize = ""))]
42 values: LookupMap<K, V, H>,
43 #[borsh(bound(serialize = "", deserialize = ""))]
45 tree: Tree<K>,
46}
47
48impl<K, V, H> Drop for TreeMap<K, V, H>
49where
50 K: BorshSerialize + Ord,
51 V: BorshSerialize,
52 H: ToKey,
53{
54 fn drop(&mut self) {
55 self.flush()
56 }
57}
58
59impl<K, V, H> fmt::Debug for TreeMap<K, V, H>
60where
61 K: Ord + Clone + fmt::Debug + BorshSerialize + BorshDeserialize,
62 V: fmt::Debug + BorshSerialize + BorshDeserialize,
63 H: ToKey,
64{
65 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
66 f.debug_struct("TreeMap")
67 .field("root", &self.tree.root)
68 .field("tree", &self.tree.nodes)
69 .finish()
70 }
71}
72
73#[unc(inside_uncsdk)]
74struct Tree<K>
75where
76 K: BorshSerialize,
77{
78 root: Option<FreeListIndex>,
79 #[cfg_attr(not(feature = "abi"), borsh(bound(serialize = "", deserialize = "")))]
81 #[cfg_attr(
82 feature = "abi",
83 borsh(bound(serialize = "", deserialize = ""), schema(params = ""))
84 )]
85 nodes: FreeList<Node<K>>,
86}
87
88impl<K> Tree<K>
89where
90 K: BorshSerialize + Ord,
91{
92 fn new<S>(prefix: S) -> Self
93 where
94 S: IntoStorageKey,
95 {
96 Tree { root: None, nodes: FreeList::new(prefix) }
97 }
98}
99
100#[unc(inside_uncsdk)]
101#[derive(Clone, Debug)]
102struct Node<K> {
103 key: K, lft: Option<FreeListIndex>, rgt: Option<FreeListIndex>, ht: u32, }
108
109impl<K> Node<K>
110where
111 K: BorshSerialize + BorshDeserialize,
112{
113 fn of(key: K) -> Self {
114 Self { key, lft: None, rgt: None, ht: 1 }
115 }
116
117 fn left<'a>(&self, list: &'a FreeList<Node<K>>) -> Option<(FreeListIndex, &'a Node<K>)> {
118 self.lft.and_then(|id| list.get(id).map(|node| (id, node)))
119 }
120
121 fn right<'a>(&self, list: &'a FreeList<Node<K>>) -> Option<(FreeListIndex, &'a Node<K>)> {
122 self.rgt.and_then(|id| list.get(id).map(|node| (id, node)))
123 }
124}
125
126impl<K, V> TreeMap<K, V, Sha256>
127where
128 K: BorshSerialize + Ord,
129 V: BorshSerialize,
130{
131 pub fn new<S>(prefix: S) -> Self
136 where
137 S: IntoStorageKey,
138 {
139 Self::with_hasher(prefix)
140 }
141}
142
143impl<K, V, H> TreeMap<K, V, H>
144where
145 K: BorshSerialize + Ord,
146 V: BorshSerialize,
147 H: ToKey,
148{
149 pub fn with_hasher<S>(prefix: S) -> Self
150 where
151 S: IntoStorageKey,
152 {
153 let mut vec_key = prefix.into_storage_key();
154 let map_key = [vec_key.as_slice(), b"v"].concat();
155 vec_key.push(b'n');
156 Self { values: LookupMap::with_hasher(map_key), tree: Tree::new(vec_key) }
157 }
158
159 pub fn len(&self) -> u32 {
161 self.tree.nodes.len()
162 }
163
164 pub fn is_empty(&self) -> bool {
166 self.tree.nodes.is_empty()
167 }
168}
169
170impl<K, V, H> TreeMap<K, V, H>
171where
172 K: Ord + Clone + BorshSerialize,
173 V: BorshSerialize + BorshDeserialize,
174 H: ToKey,
175{
176 pub fn clear(&mut self)
179 where
180 K: BorshDeserialize,
181 {
182 self.tree.root = None;
183 for k in self.tree.nodes.drain() {
184 self.values.set(k.key, None);
186 }
187 }
188
189 pub fn contains_key<Q: ?Sized>(&self, k: &Q) -> bool
195 where
196 K: Borrow<Q>,
197 Q: BorshSerialize + ToOwned<Owned = K> + Ord,
198 {
199 self.values.contains_key(k)
200 }
201
202 pub fn get<Q: ?Sized>(&self, k: &Q) -> Option<&V>
208 where
209 K: Borrow<Q>,
210 Q: BorshSerialize + ToOwned<Owned = K>,
211 {
212 self.values.get(k)
213 }
214
215 pub fn get_key_value<Q: ?Sized>(&self, k: &Q) -> Option<(&K, &V)>
231 where
232 K: Borrow<Q> + BorshDeserialize,
233 Q: BorshSerialize + ToOwned<Owned = K> + Ord,
234 {
235 self.values.get(k).map(|v| (expect(self.tree.equal_key(k)), v))
236 }
237
238 pub fn get_mut<Q: ?Sized>(&mut self, k: &Q) -> Option<&mut V>
244 where
245 K: Borrow<Q>,
246 Q: BorshSerialize + ToOwned<Owned = K>,
247 {
248 self.values.get_mut(k)
249 }
250
251 pub fn insert(&mut self, key: K, value: V) -> Option<V>
259 where
260 K: Clone + BorshDeserialize,
261 {
262 match self.values.entry(key.clone()) {
264 lm::Entry::Occupied(mut v) => Some(core::mem::replace(v.get_mut(), value)),
265 lm::Entry::Vacant(v) => {
266 self.tree.internal_insert(key);
267 v.insert(value);
268 None
269 }
270 }
271 }
272
273 pub fn remove<Q: ?Sized>(&mut self, key: &Q) -> Option<V>
280 where
281 K: Borrow<Q> + BorshDeserialize,
282 Q: BorshSerialize + ToOwned<Owned = K> + Ord,
283 {
284 self.remove_entry(key).map(|(_, v)| v)
285 }
286}
287
288enum Edge {
289 Left,
290 Right,
291}
292
293impl<K> Tree<K>
294where
295 K: Ord + BorshSerialize + BorshDeserialize,
296{
297 fn node(&self, id: FreeListIndex) -> Option<&Node<K>> {
298 self.nodes.get(id)
299 }
300
301 fn higher<Q>(&self, key: &Q) -> Option<&K>
303 where
304 K: Borrow<Q>,
305 Q: ?Sized + Ord,
306 {
307 let root = self.root?;
308 self.above_at(root, key)
309 }
310
311 fn lower<Q>(&self, key: &Q) -> Option<&K>
313 where
314 K: Borrow<Q>,
315 Q: ?Sized + Ord,
316 {
317 let root = self.root?;
318 self.below_at(root, key)
319 }
320
321 fn equal_key<Q>(&self, key: &Q) -> Option<&K>
322 where
323 K: Borrow<Q>,
324 Q: ?Sized + Ord,
325 {
326 self.root.map(|root| self.equal_at(root, key)).unwrap_or_default()
327 }
328
329 fn floor_key<Q>(&self, key: &Q) -> Option<&K>
330 where
331 K: Borrow<Q>,
332 Q: ?Sized + Ord,
333 {
334 if let Some(key) = self.equal_key(key) {
335 Some(key)
336 } else {
337 self.lower(key)
338 }
339 }
340
341 fn ceil_key<Q>(&self, key: &Q) -> Option<&K>
342 where
343 K: Borrow<Q>,
344 Q: ?Sized + Ord,
345 {
346 if let Some(key) = self.equal_key(key) {
347 Some(key)
348 } else {
349 self.higher(key)
350 }
351 }
352
353 fn min_at(&self, mut at: FreeListIndex) -> Option<(NodeAndIndex<K>, Option<NodeAndIndex<K>>)> {
355 let mut parent: Option<NodeAndIndex<K>> = None;
356 loop {
357 let node = self.node(at);
358 match node.and_then(|n| n.lft) {
359 Some(lft) => {
360 parent = Some((at, expect(node)));
361 at = lft;
362 }
363 None => {
364 return node.map(|node| ((at, node), parent));
365 }
366 }
367 }
368 }
369
370 fn max_at(&self, mut at: FreeListIndex) -> Option<(NodeAndIndex<K>, Option<NodeAndIndex<K>>)> {
372 let mut parent: Option<NodeAndIndex<K>> = None;
373 loop {
374 let node = self.node(at);
375 match node.and_then(|n| n.rgt) {
376 Some(rgt) => {
377 parent = Some((at, expect(node)));
378 at = rgt;
379 }
380 None => {
381 return node.map(|node| ((at, node), parent));
382 }
383 }
384 }
385 }
386
387 fn above_at<Q>(&self, mut at: FreeListIndex, key: &Q) -> Option<&K>
388 where
389 K: Borrow<Q>,
390 Q: ?Sized + Ord,
391 {
392 let mut seen: Option<&K> = None;
393 while let Some(node) = self.node(at) {
394 let k: &Q = node.key.borrow();
395 if k.le(key) {
396 match node.rgt {
397 Some(rgt) => at = rgt,
398 None => break,
399 }
400 } else {
401 seen = Some(&node.key);
402 match node.lft {
403 Some(lft) => at = lft,
404 None => break,
405 }
406 }
407 }
408 seen
409 }
410
411 fn below_at<Q>(&self, mut at: FreeListIndex, key: &Q) -> Option<&K>
412 where
413 K: Borrow<Q>,
414 Q: ?Sized + Ord,
415 {
416 let mut seen: Option<&K> = None;
417 while let Some(node) = self.node(at) {
418 let k: &Q = node.key.borrow();
419 if k.lt(key) {
420 seen = Some(&node.key);
421 match node.rgt {
422 Some(rgt) => at = rgt,
423 None => break,
424 }
425 } else {
426 match node.lft {
427 Some(lft) => at = lft,
428 None => break,
429 }
430 }
431 }
432 seen
433 }
434
435 fn equal_at<Q>(&self, mut at: FreeListIndex, key: &Q) -> Option<&K>
436 where
437 K: Borrow<Q>,
438 Q: ?Sized + Ord,
439 {
440 while let Some(node) = self.node(at) {
441 let k: &Q = node.key.borrow();
442 if k.eq(key) {
443 return Some(&node.key);
444 } else if k.lt(key) {
445 match node.rgt {
446 Some(rgt) => at = rgt,
447 None => break,
448 }
449 } else {
450 match node.lft {
451 Some(lft) => at = lft,
452 None => break,
453 }
454 }
455 }
456 None
457 }
458
459 #[allow(clippy::type_complexity)]
464 fn lookup_at<Q: ?Sized>(
465 &self,
466 mut at: FreeListIndex,
467 key: &Q,
468 ) -> Option<(NodeAndIndex<K>, Option<(FreeListIndex, &Node<K>, Edge)>)>
469 where
470 K: Borrow<Q>,
471 Q: BorshSerialize + Eq + PartialOrd,
472 {
473 let mut p = None;
474 let mut curr = Some(expect(self.node(at)));
475 while let Some(node) = curr {
476 let node_key: &Q = node.key.borrow();
477 if node_key.eq(key) {
478 return Some(((at, node), p));
479 } else if node_key.lt(key) {
480 match node.rgt {
481 Some(rgt) => {
482 p = Some((at, node, Edge::Right));
483 at = rgt;
484 }
485 None => break,
486 }
487 } else {
488 match node.lft {
489 Some(lft) => {
490 p = Some((at, node, Edge::Left));
491 at = lft;
492 }
493 None => break,
494 }
495 }
496 curr = self.node(at);
497 }
498 None
499 }
500}
501
502impl<K> Tree<K>
503where
504 K: Ord + BorshSerialize + BorshDeserialize + Clone,
505{
506 fn internal_insert(&mut self, key: K) {
507 if let Some(root) = self.root {
508 let node = expect(self.node(root)).clone();
509 self.root = Some(self.insert_at(node, root, key));
510 } else {
511 self.root = Some(self.nodes.insert(Node::of(key)));
512 }
513 }
514
515 fn insert_at(&mut self, mut node: Node<K>, id: FreeListIndex, key: K) -> FreeListIndex {
516 if key.eq(&node.key) {
517 id
519 } else {
520 if key.lt(&node.key) {
521 let idx = match node.lft {
522 Some(lft) => self.insert_at(expect(self.node(lft)).clone(), lft, key),
523 None => self.nodes.insert(Node::of(key)),
524 };
525 node.lft = Some(idx);
526 } else {
527 let idx = match node.rgt {
528 Some(rgt) => self.insert_at(expect(self.node(rgt)).clone(), rgt, key),
529 None => self.nodes.insert(Node::of(key)),
530 };
531 node.rgt = Some(idx);
532 };
533
534 self.update_height(&mut node, id);
535 self.enforce_balance(&mut node, id)
536 }
537 }
538
539 fn update_height(&mut self, node: &mut Node<K>, id: FreeListIndex) {
542 let lft = node.lft.and_then(|id| self.node(id).map(|n| n.ht)).unwrap_or_default();
543 let rgt = node.rgt.and_then(|id| self.node(id).map(|n| n.ht)).unwrap_or_default();
544
545 node.ht = 1 + std::cmp::max(lft, rgt);
546 *expect(self.nodes.get_mut(id)) = node.clone();
550 }
551
552 fn get_balance(&self, node: &Node<K>) -> i64 {
554 let lht = node.lft.and_then(|id| self.node(id).map(|n| n.ht)).unwrap_or_default();
555 let rht = node.rgt.and_then(|id| self.node(id).map(|n| n.ht)).unwrap_or_default();
556
557 lht as i64 - rht as i64
558 }
559
560 fn rotate_left(&mut self, node: &mut Node<K>, id: FreeListIndex) -> FreeListIndex {
563 let (left_id, mut left) = expect(node.left(&self.nodes).map(|(id, n)| (id, n.clone())));
564 let lft_rgt = left.rgt;
565
566 node.lft = lft_rgt;
568
569 left.rgt = Some(id);
571
572 self.update_height(node, id);
574 self.update_height(&mut left, left_id);
575
576 left_id
577 }
578
579 fn rotate_right(&mut self, node: &mut Node<K>, id: FreeListIndex) -> FreeListIndex {
582 let (rgt_id, mut rgt) = expect(node.right(&self.nodes).map(|(id, r)| (id, r.clone())));
583 let rgt_lft = rgt.lft;
584
585 node.rgt = rgt_lft;
587
588 rgt.lft = Some(id);
590
591 self.update_height(node, id);
593 self.update_height(&mut rgt, rgt_id);
594
595 rgt_id
596 }
597
598 fn enforce_balance(&mut self, node: &mut Node<K>, id: FreeListIndex) -> FreeListIndex {
600 let balance = self.get_balance(node);
601 if balance > 1 {
602 let (left_id, mut left) = expect(node.left(&self.nodes).map(|(id, n)| (id, n.clone())));
603 if self.get_balance(&left) < 0 {
604 let rotated = self.rotate_right(&mut left, left_id);
605 node.lft = Some(rotated);
606 }
607 self.rotate_left(node, id)
608 } else if balance < -1 {
609 let (right_id, mut right) =
610 expect(node.right(&self.nodes).map(|(id, r)| (id, r.clone())));
611 if self.get_balance(&right) > 0 {
612 let rotated = self.rotate_left(&mut right, right_id);
613 node.rgt = Some(rotated);
614 }
615 self.rotate_right(node, id)
616 } else {
617 id
618 }
619 }
620
621 fn check_balance(&mut self, at: FreeListIndex, key: &K) -> FreeListIndex {
624 match self.node(at).cloned() {
625 Some(mut node) => {
626 if !node.key.eq(key) {
627 if node.key.gt(key) {
628 if let Some(l) = node.lft {
629 let id = self.check_balance(l, key);
630 node.lft = Some(id);
631 }
632 } else if let Some(r) = node.rgt {
633 let id = self.check_balance(r, key);
634 node.rgt = Some(id);
635 }
636 }
637 self.update_height(&mut node, at);
638 self.enforce_balance(&mut node, at)
639 }
640 None => at,
641 }
642 }
643
644 fn do_remove<Q: ?Sized>(&mut self, key: &Q) -> Option<K>
653 where
654 K: Borrow<Q>,
655 Q: BorshSerialize + Eq + PartialOrd,
656 {
657 let ((r_id, mut r_node), remove_parent) = match self
660 .root
661 .and_then(|root| self.lookup_at(root, key))
662 {
663 Some(((l_id, node), r)) => ((l_id, node.clone()), r.map(|(i, n, e)| (i, n.clone(), e))),
664 None => return None, };
666
667 let lft_opt = r_node.lft;
668 let rgt_opt = r_node.rgt;
669
670 if lft_opt.is_none() && rgt_opt.is_none() {
671 if let Some((p_id, mut p_node, p_edge)) = remove_parent {
673 match p_edge {
674 Edge::Right => {
675 p_node.rgt = None;
676 }
677 Edge::Left => {
678 p_node.lft = None;
679 }
680 }
681 self.update_height(&mut p_node, p_id);
682
683 self.root = self.root.map(|root| self.check_balance(root, &p_node.key));
687 }
688
689 let removed = expect(self.nodes.remove(r_id));
690 if Some(r_id) == self.root {
691 self.root = None;
692 }
693
694 Some(removed.key)
695 } else {
696 let b = self.get_balance(&r_node);
698 if b >= 0 {
699 let left = expect(lft_opt);
701
702 let ((min_id, _), parent) = expect(self.max_at(left));
705 let mut parent = parent.map(|(i, n)| (i, n.clone()));
706
707 let replaced_key = if let Some((p_id, parent_node)) = &mut parent {
708 let min_left = expect(self.nodes.remove(min_id));
710
711 parent_node.rgt = min_left.lft;
712
713 let r_key = core::mem::replace(&mut r_node.key, min_left.key);
714 self.update_height(parent_node, *p_id);
715 *expect(self.nodes.get_mut(r_id)) = r_node.clone();
716 r_key
717 } else {
718 let max_left = expect(self.nodes.remove(min_id));
719
720 r_node.lft = max_left.lft;
722
723 let r_key = core::mem::replace(&mut r_node.key, max_left.key);
724 self.update_height(&mut r_node, r_id);
725 r_key
726 };
727
728 self.root = self.root.map(|root| {
731 self.check_balance(
732 root,
733 parent.as_ref().map(|p| &p.1.key).unwrap_or(&r_node.key),
734 )
735 });
736 Some(replaced_key)
737 } else {
738 let rgt = expect(rgt_opt);
740
741 let ((min_id, _), parent) = expect(self.min_at(rgt));
744 let mut parent = parent.map(|(i, n)| (i, n.clone()));
745
746 let replaced_key = if let Some((p_id, parent_node)) = &mut parent {
747 let min_right = expect(self.nodes.remove(min_id));
749
750 parent_node.lft = min_right.rgt;
751
752 let r_key = core::mem::replace(&mut r_node.key, min_right.key);
753 self.update_height(parent_node, *p_id);
754 *expect(self.nodes.get_mut(r_id)) = r_node.clone();
755 r_key
756 } else {
757 let min_right = expect(self.nodes.remove(min_id));
758
759 r_node.rgt = min_right.rgt;
761
762 let r_key = core::mem::replace(&mut r_node.key, min_right.key);
763 self.update_height(&mut r_node, r_id);
764 r_key
765 };
766
767 self.root = self.root.map(|root| {
770 self.check_balance(
771 root,
772 parent.as_ref().map(|p| &p.1.key).unwrap_or(&r_node.key),
773 )
774 });
775 Some(replaced_key)
776 }
777 }
778 }
779}
780
781impl<K, V, H> TreeMap<K, V, H>
782where
783 K: BorshSerialize + Ord,
784 V: BorshSerialize,
785 H: ToKey,
786{
787 pub fn iter(&self) -> Iter<K, V, H>
790 where
791 K: BorshDeserialize,
792 {
793 Iter::new(self)
794 }
795
796 pub fn iter_mut(&mut self) -> IterMut<K, V, H>
800 where
801 K: BorshDeserialize,
802 {
803 IterMut::new(self)
804 }
805
806 pub fn keys(&self) -> Keys<K>
809 where
810 K: BorshDeserialize,
811 {
812 Keys::new(&self.tree)
813 }
814
815 pub fn values(&self) -> Values<K, V, H>
818 where
819 K: BorshDeserialize,
820 {
821 Values::new(self)
822 }
823
824 pub fn values_mut(&mut self) -> ValuesMut<K, V, H>
827 where
828 K: BorshDeserialize,
829 {
830 ValuesMut::new(self)
831 }
832
833 pub fn range<'a, R: 'a, Q: 'a>(&'a self, range: R) -> Range<'a, K, V, H>
863 where
864 K: BorshDeserialize + Borrow<Q>,
865 Q: ?Sized + Ord,
866 R: RangeBounds<Q>,
867 {
868 Range::new(self, (range.start_bound(), range.end_bound()))
869 }
870
871 pub fn range_mut<R, Q>(&mut self, range: R) -> RangeMut<'_, K, V, H>
902 where
903 K: BorshDeserialize + Borrow<Q>,
904 Q: ?Sized + Ord,
905 R: RangeBounds<Q>,
906 {
907 RangeMut::new(self, (range.start_bound(), range.end_bound()))
908 }
909}
910
911impl<K, V, H> TreeMap<K, V, H>
912where
913 K: BorshSerialize + Ord,
914 V: BorshSerialize + BorshDeserialize,
915 H: ToKey,
916{
917 pub fn remove_entry<Q: ?Sized>(&mut self, key: &Q) -> Option<(K, V)>
935 where
936 K: Borrow<Q> + BorshDeserialize + Clone,
937 Q: BorshSerialize + ToOwned<Owned = K> + Eq + PartialOrd,
938 {
939 self.values.remove(key).map(|removed_value| {
940 let removed = self.tree.do_remove(key);
941 (expect(removed), removed_value)
942 })
943 }
944
945 pub fn entry(&mut self, key: K) -> Entry<K, V>
962 where
963 K: Clone,
964 {
965 Entry::new(self.values.entry(key), &mut self.tree)
966 }
967}
968
969impl<K, V, H> TreeMap<K, V, H>
970where
971 K: BorshSerialize + Ord,
972 V: BorshSerialize,
973 H: ToKey,
974{
975 pub fn flush(&mut self) {
979 self.values.flush();
980 self.tree.nodes.flush();
981 }
982}
983
984#[cfg(not(target_arch = "wasm32"))]
985#[cfg(test)]
986mod tests {
987 use super::*;
988 use crate::test_utils::test_env::setup_free;
989 use crate::test_utils::{next_trie_id, test_env};
990
991 use arbitrary::{Arbitrary, Unstructured};
992 use quickcheck::QuickCheck;
993 use rand::RngCore;
994 use rand::SeedableRng;
995 use std::collections::BTreeMap;
996 use std::collections::HashSet;
997 use std::ops::Bound;
998
999 fn height<K, V, H>(tree: &TreeMap<K, V, H>) -> u32
1001 where
1002 K: Ord + Clone + BorshSerialize + BorshDeserialize,
1003 V: BorshSerialize + BorshDeserialize,
1004 H: ToKey,
1005 {
1006 tree.tree.root.and_then(|root| tree.tree.node(root)).map(|n| n.ht).unwrap_or_default()
1007 }
1008
1009 fn random(n: u32) -> Vec<u32> {
1010 let mut rng = rand::thread_rng();
1011 let mut vec = Vec::with_capacity(n as usize);
1012 (0..n).for_each(|_| {
1013 vec.push(rng.next_u32() % 1000);
1014 });
1015 vec
1016 }
1017
1018 fn log2(x: f64) -> f64 {
1019 std::primitive::f64::log(x, 2.0f64)
1020 }
1021
1022 fn max_tree_height(n: u32) -> u32 {
1023 const B: f64 = -0.328;
1028 const C: f64 = 1.440;
1029 const D: f64 = 1.065;
1030
1031 let h = C * log2(n as f64 + D) + B;
1032 h.ceil() as u32
1033 }
1034
1035 #[test]
1036 fn test_empty() {
1037 let map: TreeMap<u8, u8> = TreeMap::new(b't');
1038 assert_eq!(map.len(), 0);
1039 assert_eq!(height(&map), 0);
1040 assert_eq!(map.get(&42), None);
1041 assert!(!map.contains_key(&42));
1042 assert_eq!(map.tree.lower(&42), None);
1043 assert_eq!(map.tree.higher(&42), None);
1044 }
1045
1046 #[test]
1047 fn test_insert_3_rotate_l_l() {
1048 let mut map: TreeMap<i32, i32> = TreeMap::new(next_trie_id());
1049 assert_eq!(height(&map), 0);
1050
1051 map.insert(3, 3);
1052 assert_eq!(height(&map), 1);
1053
1054 map.insert(2, 2);
1055 assert_eq!(height(&map), 2);
1056
1057 map.insert(1, 1);
1058 assert_eq!(height(&map), 2);
1059
1060 let root = map.tree.root.unwrap();
1061 assert_eq!(root, FreeListIndex(1));
1062 assert_eq!(map.tree.node(root).map(|n| n.key), Some(2));
1063
1064 map.clear();
1065 }
1066
1067 #[test]
1068 fn test_insert_3_rotate_r_r() {
1069 let mut map: TreeMap<i32, i32> = TreeMap::new(next_trie_id());
1070 assert_eq!(height(&map), 0);
1071
1072 map.insert(1, 1);
1073 assert_eq!(height(&map), 1);
1074
1075 map.insert(2, 2);
1076 assert_eq!(height(&map), 2);
1077
1078 map.insert(3, 3);
1079
1080 let root = map.tree.root.unwrap();
1081 assert_eq!(root, FreeListIndex(1));
1082 assert_eq!(map.tree.node(root).map(|n| n.key), Some(2));
1083 assert_eq!(height(&map), 2);
1084
1085 map.clear();
1086 }
1087
1088 #[test]
1089 fn test_insert_lookup_n_asc() {
1090 let mut map: TreeMap<i32, i32> = TreeMap::new(next_trie_id());
1091
1092 let n: u32 = 30;
1093 let cases = (0..2 * (n as i32)).collect::<Vec<i32>>();
1094
1095 let mut counter = 0;
1096 for k in cases.iter().copied() {
1097 if k % 2 == 0 {
1098 counter += 1;
1099 map.insert(k, counter);
1100 }
1101 }
1102
1103 counter = 0;
1104 for k in &cases {
1105 if *k % 2 == 0 {
1106 counter += 1;
1107 assert_eq!(map.get(k), Some(&counter));
1108 } else {
1109 assert_eq!(map.get(k), None);
1110 }
1111 }
1112
1113 assert!(height(&map) <= max_tree_height(n));
1114 map.clear();
1115 }
1116
1117 #[test]
1118 pub fn test_insert_one() {
1119 let mut map = TreeMap::new(b"m");
1120 assert_eq!(None, map.insert(1, 2));
1121 assert_eq!(2, map.insert(1, 3).unwrap());
1122 }
1123
1124 #[test]
1125 fn test_insert_lookup_n_desc() {
1126 let mut map: TreeMap<i32, i32> = TreeMap::new(next_trie_id());
1127
1128 let n: u32 = 30;
1129 let cases = (0..2 * (n as i32)).rev().collect::<Vec<i32>>();
1130
1131 let mut counter = 0;
1132 for k in cases.iter().copied() {
1133 if k % 2 == 0 {
1134 counter += 1;
1135 map.insert(k, counter);
1136 }
1137 }
1138
1139 counter = 0;
1140 for k in &cases {
1141 if *k % 2 == 0 {
1142 counter += 1;
1143 assert_eq!(map.get(k), Some(&counter));
1144 } else {
1145 assert_eq!(map.get(k), None);
1146 }
1147 }
1148
1149 assert!(height(&map) <= max_tree_height(n));
1150 map.clear();
1151 }
1152
1153 #[test]
1154 fn insert_n_random() {
1155 test_env::setup_free();
1156
1157 for k in 1..10 {
1158 let mut map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1160
1161 let n = 1 << k;
1162 let input: Vec<u32> = random(n);
1163
1164 for x in input.iter().copied() {
1165 map.insert(x, 42);
1166 }
1167
1168 for x in &input {
1169 assert_eq!(map.get(x), Some(&42));
1170 }
1171
1172 assert!(height(&map) <= max_tree_height(n));
1173 map.clear();
1174 }
1175 }
1176
1177 #[test]
1192 fn test_max() {
1193 let n: u32 = 30;
1194 let vec = random(n);
1195
1196 let mut map: TreeMap<u32, u32> = TreeMap::new(b't');
1197 for x in vec.iter().rev().copied() {
1198 map.insert(x, 1);
1199 }
1200
1201 let tree_max = map.tree.max_at(map.tree.root.unwrap()).map(|((_, n), _)| &n.key);
1202
1203 assert_eq!(tree_max.unwrap(), vec.iter().max().unwrap());
1204 map.clear();
1205 }
1206
1207 #[test]
1208 fn test_lower() {
1209 let mut map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1210 let vec = [10, 20, 30, 40, 50];
1211
1212 for x in vec.into_iter() {
1213 map.insert(x, 1);
1214 }
1215
1216 assert_eq!(map.tree.lower(&5), None);
1217 assert_eq!(map.tree.lower(&10), None);
1218 assert_eq!(map.tree.lower(&11), Some(&10));
1219 assert_eq!(map.tree.lower(&20), Some(&10));
1220 assert_eq!(map.tree.lower(&49), Some(&40));
1221 assert_eq!(map.tree.lower(&50), Some(&40));
1222 assert_eq!(map.tree.lower(&51), Some(&50));
1223
1224 map.clear();
1225 }
1226
1227 #[test]
1228 fn test_higher() {
1229 let mut map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1230 let vec = [10, 20, 30, 40, 50];
1231
1232 for x in vec.into_iter() {
1233 map.insert(x, 1);
1234 }
1235
1236 assert_eq!(map.tree.higher(&5), Some(&10));
1237 assert_eq!(map.tree.higher(&10), Some(&20));
1238 assert_eq!(map.tree.higher(&11), Some(&20));
1239 assert_eq!(map.tree.higher(&20), Some(&30));
1240 assert_eq!(map.tree.higher(&49), Some(&50));
1241 assert_eq!(map.tree.higher(&50), None);
1242 assert_eq!(map.tree.higher(&51), None);
1243
1244 map.clear();
1245 }
1246
1247 #[test]
1248 fn test_floor_key() {
1249 let mut map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1250 let vec = [10, 20, 30, 40, 50];
1251
1252 for x in vec.into_iter() {
1253 map.insert(x, 1);
1254 }
1255
1256 assert_eq!(map.tree.floor_key(&5), None);
1257 assert_eq!(map.tree.floor_key(&10), Some(&10));
1258 assert_eq!(map.tree.floor_key(&11), Some(&10));
1259 assert_eq!(map.tree.floor_key(&20), Some(&20));
1260 assert_eq!(map.tree.floor_key(&49), Some(&40));
1261 assert_eq!(map.tree.floor_key(&50), Some(&50));
1262 assert_eq!(map.tree.floor_key(&51), Some(&50));
1263
1264 map.clear();
1265 }
1266
1267 #[test]
1268 fn test_ceil_key() {
1269 let mut map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1270 let vec = [10, 20, 30, 40, 50];
1271
1272 for x in vec.into_iter() {
1273 map.insert(x, 1);
1274 }
1275
1276 assert_eq!(map.tree.ceil_key(&5), Some(&10));
1277 assert_eq!(map.tree.ceil_key(&10), Some(&10));
1278 assert_eq!(map.tree.ceil_key(&11), Some(&20));
1279 assert_eq!(map.tree.ceil_key(&20), Some(&20));
1280 assert_eq!(map.tree.ceil_key(&49), Some(&50));
1281 assert_eq!(map.tree.ceil_key(&50), Some(&50));
1282 assert_eq!(map.tree.ceil_key(&51), None);
1283
1284 map.clear();
1285 }
1286
1287 #[test]
1288 fn test_remove_1() {
1289 let mut map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1290 map.insert(1, 1);
1291 assert_eq!(map.get(&1), Some(&1));
1292 map.remove(&1);
1293 assert_eq!(map.get(&1), None);
1294 assert_eq!(map.tree.nodes.len(), 0);
1295 map.clear();
1296 }
1297
1298 #[test]
1299 fn test_remove_3() {
1300 let map: TreeMap<u32, u32> = avl(&[(0, 0)], &[0, 0, 1]);
1301
1302 assert!(map.is_empty());
1303 }
1304
1305 #[test]
1306 fn test_remove_3_desc() {
1307 let vec = [3, 2, 1];
1308 let mut map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1309
1310 for x in &vec {
1311 assert_eq!(map.get(x), None);
1312 map.insert(*x, 1);
1313 assert_eq!(map.get(x), Some(&1));
1314 }
1315
1316 for x in &vec {
1317 assert_eq!(map.get(x), Some(&1));
1318 map.remove(x);
1319 assert_eq!(map.get(x), None);
1320 }
1321 map.clear();
1322 }
1323
1324 #[test]
1325 fn test_remove_3_asc() {
1326 let vec = [1, 2, 3];
1327 let mut map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1328
1329 for x in &vec {
1330 assert_eq!(map.get(x), None);
1331 map.insert(*x, 1);
1332 assert_eq!(map.get(x), Some(&1));
1333 }
1334 assert_eq!(map.tree.nodes.get(FreeListIndex(0)).unwrap().key, 1);
1335
1336 for x in &vec {
1337 assert_eq!(map.get(x), Some(&1));
1338 map.remove(x);
1339 assert_eq!(map.get(x), None);
1340 }
1341 map.clear();
1342 }
1343
1344 #[test]
1345 fn test_remove_7_regression_1() {
1346 let vec =
1347 [2104297040, 552624607, 4269683389, 3382615941, 155419892, 4102023417, 1795725075];
1348 let mut map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1349
1350 for x in &vec {
1351 assert_eq!(map.get(x), None);
1352 map.insert(*x, 1);
1353 assert_eq!(map.get(x), Some(&1));
1354 }
1355
1356 assert!(is_balanced(&map, map.tree.root.unwrap()));
1357
1358 for x in &vec {
1359 assert_eq!(map.get(x), Some(&1));
1360 map.remove(x);
1361 assert_eq!(map.get(x), None);
1362 }
1363 map.clear();
1364 }
1365
1366 #[test]
1367 fn test_remove_7_regression_2() {
1368 let vec = [700623085, 87488544, 1500140781, 1111706290, 3187278102, 4042663151, 3731533080];
1369 let mut map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1370
1371 for x in &vec {
1372 assert_eq!(map.get(x), None);
1373 map.insert(*x, 1);
1374 assert_eq!(map.get(x), Some(&1));
1375 }
1376
1377 for x in &vec {
1378 assert_eq!(map.get(x), Some(&1));
1379 map.remove(x);
1380 assert_eq!(map.get(x), None);
1381 }
1382 map.clear();
1383 }
1384
1385 #[test]
1386 fn test_remove_9_regression() {
1387 let vec = [
1388 1186903464, 506371929, 1738679820, 1883936615, 1815331350, 1512669683, 3581743264,
1389 1396738166, 1902061760,
1390 ];
1391 let mut map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1392
1393 for x in &vec {
1394 assert_eq!(map.get(x), None);
1395 map.insert(*x, 1);
1396 assert_eq!(map.get(x), Some(&1));
1397 }
1398
1399 for x in &vec {
1400 assert_eq!(map.get(x), Some(&1));
1401 map.remove(x);
1402 assert_eq!(map.get(x), None);
1403 }
1404 map.clear();
1405 }
1406
1407 #[test]
1408 fn test_remove_20_regression_1() {
1409 let vec = [
1410 552517392, 3638992158, 1015727752, 2500937532, 638716734, 586360620, 2476692174,
1411 1425948996, 3608478547, 757735878, 2709959928, 2092169539, 3620770200, 783020918,
1412 1986928932, 200210441, 1972255302, 533239929, 497054557, 2137924638,
1413 ];
1414 let mut map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1415
1416 for x in &vec {
1417 assert_eq!(map.get(x), None);
1418 map.insert(*x, 1);
1419 assert_eq!(map.get(x), Some(&1));
1420 }
1421
1422 for x in &vec {
1423 assert_eq!(map.get(x), Some(&1));
1424 map.remove(x);
1425 assert_eq!(map.get(x), None);
1426 }
1427 map.clear();
1428 }
1429
1430 #[test]
1431 fn test_remove_7_regression() {
1432 let vec = [280, 606, 163, 857, 436, 508, 44, 801];
1433
1434 let mut map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1435
1436 for x in &vec {
1437 assert_eq!(map.get(x), None);
1438 map.insert(*x, 1);
1439 assert_eq!(map.get(x), Some(&1));
1440 }
1441
1442 for x in &vec {
1443 assert_eq!(map.get(x), Some(&1));
1444 map.remove(x);
1445 assert_eq!(map.get(x), None);
1446 }
1447
1448 assert_eq!(map.len(), 0, "map.len() > 0");
1449 assert_eq!(map.tree.nodes.len(), 0, "map.tree is not empty");
1450 map.clear();
1451 }
1452
1453 #[test]
1454 fn test_insert_8_remove_4_regression() {
1455 let insert = [882, 398, 161, 76];
1456 let remove = [242, 687, 860, 811];
1457
1458 let mut map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1459
1460 for (i, (k1, k2)) in insert.iter().zip(remove.iter()).enumerate() {
1461 let v = i as u32;
1462 map.insert(*k1, v);
1463 map.insert(*k2, v);
1464 }
1465
1466 for k in remove.iter() {
1467 map.remove(k);
1468 }
1469
1470 assert_eq!(map.len(), insert.len() as u32);
1471
1472 for (i, k) in (0..).zip(insert.iter()) {
1473 assert_eq!(map.get(k), Some(&i));
1474 }
1475 }
1476
1477 #[test]
1478 fn test_remove_n() {
1479 let n: u32 = 20;
1480 let vec = random(n);
1481
1482 let mut set: HashSet<u32> = HashSet::new();
1483 let mut map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1484 for x in &vec {
1485 map.insert(*x, 1);
1486 set.insert(*x);
1487 }
1488
1489 assert_eq!(map.len(), set.len() as u32);
1490
1491 for x in &set {
1492 assert_eq!(map.get(x), Some(&1));
1493 map.remove(x);
1494 assert_eq!(map.get(x), None);
1495 }
1496
1497 assert_eq!(map.len(), 0, "map.len() > 0");
1498 assert_eq!(map.tree.nodes.len(), 0, "map.tree is not empty");
1499 map.clear();
1500 }
1501
1502 #[test]
1503 fn test_remove_root_3() {
1504 let mut map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1505 map.insert(2, 1);
1506 map.insert(3, 1);
1507 map.insert(1, 1);
1508 map.insert(4, 1);
1509
1510 map.remove(&2);
1511
1512 assert_eq!(map.get(&1), Some(&1));
1513 assert_eq!(map.get(&2), None);
1514 assert_eq!(map.get(&3), Some(&1));
1515 assert_eq!(map.get(&4), Some(&1));
1516 map.clear();
1517 }
1518
1519 #[test]
1520 fn test_insert_2_remove_2_regression() {
1521 let ins = [11760225, 611327897];
1522 let rem = [2982517385, 1833990072];
1523
1524 let mut map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1525 map.insert(ins[0], 1);
1526 map.insert(ins[1], 1);
1527
1528 map.remove(&rem[0]);
1529 map.remove(&rem[1]);
1530
1531 let h = height(&map);
1532 let h_max = max_tree_height(map.len());
1533 assert!(h <= h_max, "h={} h_max={}", h, h_max);
1534 map.clear();
1535 }
1536
1537 #[test]
1538 fn test_insert_n_duplicates() {
1539 let mut map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1540
1541 for x in 0..30 {
1542 map.insert(x, x);
1543 map.insert(42, x);
1544 }
1545
1546 assert_eq!(map.get(&42), Some(&29));
1547 assert_eq!(map.len(), 31);
1548 assert_eq!(map.tree.nodes.len(), 31);
1549
1550 map.clear();
1551 }
1552
1553 #[test]
1554 fn test_insert_2n_remove_n_random() {
1555 for k in 1..4 {
1556 let mut map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1557 let mut set: HashSet<u32> = HashSet::new();
1558
1559 let n = 1 << k;
1560 let ins: Vec<u32> = random(n);
1561 let rem: Vec<u32> = random(n);
1562
1563 for x in &ins {
1564 set.insert(*x);
1565 map.insert(*x, 42);
1566 }
1567
1568 for x in &rem {
1569 set.insert(*x);
1570 map.insert(*x, 42);
1571 }
1572
1573 for x in &rem {
1574 set.remove(x);
1575 map.remove(x);
1576 }
1577
1578 assert_eq!(map.len(), set.len() as u32);
1579
1580 let h = height(&map);
1581 let h_max = max_tree_height(n);
1582 assert!(h <= h_max, "[n={}] tree is too high: {} (max is {}).", n, h, h_max);
1583
1584 map.clear();
1585 }
1586 }
1587
1588 #[test]
1589 fn test_remove_empty() {
1590 let mut map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1591 assert_eq!(map.remove(&1), None);
1592 }
1593
1594 #[test]
1595 fn test_iter() {
1596 let mut map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1597 map.insert(1, 41);
1598 map.insert(2, 42);
1599 map.insert(3, 43);
1600
1601 assert_eq!(map.iter().collect::<Vec<_>>(), vec![(&1, &41), (&2, &42), (&3, &43)]);
1602
1603 assert_eq!(map.iter().nth(1), Some((&2, &42)));
1605 assert_eq!(map.iter().count(), 3);
1606 assert_eq!(map.iter().last(), Some((&3, &43)));
1607 map.clear();
1608 }
1609
1610 #[test]
1611 fn test_iter_empty() {
1612 let map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1613 assert_eq!(map.iter().count(), 0);
1614 }
1615
1616 #[test]
1617 fn test_iter_rev() {
1618 let mut map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1619 map.insert(1, 41);
1620 map.insert(2, 42);
1621 map.insert(3, 43);
1622
1623 assert_eq!(
1624 map.iter().rev().collect::<Vec<(&u32, &u32)>>(),
1625 vec![(&3, &43), (&2, &42), (&1, &41)]
1626 );
1627
1628 assert_eq!(map.iter().rev().nth(1), Some((&2, &42)));
1630 assert_eq!(map.iter().rev().count(), 3);
1631 assert_eq!(map.iter().rev().last(), Some((&1, &41)));
1632 map.clear();
1633 }
1634
1635 #[test]
1636 fn test_iter_rev_empty() {
1637 let map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1638 assert_eq!(map.iter().rev().count(), 0);
1639 }
1640
1641 #[test]
1642 fn test_iter_from() {
1643 let mut map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1644
1645 let one = [10, 20, 30, 40, 50];
1646 let two = [45, 35, 25, 15, 5];
1647
1648 for x in &one {
1649 map.insert(*x, 42);
1650 }
1651
1652 for x in &two {
1653 map.insert(*x, 42);
1654 }
1655
1656 assert_eq!(
1657 map.range(30..).map(|(&a, &b)| (a, b)).collect::<Vec<(u32, u32)>>(),
1658 vec![(30, 42), (35, 42), (40, 42), (45, 42), (50, 42)]
1659 );
1660
1661 assert_eq!(
1662 map.range(31..).map(|(&a, &b)| (a, b)).collect::<Vec<(u32, u32)>>(),
1663 vec![(35, 42), (40, 42), (45, 42), (50, 42)]
1664 );
1665
1666 assert_eq!(map.range(31..).nth(2), Some((&45, &42)));
1668 assert_eq!(map.range(31..).count(), 4);
1669 assert_eq!(map.range(31..).last(), Some((&50, &42)));
1670
1671 map.clear();
1672 }
1673
1674 #[test]
1675 fn test_iter_from_empty() {
1676 let map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1677 assert_eq!(map.range(42..).count(), 0);
1678 }
1679
1680 #[test]
1681 fn test_iter_rev_from() {
1682 let mut map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1683
1684 let one = [10, 20, 30, 40, 50];
1685 let two = [45, 35, 25, 15, 5];
1686
1687 for x in &one {
1688 map.insert(*x, 42);
1689 }
1690
1691 for x in &two {
1692 map.insert(*x, 42);
1693 }
1694
1695 assert_eq!(
1696 map.range(..29).rev().map(|(&a, &b)| (a, b)).collect::<Vec<(u32, u32)>>(),
1697 vec![(25, 42), (20, 42), (15, 42), (10, 42), (5, 42)]
1698 );
1699
1700 assert_eq!(
1701 map.range(..30).rev().map(|(&a, &b)| (a, b)).collect::<Vec<(u32, u32)>>(),
1702 vec![(25, 42), (20, 42), (15, 42), (10, 42), (5, 42)]
1703 );
1704
1705 assert_eq!(
1706 map.range(..31).rev().map(|(&a, &b)| (a, b)).collect::<Vec<(u32, u32)>>(),
1707 vec![(30, 42), (25, 42), (20, 42), (15, 42), (10, 42), (5, 42)]
1708 );
1709
1710 assert_eq!(map.range(..31).rev().nth(2), Some((&20, &42)));
1712 assert_eq!(map.range(..31).rev().count(), 6);
1713 assert_eq!(map.range(..31).rev().last(), Some((&5, &42)));
1714
1715 map.clear();
1716 }
1717
1718 #[test]
1719 fn test_range() {
1720 let mut map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1721
1722 let one = [10, 20, 30, 40, 50];
1723 let two = [45, 35, 25, 15, 5];
1724
1725 for x in &one {
1726 map.insert(*x, 42);
1727 }
1728
1729 for x in &two {
1730 map.insert(*x, 42);
1731 }
1732
1733 assert_eq!(
1734 map.range((Bound::Included(20), Bound::Excluded(30)))
1735 .map(|(&a, &b)| (a, b))
1736 .collect::<Vec<(u32, u32)>>(),
1737 vec![(20, 42), (25, 42)]
1738 );
1739
1740 assert_eq!(
1741 map.range((Bound::Excluded(10), Bound::Included(40)))
1742 .map(|(&a, &b)| (a, b))
1743 .collect::<Vec<(u32, u32)>>(),
1744 vec![(15, 42), (20, 42), (25, 42), (30, 42), (35, 42), (40, 42)]
1745 );
1746
1747 assert_eq!(
1748 map.range((Bound::Included(20), Bound::Included(40)))
1749 .map(|(&a, &b)| (a, b))
1750 .collect::<Vec<(u32, u32)>>(),
1751 vec![(20, 42), (25, 42), (30, 42), (35, 42), (40, 42)]
1752 );
1753
1754 assert_eq!(
1755 map.range((Bound::Excluded(20), Bound::Excluded(45)))
1756 .map(|(&a, &b)| (a, b))
1757 .collect::<Vec<(u32, u32)>>(),
1758 vec![(25, 42), (30, 42), (35, 42), (40, 42)]
1759 );
1760
1761 assert_eq!(
1762 map.range((Bound::Excluded(25), Bound::Excluded(30)))
1763 .map(|(&a, &b)| (a, b))
1764 .collect::<Vec<(u32, u32)>>(),
1765 vec![]
1766 );
1767
1768 assert_eq!(
1769 map.range((Bound::Included(25), Bound::Included(25)))
1770 .map(|(&a, &b)| (a, b))
1771 .collect::<Vec<(u32, u32)>>(),
1772 vec![(25, 42)]
1773 );
1774
1775 assert_eq!(
1776 map.range((Bound::Excluded(25), Bound::Included(25)))
1777 .map(|(&a, &b)| (a, b))
1778 .collect::<Vec<(u32, u32)>>(),
1779 vec![]
1780 ); assert_eq!(map.range((Bound::Excluded(20), Bound::Excluded(45))).nth(2), Some((&35, &42)));
1784 assert_eq!(map.range((Bound::Excluded(20), Bound::Excluded(45))).count(), 4);
1785 assert_eq!(map.range((Bound::Excluded(20), Bound::Excluded(45))).last(), Some((&40, &42)));
1786
1787 map.clear();
1788 }
1789
1790 #[test]
1791 fn test_iter_rev_from_empty() {
1792 let map: TreeMap<u32, u32> = TreeMap::new(next_trie_id());
1793 assert_eq!(map.range(..=42).rev().count(), 0);
1794 }
1795
1796 #[test]
1797 fn test_balance_regression_1() {
1798 let insert = [(2, 0), (3, 0), (4, 0)];
1799 let remove = [0, 0, 0, 1];
1800
1801 let map = avl(&insert, &remove);
1802 assert!(is_balanced(&map, map.tree.root.unwrap()));
1803 }
1804
1805 #[test]
1806 fn test_balance_regression_2() {
1807 let insert = [(1, 0), (2, 0), (0, 0), (3, 0), (5, 0), (6, 0)];
1808 let remove = [0, 0, 0, 3, 5, 6, 7, 4];
1809
1810 let map = avl(&insert, &remove);
1811 assert!(is_balanced(&map, map.tree.root.unwrap()));
1812 }
1813
1814 fn avl<K, V>(insert: &[(K, V)], remove: &[K]) -> TreeMap<K, V, Sha256>
1819 where
1820 K: Ord + Clone + BorshSerialize + BorshDeserialize,
1821 V: Default + BorshSerialize + BorshDeserialize + Clone,
1822 {
1823 test_env::setup_free();
1824 let mut map: TreeMap<K, V, _> = TreeMap::new(next_trie_id());
1825 for k in remove {
1826 map.insert(k.clone(), Default::default());
1827 }
1828 let n = insert.len().max(remove.len());
1829 for i in 0..n {
1830 if i < remove.len() {
1831 map.remove(&remove[i]);
1832 }
1833 if i < insert.len() {
1834 let (k, v) = &insert[i];
1835 map.insert(k.clone(), v.clone());
1836 }
1837 }
1838 map
1839 }
1840
1841 fn rb<K, V>(insert: &[(K, V)], remove: &[K]) -> BTreeMap<K, V>
1842 where
1843 K: Ord + Clone + BorshSerialize + BorshDeserialize,
1844 V: Clone + Default + BorshSerialize + BorshDeserialize,
1845 {
1846 let mut map: BTreeMap<K, V> = BTreeMap::default();
1847 for k in remove {
1848 map.insert(k.clone(), Default::default());
1849 }
1850 let n = insert.len().max(remove.len());
1851 for i in 0..n {
1852 if i < remove.len() {
1853 map.remove(&remove[i]);
1854 }
1855 if i < insert.len() {
1856 let (k, v) = &insert[i];
1857 map.insert(k.clone(), v.clone());
1858 }
1859 }
1860 map
1861 }
1862
1863 #[test]
1864 fn prop_avl_vs_rb() {
1865 fn prop(insert: Vec<(u32, u32)>, remove: Vec<u32>) -> bool {
1866 let a = avl(&insert, &remove);
1867 let b = rb(&insert, &remove);
1868 let v1: Vec<(&u32, &u32)> = a.iter().collect();
1869 let v2: Vec<(&u32, &u32)> = b.iter().collect();
1870 v1 == v2
1871 }
1872
1873 QuickCheck::new()
1874 .tests(300)
1875 .quickcheck(prop as fn(std::vec::Vec<(u32, u32)>, std::vec::Vec<u32>) -> bool);
1876 }
1877
1878 #[test]
1879 fn insert_delete_insert() {
1880 let mut map = TreeMap::new(b"t");
1881 map.insert(0, 0);
1882 assert_eq!(map.remove(&0), Some(0));
1883 map.insert(0, 0);
1884 assert!(is_balanced(&map, map.tree.root.unwrap()));
1885 }
1886
1887 fn is_balanced<K, V, H>(map: &TreeMap<K, V, H>, root: FreeListIndex) -> bool
1888 where
1889 K: Ord + Clone + BorshSerialize + BorshDeserialize,
1890 V: BorshSerialize + BorshDeserialize,
1891 H: ToKey,
1892 {
1893 let node = map.tree.node(root).unwrap();
1894 let balance = map.tree.get_balance(node);
1895
1896 (-1..=1).contains(&balance)
1897 && node.lft.map(|id| is_balanced(map, id)).unwrap_or(true)
1898 && node.rgt.map(|id| is_balanced(map, id)).unwrap_or(true)
1899 }
1900
1901 #[test]
1902 fn prop_avl_balance() {
1903 test_env::setup_free();
1904
1905 fn prop(insert: Vec<(u32, u32)>, remove: Vec<u32>) -> bool {
1906 let map = avl(&insert, &remove);
1907 map.is_empty() || is_balanced(&map, map.tree.root.unwrap())
1908 }
1909
1910 QuickCheck::new()
1911 .tests(300)
1912 .quickcheck(prop as fn(std::vec::Vec<(u32, u32)>, std::vec::Vec<u32>) -> bool);
1913 }
1914
1915 #[test]
1916 fn prop_avl_height() {
1917 test_env::setup_free();
1918
1919 fn prop(insert: Vec<(u32, u32)>, remove: Vec<u32>) -> bool {
1920 let map = avl(&insert, &remove);
1921 height(&map) <= max_tree_height(map.len())
1922 }
1923
1924 QuickCheck::new()
1925 .tests(300)
1926 .quickcheck(prop as fn(std::vec::Vec<(u32, u32)>, std::vec::Vec<u32>) -> bool);
1927 }
1928
1929 fn range_prop(
1930 insert: Vec<(u32, u32)>,
1931 remove: Vec<u32>,
1932 range: (Bound<u32>, Bound<u32>),
1933 ) -> bool {
1934 let a = avl(&insert, &remove);
1935 let b = rb(&insert, &remove);
1936 let v1: Vec<(&u32, &u32)> = a.range(range).collect();
1937 let v2: Vec<(&u32, &u32)> = b.range(range).collect();
1938 v1 == v2
1939 }
1940
1941 type Prop = fn(std::vec::Vec<(u32, u32)>, std::vec::Vec<u32>, u32, u32) -> bool;
1942
1943 #[test]
1944 fn prop_avl_vs_rb_range_incl_incl() {
1945 fn prop(insert: Vec<(u32, u32)>, remove: Vec<u32>, r1: u32, r2: u32) -> bool {
1946 let range = (Bound::Included(r1.min(r2)), Bound::Included(r1.max(r2)));
1947 range_prop(insert, remove, range)
1948 }
1949
1950 QuickCheck::new().tests(300).quickcheck(prop as Prop);
1951 }
1952
1953 #[test]
1954 fn prop_avl_vs_rb_range_incl_excl() {
1955 fn prop(insert: Vec<(u32, u32)>, remove: Vec<u32>, r1: u32, r2: u32) -> bool {
1956 let range = (Bound::Included(r1.min(r2)), Bound::Excluded(r1.max(r2)));
1957 range_prop(insert, remove, range)
1958 }
1959
1960 QuickCheck::new().tests(300).quickcheck(prop as Prop);
1961 }
1962
1963 #[test]
1964 fn prop_avl_vs_rb_range_excl_incl() {
1965 fn prop(insert: Vec<(u32, u32)>, remove: Vec<u32>, r1: u32, r2: u32) -> bool {
1966 let range = (Bound::Excluded(r1.min(r2)), Bound::Included(r1.max(r2)));
1967 range_prop(insert, remove, range)
1968 }
1969
1970 QuickCheck::new().tests(300).quickcheck(prop as Prop);
1971 }
1972
1973 #[test]
1974 fn prop_avl_vs_rb_range_excl_excl() {
1975 fn prop(insert: Vec<(u32, u32)>, remove: Vec<u32>, r1: u32, r2: u32) -> bool {
1976 r1 == r2 || {
1978 let range = (Bound::Excluded(r1.min(r2)), Bound::Excluded(r1.max(r2)));
1979 range_prop(insert, remove, range)
1980 }
1981 }
1982
1983 QuickCheck::new().tests(300).quickcheck(prop as Prop);
1984 }
1985
1986 #[test]
1987 fn entry_api() {
1988 let mut map = TreeMap::new(b"b");
1989 {
1990 let test_entry = map.entry("test".to_string());
1991 assert_eq!(test_entry.key(), "test");
1992 let entry_ref = test_entry.or_insert(8u8);
1993 *entry_ref += 1;
1994 }
1995 assert_eq!(map["test"], 9);
1996
1997 let value = map.entry("test".to_string()).and_modify(|v| *v += 3).or_default();
1999 assert_eq!(*value, 12);
2000 }
2001
2002 #[test]
2003 fn map_iterator() {
2004 let mut map = TreeMap::new(b"b");
2005
2006 map.insert(0u8, 0u8);
2007 map.insert(1, 1);
2008 map.insert(2, 2);
2009 map.insert(3, 3);
2010 map.remove(&1);
2011 let iter = map.iter();
2012 assert_eq!(iter.len(), 3);
2013 assert_eq!(iter.collect::<Vec<_>>(), [(&0, &0), (&2, &2), (&3, &3)]);
2014
2015 let iter = map.iter_mut().rev();
2016 assert_eq!(iter.collect::<Vec<_>>(), [(&3, &mut 3), (&2, &mut 2), (&0, &mut 0)]);
2017
2018 let mut iter = map.iter();
2019 assert_eq!(iter.nth(2), Some((&3, &3)));
2020 assert_eq!(iter.next(), None);
2022
2023 map.values_mut().for_each(|v| {
2025 *v *= 2;
2026 });
2027 assert_eq!(map.values().collect::<Vec<_>>(), [&0, &4, &6]);
2028
2029 assert_eq!(map.keys().collect::<Vec<_>>(), [&0, &2, &3]);
2031 }
2032
2033 #[derive(Arbitrary, Debug)]
2034 enum Op {
2035 Insert(u8, u8),
2036 Remove(u8),
2037 Flush,
2038 Restore,
2039 Get(u8),
2040 EntryInsert(u8, u8),
2041 EntryRemove(u8),
2042 }
2043
2044 #[test]
2045 fn arbitrary() {
2046 setup_free();
2047
2048 let mut rng = rand_xorshift::XorShiftRng::seed_from_u64(0);
2049 let mut buf = vec![0; 4096];
2050 for _ in 0..256 {
2051 crate::mock::with_mocked_blockchain(|b| b.take_storage());
2053 rng.fill_bytes(&mut buf);
2054
2055 let mut um = TreeMap::new(b"l");
2056 let mut hm = BTreeMap::new();
2057 let u = Unstructured::new(&buf);
2058 if let Ok(ops) = Vec::<Op>::arbitrary_take_rest(u) {
2059 for op in ops {
2060 match op {
2061 Op::Insert(k, v) => {
2062 let r1 = um.insert(k, v);
2063 let r2 = hm.insert(k, v);
2064 assert_eq!(r1, r2)
2065 }
2066 Op::Remove(k) => {
2067 let r1 = um.remove(&k);
2068 let r2 = hm.remove(&k);
2069 assert_eq!(r1, r2)
2070 }
2071 Op::Flush => {
2072 um.flush();
2073 }
2074 Op::Restore => {
2075 let serialized = borsh::to_vec(&um).unwrap();
2076 um = TreeMap::deserialize(&mut serialized.as_slice()).unwrap();
2077 }
2078 Op::Get(k) => {
2079 let r1 = um.get(&k);
2080 let r2 = hm.get(&k);
2081 assert_eq!(r1, r2)
2082 }
2083 Op::EntryInsert(k, v) => {
2084 let r1 = um.entry(k).or_insert(v);
2085 let r2 = hm.entry(k).or_insert(v);
2086 assert_eq!(r1, r2)
2087 }
2088 Op::EntryRemove(k) => match (um.entry(k), hm.entry(k)) {
2089 (
2090 Entry::Occupied(o1),
2091 std::collections::btree_map::Entry::Occupied(o2),
2092 ) => {
2093 let r1 = o1.remove();
2094 let r2 = o2.remove();
2095 assert_eq!(r1, r2)
2096 }
2097 (Entry::Vacant(_), std::collections::btree_map::Entry::Vacant(_)) => {}
2098 _ => panic!("inconsistent entry states"),
2099 },
2100 }
2101 }
2102 }
2103 }
2104 }
2105
2106 #[test]
2107 fn issue993() {
2108 fn swap_set<H>(map: &mut TreeMap<(), (), H>)
2109 where
2110 H: ToKey,
2111 {
2112 match map.entry(()) {
2113 Entry::Occupied(o) => {
2114 o.remove();
2115 }
2116 Entry::Vacant(o) => {
2117 o.insert(());
2118 }
2119 };
2120 }
2121
2122 let mut map = TreeMap::new(b"m");
2123 swap_set(&mut map);
2124 assert_eq!(map.tree.root, Some(FreeListIndex(0)));
2125 swap_set(&mut map);
2126 assert_eq!(map.tree.root, None);
2127 swap_set(&mut map);
2130 assert_eq!(map.tree.root, Some(FreeListIndex(0)));
2131 }
2132}