unc_sdk/store/tree_map/
mod.rs

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/// TreeMap based on AVL-tree
26///
27/// Runtime complexity (worst case):
28/// - `get`/`contains_key`:     O(1) - LookupMap lookup
29/// - `insert`/`remove`:        O(log(N))
30/// - `min`/`max`:              O(log(N))
31/// - `above`/`below`:          O(log(N))
32/// - `range` of K elements:    O(Klog(N))
33#[derive(BorshDeserialize, BorshSerialize)]
34pub struct TreeMap<K, V, H = Sha256>
35where
36    K: BorshSerialize + Ord,
37    V: BorshSerialize,
38    H: ToKey,
39{
40    // ser/de is independent of `K`, `V`, `H` ser/de, `BorshSerialize`/`BorshDeserialize` bounds removed
41    #[borsh(bound(serialize = "", deserialize = ""))]
42    values: LookupMap<K, V, H>,
43    // ser/de is independent of `K` ser/de, `BorshSerialize`/`BorshDeserialize` bounds removed
44    #[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    // ser/de is independent of `K` ser/de, `BorshSerialize`/`BorshDeserialize`/`BorshSchema` bounds removed
80    #[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,                     // key stored in a node
104    lft: Option<FreeListIndex>, // left link of a node
105    rgt: Option<FreeListIndex>, // right link of a node
106    ht: u32,                    // height of a subtree at a node
107}
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    /// Initialize new [`TreeMap`] with the prefix provided.
132    ///
133    /// This prefix can be anything that implements [`IntoStorageKey`]. The prefix is used when
134    /// storing and looking up values in storage to ensure no collisions with other collections.
135    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    /// Return the amount of elements inside of the map.
160    pub fn len(&self) -> u32 {
161        self.tree.nodes.len()
162    }
163
164    /// Returns true if there are no elements inside of the map.
165    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    /// Clears the map, removing all key-value pairs. Keeps the allocated memory
177    /// for reuse.
178    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            // Set instead of remove to avoid loading the value from storage.
185            self.values.set(k.key, None);
186        }
187    }
188
189    /// Returns `true` if the map contains a value for the specified key.
190    ///
191    /// The key may be any borrowed form of the map's key type, but
192    /// [`BorshSerialize`] and [`ToOwned<Owned = K>`](ToOwned) on the borrowed form *must* match
193    /// those for the key type.
194    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    /// Returns a reference to the value corresponding to the key.
203    ///
204    /// The key may be any borrowed form of the map's key type, but
205    /// [`BorshSerialize`] and [`ToOwned<Owned = K>`](ToOwned) on the borrowed form *must* match
206    /// those for the key type.
207    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    /// Returns the key-value pair corresponding to the supplied key.
216    ///
217    /// The supplied key may be any borrowed form of the map's key type, but the ordering
218    /// on the borrowed form *must* match the ordering on the key type.
219    ///
220    /// # Examples
221    ///
222    /// ```
223    /// use unc_sdk::store::TreeMap;
224    ///
225    /// let mut map = TreeMap::new(b"t");
226    /// map.insert(1, "a".to_string());
227    /// assert_eq!(map.get_key_value(&1), Some((&1, &"a".to_string())));
228    /// assert_eq!(map.get_key_value(&2), None);
229    /// ```
230    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    /// Returns a mutable reference to the value corresponding to the key.
239    ///
240    /// The key may be any borrowed form of the map's key type, but
241    /// [`BorshSerialize`] and [`ToOwned<Owned = K>`](ToOwned) on the borrowed form *must* match
242    /// those for the key type.
243    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    /// Inserts a key-value pair into the map.
252    ///
253    /// If the map did not have this key present, [`None`] is returned.
254    ///
255    /// If the map did have this key present, the value is updated, and the old
256    /// value is returned. The key is not updated, though; this matters for
257    /// types that can be `==` without being identical.
258    pub fn insert(&mut self, key: K, value: V) -> Option<V>
259    where
260        K: Clone + BorshDeserialize,
261    {
262        // fix pattern when refactor
263        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    /// Removes a key from the map, returning the value at the key if the key
274    /// was previously in the map.
275    ///
276    /// The key may be any borrowed form of the map's key type, but
277    /// [`BorshSerialize`] and [`ToOwned<Owned = K>`](ToOwned) on the borrowed form *must* match
278    /// those for the key type.
279    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    /// Returns the smallest key that is strictly greater than key given as the parameter
302    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    /// Returns the largest key that is strictly less than key given as the parameter
312    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    /// Returns (node, parent node) of left-most lower (min) node starting from given node `at`.
354    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    /// Returns (node, parent node) of right-most lower (max) node starting from given node `at`.
371    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    /// Returns node and parent node and respective metadata for a node that holds the `key`.
460    /// For root node, `None` is returned for the parent and metadata.
461    /// The metadata included in the result includes the indices for the node and parent, as well
462    /// as which edge the found node is of the parent, if one.
463    #[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            // This branch should not be hit, because we check for existence in insert.
518            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    // Calculate and save the height of a subtree at node `at`:
540    // height[at] = 1 + max(height[at.L], height[at.R])
541    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        // This side effect isn't great, but a lot of logic depends on values in storage/cache to be
547        // up to date. Until changes and the tree are kept all in a single data structure, this
548        // will be necessary.
549        *expect(self.nodes.get_mut(id)) = node.clone();
550    }
551
552    // Balance = difference in heights between left and right subtrees at given node.
553    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    // Left rotation of an AVL subtree with at node `at`.
561    // New root of subtree is returned, caller is responsible for updating proper link from parent.
562    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        // at.L = at.L.R
567        node.lft = lft_rgt;
568
569        // at.L.R = at
570        left.rgt = Some(id);
571
572        // at = at.L
573        self.update_height(node, id);
574        self.update_height(&mut left, left_id);
575
576        left_id
577    }
578
579    // Right rotation of an AVL subtree at node in `at`.
580    // New root of subtree is returned, caller is responsible for updating proper link from parent.
581    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        // at.R = at.R.L
586        node.rgt = rgt_lft;
587
588        // at.R.L = at
589        rgt.lft = Some(id);
590
591        // at = at.R
592        self.update_height(node, id);
593        self.update_height(&mut rgt, rgt_id);
594
595        rgt_id
596    }
597
598    // Check balance at a given node and enforce it if necessary with respective rotations.
599    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    // Navigate from root to node holding `key` and backtrace back to the root
622    // enforcing balance (if necessary) along the way.
623    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    // Node holding the key is not removed from the tree - instead the substitute node is found,
645    // the key is copied to 'removed' node from substitute node, and then substitute node gets
646    // removed from the tree.
647    //
648    // The substitute node is either:
649    // - right-most (max) node of the left subtree (containing smaller keys) of node holding `key`
650    // - or left-most (min) node of the right subtree (containing larger keys) of node holding `key`
651    //
652    fn do_remove<Q: ?Sized>(&mut self, key: &Q) -> Option<K>
653    where
654        K: Borrow<Q>,
655        Q: BorshSerialize + Eq + PartialOrd,
656    {
657        // r_node - node containing key of interest
658        // remove_parent - immediate parent node of r_node
659        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, // cannot remove a missing key, no changes to the tree needed
665        };
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            // Node is leaf, can simply remove and rebalance.
672            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                // removing node might have caused a imbalance - balance the tree up to the root,
684                // starting from lowest affected key - the parent of a leaf node in this case.
685                // At this point, we can assume there is a root because there is at least the parent
686                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            // non-leaf node, select subtree to proceed with depending on balance
697            let b = self.get_balance(&r_node);
698            if b >= 0 {
699                // proceed with left subtree
700                let left = expect(lft_opt);
701
702                // k - min key from left subtree
703                // n - node that holds key k, p - immediate parent of n
704                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                    // Min has a parent, attach its left node to the parent before moving
709                    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                    // Update link and move key into removal node location
721                    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                // removing node might have caused an imbalance - balance the tree up to the root,
729                // starting from the lowest affected key (max key from left subtree in this case)
730                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                // proceed with right subtree
739                let rgt = expect(rgt_opt);
740
741                // k - min key from right subtree
742                // n - node that holds key k, p - immediate parent of n
743                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                    // Min has a parent, attach its right node to the parent before moving
748                    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                    // Update link and move key into removal node location
760                    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                // removing node might have caused an imbalance - balance the tree up to the root,
768                // starting from the lowest affected key (max key from left subtree in this case)
769                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    /// An iterator visiting all key-value pairs in arbitrary order.
788    /// The iterator element type is `(&'a K, &'a V)`.
789    pub fn iter(&self) -> Iter<K, V, H>
790    where
791        K: BorshDeserialize,
792    {
793        Iter::new(self)
794    }
795
796    /// An iterator visiting all key-value pairs in arbitrary order,
797    /// with exclusive references to the values.
798    /// The iterator element type is `(&'a K, &'a mut V)`.
799    pub fn iter_mut(&mut self) -> IterMut<K, V, H>
800    where
801        K: BorshDeserialize,
802    {
803        IterMut::new(self)
804    }
805
806    /// An iterator visiting all keys in arbitrary order.
807    /// The iterator element type is `&'a K`.
808    pub fn keys(&self) -> Keys<K>
809    where
810        K: BorshDeserialize,
811    {
812        Keys::new(&self.tree)
813    }
814
815    /// An iterator visiting all values in arbitrary order.
816    /// The iterator element type is `&'a V`.
817    pub fn values(&self) -> Values<K, V, H>
818    where
819        K: BorshDeserialize,
820    {
821        Values::new(self)
822    }
823
824    /// A mutable iterator visiting all values in arbitrary order.
825    /// The iterator element type is `&'a mut V`.
826    pub fn values_mut(&mut self) -> ValuesMut<K, V, H>
827    where
828        K: BorshDeserialize,
829    {
830        ValuesMut::new(self)
831    }
832
833    /// Constructs a double-ended iterator over a sub-range of elements in the map.
834    /// The simplest way is to use the range syntax `min..max`, thus `range(min..max)` will
835    /// yield elements from min (inclusive) to max (exclusive).
836    /// The range may also be entered as `(Bound<T>, Bound<T>)`, so for example
837    /// `range((Excluded(4), Included(10)))` will yield a left-exclusive, right-inclusive
838    /// range from 4 to 10.
839    ///
840    /// # Panics
841    ///
842    /// Panics if range `start > end`.
843    /// Panics if range `start == end` and both bounds are `Excluded`.
844    ///
845    /// # Examples
846    ///
847    /// Basic usage:
848    ///
849    /// ```
850    /// use unc_sdk::store::TreeMap;
851    /// use std::ops::Bound::Included;
852    ///
853    /// let mut map = TreeMap::new(b"t");
854    /// map.insert(3, "a".to_string());
855    /// map.insert(5, "b".to_string());
856    /// map.insert(8, "c".to_string());
857    /// for (key, value) in map.range((Included(&4), Included(&8))) {
858    ///     println!("{}: {}", key, value);
859    /// }
860    /// assert_eq!(Some((&5, &"b".to_string())), map.range(4..).next());
861    /// ```
862    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    /// Constructs a mutable double-ended iterator over a sub-range of elements in the map.
872    /// The simplest way is to use the range syntax `min..max`, thus `range(min..max)` will
873    /// yield elements from min (inclusive) to max (exclusive).
874    /// The range may also be entered as `(Bound<T>, Bound<T>)`, so for example
875    /// `range((Excluded(4), Included(10)))` will yield a left-exclusive, right-inclusive
876    /// range from 4 to 10.
877    ///
878    /// # Panics
879    ///
880    /// Panics if range `start > end`.
881    /// Panics if range `start == end` and both bounds are `Excluded`.
882    ///
883    /// # Examples
884    ///
885    /// Basic usage:
886    ///
887    /// ```
888    /// use unc_sdk::store::TreeMap;
889    ///
890    /// let mut map: TreeMap<i32, i32> = TreeMap::new(b"t");
891    /// map.extend([4, 6, 8, 11]
892    ///     .iter()
893    ///     .map(|&s| (s, 0)));
894    /// for (_, balance) in map.range_mut(6..10) {
895    ///     *balance += 100;
896    /// }
897    /// for (id, balance) in &map {
898    ///     println!("{} => {}", id, balance);
899    /// }
900    /// ```
901    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    /// Removes a key from the map, returning the stored key and value if the
918    /// key was previously in the map.
919    ///
920    /// The key may be any borrowed form of the map's key type, but
921    /// [`BorshSerialize`] and [`ToOwned<Owned = K>`](ToOwned) on the borrowed form *must* match
922    /// those for the key type.
923    ///
924    /// # Examples
925    ///
926    /// ```
927    /// use unc_sdk::store::TreeMap;
928    ///
929    /// let mut map = TreeMap::new(b"m");
930    /// map.insert(1, "a".to_string());
931    /// assert_eq!(map.remove(&1), Some("a".to_string()));
932    /// assert_eq!(map.remove(&1), None);
933    /// ```
934    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    /// Gets the given key's corresponding entry in the map for in-place manipulation.
946    /// ```
947    /// use unc_sdk::store::TreeMap;
948    ///
949    /// let mut count = TreeMap::new(b"m");
950    ///
951    /// for ch in [7, 2, 4, 7, 4, 1, 7] {
952    ///     let counter = count.entry(ch).or_insert(0);
953    ///     *counter += 1;
954    /// }
955    ///
956    /// assert_eq!(count[&4], 2);
957    /// assert_eq!(count[&7], 3);
958    /// assert_eq!(count[&1], 1);
959    /// assert_eq!(count.get(&8), None);
960    /// ```
961    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    /// Flushes the intermediate values of the map before this is called when the structure is
976    /// [`Drop`]ed. This will write all modified values to storage but keep all cached values
977    /// in memory.
978    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    /// Return height of the tree - number of nodes on the longest path starting from the root node.
1000    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        // h <= C * log2(n + D) + B
1024        // where:
1025        // C =~ 1.440, D =~ 1.065, B =~ 0.328
1026        // (source: https://en.wikipedia.org/wiki/AVL_tree)
1027        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            // tree size is 2^k
1159            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]
1178    // fn test_min() {
1179    //     let n: u32 = 30;
1180    //     let vec = random(n);
1181
1182    //     let mut map: TreeMap<u32, u32> = TreeMap::new(b't');
1183    //     for x in vec.iter().rev().copied() {
1184    //         map.insert(x, 1);
1185    //     }
1186
1187    //     assert_eq!(map.min().unwrap(), *vec.iter().min().unwrap());
1188    //     map.clear();
1189    // }
1190
1191    #[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        // Test custom iterator impls
1604        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        // Test custom iterator impls
1629        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        // Test custom iterator impls
1667        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        // Test custom iterator impls
1711        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        ); // the range makes no sense, but `BTreeMap` does not panic in this case
1781
1782        // Test custom iterator impls
1783        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    //
1815    // Property-based tests of AVL-based TreeMap against std::collections::BTreeMap
1816    //
1817
1818    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            // (Excluded(x), Excluded(x)) is invalid range, checking against it makes no sense
1977            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        // Try getting entry of filled value
1998        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        // Check fused iterator assumption that each following one will be None
2021        assert_eq!(iter.next(), None);
2022
2023        // Double all values
2024        map.values_mut().for_each(|v| {
2025            *v *= 2;
2026        });
2027        assert_eq!(map.values().collect::<Vec<_>>(), [&0, &4, &6]);
2028
2029        // Collect all keys
2030        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            // Clear storage in-between runs
2052            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        // This line previously panicked because the entry was removed without updating the tree
2128        // root.
2129        swap_set(&mut map);
2130        assert_eq!(map.tree.root, Some(FreeListIndex(0)));
2131    }
2132}