immutable_map/
map.rs

1use std::borrow::Borrow;
2use std::cmp::Ordering;
3use std::fmt;
4use std::fmt::Debug;
5use std::iter::FromIterator;
6use std::ops::Index;
7use std::rc::Rc;
8
9use Bound;
10
11use tree;
12use tree::TreeNode;
13
14/// An immutable key-value map based on weight-balanced binary tree.
15/// See https://yoichihirai.com/bst.pdf for the balancing algorithm.
16///
17/// # Examples
18///
19/// ```
20/// use immutable_map::TreeMap;
21///
22/// let map_0 = TreeMap::new();
23///
24/// // `insert` returns new copies with the given key and value inserted, and does not change
25/// // the original map
26/// let map_1 = map_0.insert(3, "Three");
27/// let map_2 = map_1.insert(4, "Four");
28///
29/// assert_eq!(false, map_1.contains_key(&4));
30/// assert_eq!(true, map_2.contains_key(&4));
31///
32/// assert_eq!("Four", map_2[&4]);
33/// ```
34#[derive(Clone, Default)]
35pub struct TreeMap<K, V> {
36    root: Option<Rc<TreeNode<K, V>>>
37}
38
39pub type TreeMapIter<'r, K, V> = tree::Iter<'r, K, V>;
40pub type TreeMapRevIter<'r, K, V> = tree::RevIter<'r, K, V>;
41pub type TreeMapRange<'r, K, V> = tree::Range<'r, K, V>;
42pub type TreeMapKeys<'r, K, V> = tree::Keys<tree::Iter<'r, K, V>>;
43pub type TreeMapValues<'r, K, V> = tree::Values<tree::Iter<'r, K, V>>;
44
45impl<K, V> TreeMap<K, V> {
46    /// Makes a new empty TreeMap
47    ///
48    /// # Examples
49    ///
50    /// ```
51    /// use immutable_map::TreeMap;
52    ///
53    /// let map = TreeMap::new();
54    /// let new_map = map.insert("One", 1);
55    /// ```
56    pub fn new() -> TreeMap<K, V> {
57        TreeMap { root: None }
58    }
59
60    /// Returns the number of elements in the map.
61    ///
62    /// # Examples
63    ///
64    /// ```
65    /// use immutable_map::TreeMap;
66    ///
67    /// let map = TreeMap::new().insert(1, "One").insert(2, "Two");
68    /// assert_eq!(2, map.len());
69    /// ```
70    pub fn len(&self) -> usize {
71        tree::size(&self.root)
72    }
73
74    /// Returns true if the map contains no elements.
75    ///
76    /// # Examples
77    ///
78    /// ```
79    /// use immutable_map::TreeMap;
80    ///
81    /// let empty_map = TreeMap::new();
82    /// let new_map = empty_map.insert(1, "One");
83    ///
84    /// assert_eq!(true, empty_map.is_empty());
85    /// assert_eq!(false, new_map.is_empty());
86    /// ```
87    pub fn is_empty(&self) -> bool {
88        self.root.is_none()
89    }
90
91    /// Gets an iterator over the entries of the map, sorted by key.
92    ///
93    /// # Examples
94    ///
95    /// ```
96    /// use immutable_map::TreeMap;
97    ///
98    /// let map = TreeMap::new().insert(2, "Two").insert(3, "Three").insert(1, "One");
99    ///
100    /// for (key, value) in map.iter() {
101    ///     println!("{}: {}", key, value);
102    /// }
103    ///
104    /// let (first_key, first_value) = map.iter().next().unwrap();
105    /// assert_eq!((1, "One"), (*first_key, *first_value));
106    /// ```
107    pub fn iter<'r>(&'r self) -> TreeMapIter<'r, K, V> {
108        tree::Iter::new(&self.root)
109    }
110
111    /// Gets an iterator over the entries of the map, sorted by key in decreasing order.
112    ///
113    /// # Examples
114    ///
115    /// ```
116    /// use immutable_map::TreeMap;
117    ///
118    /// let map = TreeMap::new().insert(2, "Two").insert(3, "Three").insert(1, "One");
119    ///
120    /// for (key, value) in map.rev_iter() {
121    ///     println!("{}: {}", key, value);
122    /// }
123    ///
124    /// let (first_key, first_value) = map.rev_iter().next().unwrap();
125    /// assert_eq!((3, "Three"), (*first_key, *first_value));
126    /// ```
127    pub fn rev_iter<'r>(&'r self) -> TreeMapRevIter<'r, K, V> {
128        tree::RevIter::new(&self.root)
129    }
130
131    /// Gets an iterator over the keys of the map, in increasing order.
132    ///
133    /// # Examples
134    ///
135    /// ```
136    /// use immutable_map::TreeMap;
137    ///
138    /// let map = TreeMap::new().insert(2, "Two").insert(3, "Three").insert(1, "One");
139    ///
140    /// for key in map.keys() {
141    ///     println!("{}", key);
142    /// }
143    ///
144    /// let first_key = map.keys().next().unwrap();
145    /// assert_eq!(1, *first_key);
146    /// ```
147    pub fn keys<'r>(&'r self) -> TreeMapKeys<'r, K, V> {
148        tree::Keys::new(tree::Iter::new(&self.root))
149    }
150
151    /// Gets an iterator over the values of the map, ordered by key.
152    ///
153    /// # Examples
154    ///
155    /// ```
156    /// use immutable_map::TreeMap;
157    ///
158    /// let map = TreeMap::new().insert(2, "Two").insert(3, "Three").insert(1, "One");
159    ///
160    /// for value in map.values() {
161    ///     println!("{}", value);
162    /// }
163    ///
164    /// let first_value = map.values().next().unwrap();
165    /// assert_eq!("One", *first_value);
166    /// ```
167    pub fn values<'r>(&'r self) -> TreeMapValues<'r, K, V> {
168        tree::Values::new(tree::Iter::new(&self.root))
169    }
170}
171
172impl<K, V> TreeMap<K, V> where K: Ord {
173    /// Returns a reference to the value corresponding to the key.
174    ///
175    /// The key may be any borrowed form of the map's key type, but the ordering on the borrowed
176    /// form must match the ordering on the key type.
177    ///
178    /// # Examples
179    ///
180    /// ```
181    /// use immutable_map::TreeMap;
182    ///
183    /// let map = TreeMap::new().insert(1, "One");
184    ///
185    /// assert_eq!(map.get(&1), Some(&"One"));
186    /// assert_eq!(map.get(&2), None);
187    /// ```
188    pub fn get<Q: ?Sized + Ord>(&self, key: &Q) -> Option<&V>
189        where K: Borrow<Q>
190    {
191        fn f<'r, K, V, Q: ?Sized + Ord>(node: &'r Option<Rc<TreeNode<K, V>>>, key: &Q)
192                -> Option<&'r V> where K: Borrow<Q>
193        {
194            tree::find_exact(node, |k| key.cmp(k.borrow())).map(|p| &p.1)
195        }
196
197        f(&self.root, key)
198    }
199
200    /// Returns true if the map contains given key
201    ///
202    /// The key may be any borrowed form of the map's key type, but the ordering on the borrowed
203    /// form must match the ordering on the key type.
204    ///
205    /// # Examples
206    ///
207    /// ```
208    /// use immutable_map::TreeMap;
209    ///
210    /// let map = TreeMap::new().insert(1, "One");
211    ///
212    /// assert_eq!(true, map.contains_key(&1));
213    /// assert_eq!(false, map.contains_key(&2));
214    /// ```
215    pub fn contains_key<Q: ?Sized + Ord>(&self, key: &Q) -> bool
216        where K: Borrow<Q>
217    {
218        self.get(key).is_some()
219    }
220
221    /// Constructs a double-ended iterator over a sub-range of elements in the map, starting at
222    /// min, and ending at max. If min is Unbounded, then it will be treated as "negative
223    /// infinity", and if max is Unbounded, then it will be treated as "positive infinity". Thus
224    /// range(Unbounded, Unbounded) will yield the whole collection.
225    ///
226    /// # Examples
227    ///
228    /// ```
229    /// use immutable_map::TreeMap;
230    /// use immutable_map::Bound::*;
231    ///
232    /// let map = TreeMap::new().insert(8, "Eight").insert(3, "Three").insert(5, "Five");
233    ///
234    /// for (key, value) in map.range(Included(&4), Included(&8)) {
235    ///     println!("{}: {}", key, value);
236    /// }
237    ///
238    /// let pairs: Vec<_> = map.range(Included(&4), Included(&8)).map(|(k, v)| (*k, *v)).collect();
239    ///
240    /// assert_eq!(pairs, [(5, "Five"), (8, "Eight")]);
241    /// ```
242    pub fn range<'r, Q: Ord>(&'r self, min: Bound<&Q>, max: Bound<&Q>) -> TreeMapRange<'r, K, V>
243        where K: Borrow<Q>
244    {
245        tree::Range::new(&self.root, min, max)
246    }
247}
248
249impl<K, V> TreeMap<K, V> where K: Clone + Ord, V: Clone {
250    /// Return a new copy of `TreeMap` with the key-value pair inserted
251    ///
252    /// If the map already has the key, the key-value pair is replaced in the new map
253    ///
254    /// # Examples
255    ///
256    /// ```
257    /// use immutable_map::TreeMap;
258    ///
259    /// let map = TreeMap::new();
260    ///
261    /// assert_eq!(false, map.contains_key(&1));
262    /// assert_eq!(None, map.get(&1));
263    ///
264    /// let new_map = map.insert(1, "One");
265    ///
266    /// assert_eq!(true, new_map.contains_key(&1));
267    /// assert_eq!(Some(&"One"), new_map.get(&1));
268    /// ```
269    pub fn insert(&self, key: K, value: V) -> TreeMap<K, V>
270    {
271        let root = tree::insert(&self.root, (key, value));
272        TreeMap { root: Some(Rc::new(root)) }
273    }
274
275    /// Return a new copy of `TreeMap` with the key-value pair inserted.
276    ///
277    /// Returns `None` if the map already has the key
278    ///
279    /// # Examples
280    ///
281    /// ```
282    /// use immutable_map::TreeMap;
283    ///
284    /// let map = TreeMap::new().insert(2, "Two").insert(3, "Three");
285    ///
286    /// assert_eq!(None, map.insert_if_absent(2, "Zwei"));
287    ///
288    /// let new_map = map.insert_if_absent(1, "One").unwrap();
289    ///
290    /// assert_eq!(Some(&"One"), new_map.get(&1));
291    /// ```
292    pub fn insert_if_absent(&self, key: K, value: V) -> Option<TreeMap<K, V>>
293    {
294        tree::insert_if_absent(&self.root, (key, value)).map(|root|
295            TreeMap { root: Some(Rc::new(root)) }
296        )
297    }
298
299    /// Find the map with given key, and if the key is found, udpate the value with the provided
300    /// function `f`, and return the new map. Returns `None` if the map already has the key.
301    ///
302    /// When the key is found in the map, function `f` is called, and the value is updated with
303    /// the return value of `f`.
304    ///
305    /// The key may be any borrowed form of the map's key type, but the ordering on the borrowed
306    /// form must match the ordering on the key type.
307    ///
308    /// # Examples
309    ///
310    /// ```
311    /// use immutable_map::TreeMap;
312    ///
313    /// let map = TreeMap::new().insert("Two".to_string(), 2).insert("Three".to_string(), 3);
314    ///
315    /// // returns `None` because the key "One" is not in the map
316    /// assert_eq!(None, map.update("One", |v| v+1));
317    ///
318    /// let map_1 = map.update("Two", |v| v+10).unwrap();
319    /// // the value is updated
320    /// assert_eq!(Some(&12), map_1.get("Two"));
321    /// ```
322    pub fn update<Q: ?Sized + Ord, F>(&self, key: &Q, f: F) -> Option<TreeMap<K, V>>
323        where K: Borrow<Q>, F: FnMut(&V) -> V
324    {
325        match self.root {
326            Some(ref root) =>
327                tree::update(root, key, f).map(|new_root|
328                    TreeMap { root: Some(Rc::new(new_root)) }
329                ),
330            None =>
331                None
332        }
333    }
334
335    /// Find the map with given key, and if the key is found, udpate the value with the provided
336    /// function `f`, and return the new map. If the key is not found, insert the key-value pair
337    /// to the map and return it.
338    ///
339    /// # Examples
340    ///
341    /// ```
342    /// use immutable_map::TreeMap;
343    ///
344    /// let map = TreeMap::new().insert("One", 1).insert("Three", 3);
345    ///
346    /// // The new pair ("Two", 2) is inserted
347    /// let map_1 = map.insert_or_update("Two", 2, |v| v + 10);
348    /// assert_eq!(Some(&2), map_1.get("Two"));
349    ///
350    /// // The ("Two", 2) pair is updated to ("Two", 2 + 10)
351    /// let map_2 = map_1.insert_or_update("Two", 2, |v| v + 10);
352    /// assert_eq!(Some(&12), map_2.get("Two"));
353    /// ```
354    pub fn insert_or_update<F>(&self, key: K, value: V, f: F) -> TreeMap<K, V>
355        where F: FnMut(&V) -> V
356    {
357        TreeMap { root: Some(Rc::new(tree::insert_or_update(&self.root, key, value, f))) }
358    }
359
360    /// Remove the smallest key-value pair from the map, and returns the modified copy.
361    ///
362    /// Returns `None` if the original map was empty.
363    ///
364    /// # Examples
365    ///
366    /// ```
367    /// use immutable_map::TreeMap;
368    ///
369    /// let empty_map = TreeMap::new();
370    /// assert_eq!(None, empty_map.delete_min());
371    ///
372    /// let map = empty_map.insert(2, "Two").insert(3, "Three").insert(1, "One");
373    ///
374    /// let (new_map, pair) = map.delete_min().unwrap();
375    ///
376    /// assert_eq!(None, new_map.get(&1));
377    /// assert_eq!((&1, &"One"), pair);
378    /// ```
379    pub fn delete_min(&self) -> Option<(TreeMap<K, V>, (&K, &V))>
380    {
381        if let Some(ref root) = self.root {
382            let (new_root, v) = tree::delete_min(&root);
383            Some((
384                TreeMap { root: new_root },
385                (&v.0, &v.1)
386            ))
387        } else {
388            None
389        }
390    }
391
392    /// Remove the largest key-value pair from the map, and returns the modified copy.
393    ///
394    /// Returns `None` if the original map was empty.
395    ///
396    /// # Examples
397    ///
398    /// ```
399    /// use immutable_map::TreeMap;
400    ///
401    /// let empty_map = TreeMap::new();
402    /// assert_eq!(None, empty_map.delete_max());
403    ///
404    /// let map = empty_map.insert(2, "Two").insert(3, "Three").insert(1, "One");
405    ///
406    /// let (new_map, pair) = map.delete_max().unwrap();
407    ///
408    /// assert_eq!(None, new_map.get(&3));
409    /// assert_eq!((&3, &"Three"), pair);
410    /// ```
411    pub fn delete_max(&self) -> Option<(TreeMap<K, V>, (&K, &V))>
412    {
413        if let Some(ref root) = self.root {
414            let (new_root, v) = tree::delete_max(&root);
415            Some((
416                TreeMap { root: new_root },
417                (&v.0, &v.1)
418            ))
419        } else {
420            None
421        }
422    }
423
424    /// Remove the key from the map
425    ///
426    /// Returns `None` if the original map did not contain the key
427    ///
428    /// The key may be any borrowed form of the map's key type, but the ordering on the borrowed
429    /// form must match the ordering on the key type.
430    ///
431    /// # Examples
432    ///
433    /// ```
434    /// use immutable_map::TreeMap;
435    ///
436    /// let empty_map = TreeMap::new();
437    /// assert_eq!(None, empty_map.remove(&2));
438    ///
439    /// let map = empty_map.insert(2, "Two").insert(3, "Three").insert(1, "One");
440    ///
441    /// let (new_map, pair) = map.remove(&2).unwrap();
442    ///
443    /// assert_eq!(None, new_map.get(&2));
444    /// assert_eq!(&"Two", pair);
445    /// ```
446    pub fn remove<Q: ?Sized + Ord>(&self, key: &Q) -> Option<(TreeMap<K, V>, &V)>
447        where K: Borrow<Q>
448    {
449        tree::remove(&self.root, key).map(|(new_root, v)|
450            (TreeMap { root: new_root }, &v.1)
451        )
452    }
453}
454
455impl<K: Debug + Ord, V: Debug> Debug for TreeMap<K, V> {
456    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
457        f.debug_map().entries(self.iter()).finish()
458    }
459}
460
461impl<'r, K: Ord, V> IntoIterator for &'r TreeMap<K, V> {
462    type Item = (&'r K, &'r V);
463    type IntoIter = TreeMapIter<'r, K, V>;
464
465    fn into_iter(self) -> TreeMapIter<'r, K, V> {
466        self.iter()
467    }
468}
469
470impl<K: PartialEq, V: PartialEq> PartialEq for TreeMap<K, V> {
471    fn eq(&self, other: &TreeMap<K, V>) -> bool {
472        self.len() == other.len()
473            && self.iter().zip(other.iter()).all(|(a, b)| a == b)
474    }
475}
476
477impl<K: Eq, V: Eq> Eq for TreeMap<K, V> {}
478
479impl <K: PartialOrd, V: PartialOrd> PartialOrd for TreeMap<K, V> {
480    fn partial_cmp(&self, other: &TreeMap<K, V>) -> Option<Ordering> {
481        self.iter().partial_cmp(other.iter())
482    }
483}
484
485impl <K: Ord, V: Ord> Ord for TreeMap<K, V> {
486    fn cmp(&self, other: &TreeMap<K, V>) -> Ordering {
487        self.iter().cmp(other.iter())
488    }
489}
490
491impl <'a, K: Ord, Q: ?Sized, V> Index<&'a Q> for TreeMap<K, V>
492    where K: Borrow<Q>, Q: Ord
493{
494    type Output = V;
495
496    fn index(&self, key: &Q) -> &V {
497        self.get(key).expect("no entry found for key")
498    }
499}
500
501impl <K: Ord + Clone, V: Clone> FromIterator<(K, V)> for TreeMap<K, V> {
502    fn from_iter<T>(iter: T) -> TreeMap<K, V> where T: IntoIterator<Item=(K, V)> {
503        let mut m = TreeMap::new();
504        for (k, v) in iter {
505            m = m.insert(k, v);
506        }
507        m
508    }
509}
510
511#[cfg(test)]
512mod test {
513    use tree::balanced;
514
515    use super::TreeMap;
516    use Bound;
517
518    #[test]
519    fn test_insert() {
520        let r0 = TreeMap::new();
521        let r1 = r0.insert(4, 'd');
522        let r2 = r1.insert(7, 'g');
523        let r3 = r2.insert(12, 'l');
524        let r4 = r3.insert(15, 'o');
525        let r5 = r4.insert(3, 'c');
526        let r6 = r5.insert(5, 'e');
527        let r7 = r6.insert(14, 'n');
528        let r8 = r7.insert(18, 'r');
529        let r9 = r8.insert(16, 'p');
530        let r10 = r9.insert(17, 'q');
531
532        let expected = vec![
533            (3, 'c'), (4, 'd'), (5, 'e'), (7, 'g'),
534            (12, 'l'), (14, 'n'), (15, 'o'), (16, 'p'),
535            (17, 'q'), (18, 'r')
536        ];
537
538        let res: Vec<_> = r10.iter().map(|(&k, &v)| (k, v)).collect();
539
540        assert_eq!(expected, res);
541        assert_eq!(10, r10.len());
542        assert!(balanced(&r10.root));
543        assert!(r10.contains_key(&12));
544    }
545
546    #[test]
547    fn test_delete_min() {
548        let r0 = TreeMap::new();
549        let r1 = r0.insert(4, 'd');
550        let r2 = r1.insert(7, 'g');
551        let r3 = r2.insert(12, 'l');
552        let r4 = r3.insert(15, 'o');
553        let r5 = r4.insert(3, 'c');
554        let r6 = r5.insert(5, 'e');
555        let (r7, v) = r6.delete_min().unwrap();
556
557        let expected = vec![(4, 'd'), (5, 'e'), (7, 'g'), (12, 'l'), (15, 'o')];
558        let res: Vec<_> = r7.iter().map(|(&k, &v)| (k, v)).collect();
559
560        assert_eq!(expected, res);
561        assert_eq!((&3, &'c'), v);
562    }
563
564    #[test]
565    fn test_delete_max() {
566        let r0 = TreeMap::new();
567        let r1 = r0.insert(4, 'd');
568        let r2 = r1.insert(7, 'g');
569        let r3 = r2.insert(12, 'l');
570        let r4 = r3.insert(15, 'o');
571        let r5 = r4.insert(3, 'c');
572        let r6 = r5.insert(5, 'e');
573        let (r7, v) = r6.delete_max().unwrap();
574
575        let expected = vec![(3, 'c'), (4, 'd'), (5, 'e'), (7, 'g'), (12, 'l')];
576        let res: Vec<_> = r7.iter().map(|(&k, &v)| (k, v)).collect();
577
578        assert_eq!(expected, res);
579        assert_eq!((&15, &'o'), v);
580    }
581
582    #[test]
583    fn test_remove() {
584        let r0 = TreeMap::new();
585        let r1 = r0.insert(4, 'd');
586        let r2 = r1.insert(7, 'g');
587        let r3 = r2.insert(12, 'l');
588        let r4 = r3.insert(15, 'o');
589        let r5 = r4.insert(3, 'c');
590        let r6 = r5.insert(5, 'e');
591        let (r7, v) = r6.remove(&7).unwrap();
592
593        let expected = vec![(3, 'c'), (4, 'd'), (5, 'e'), (12, 'l'), (15, 'o')];
594        let res: Vec<_> = r7.iter().map(|(&k, &v)| (k, v)).collect();
595
596        assert_eq!(expected, res);
597        assert_eq!(&'g', v);
598    }
599
600    #[test]
601    fn test_iter() {
602        let r0 = TreeMap::new();
603        let r1 = r0.insert(4, 'd');
604        let r2 = r1.insert(7, 'g');
605        let r3 = r2.insert(12, 'l');
606        let r4 = r3.insert(15, 'o');
607        let r5 = r4.insert(3, 'c');
608        let r6 = r5.insert(5, 'e');
609        let r7 = r6.insert(14, 'n');
610        let r8 = r7.insert(18, 'r');
611        let r9 = r8.insert(16, 'p');
612        let r10 = r9.insert(17, 'q');
613
614        let expected = vec![
615            (3, 'c'), (4, 'd'), (5, 'e'), (7, 'g'),
616            (12, 'l'), (14, 'n'), (15, 'o'), (16, 'p'),
617            (17, 'q'), (18, 'r')
618        ];
619
620        let res: Vec<_> = r10.iter().map(|(&k, &v)| (k, v)).collect();
621
622        assert_eq!(expected, res);
623
624        assert_eq!((10, Some(10)), r10.iter().size_hint());
625    }
626
627    #[test]
628    fn test_rev_iter() {
629        let r0 = TreeMap::new();
630        let r1 = r0.insert(4, 'd');
631        let r2 = r1.insert(7, 'g');
632        let r3 = r2.insert(12, 'l');
633        let r4 = r3.insert(15, 'o');
634        let r5 = r4.insert(3, 'c');
635        let r6 = r5.insert(5, 'e');
636        let r7 = r6.insert(14, 'n');
637        let r8 = r7.insert(18, 'r');
638        let r9 = r8.insert(16, 'p');
639        let r10 = r9.insert(17, 'q');
640
641        let expected = vec![
642            (18, 'r'), (17, 'q'),
643            (16, 'p'), (15, 'o'), (14, 'n'), (12, 'l'),
644            (7, 'g'), (5, 'e'), (4, 'd'), (3, 'c')
645        ];
646
647        let res: Vec<_> = r10.rev_iter().map(|(&k, &v)| (k, v)).collect();
648
649        assert_eq!(expected, res);
650
651        assert_eq!((10, Some(10)), r10.rev_iter().size_hint());
652    }
653
654    #[test]
655    fn test_is_empty() {
656        let r0 = TreeMap::new();
657        let r1 = r0.insert(4, 'd');
658        let r2 = r1.insert(7, 'g');
659
660        assert!(r0.is_empty());
661        assert!(!r1.is_empty());
662        assert!(!r2.is_empty());
663    }
664
665    #[test]
666    fn test_range() {
667        let r0 = TreeMap::new();
668        let r1 = r0.insert(4, 'd');
669        let r2 = r1.insert(7, 'g');
670        let r3 = r2.insert(12, 'l');
671        let r4 = r3.insert(15, 'o');
672        let r5 = r4.insert(3, 'c');
673        let r6 = r5.insert(5, 'e');
674        let r7 = r6.insert(14, 'n');
675        let r8 = r7.insert(18, 'r');
676        let r9 = r8.insert(16, 'p');
677        let r10 = r9.insert(17, 'q');
678
679        let expected = vec![(7, 'g'), (12, 'l'), (14, 'n'), (15, 'o'), (16, 'p')];
680
681        let res: Vec<_> = r10.range(Bound::Included(&6), Bound::Excluded(&17))
682                             .map(|(&k, &v)| (k, v))
683                             .collect();
684
685        assert_eq!(expected, res);
686    }
687
688    #[test]
689    fn test_range_rev() {
690        let r0 = TreeMap::new();
691        let r1 = r0.insert(4, 'd');
692        let r2 = r1.insert(7, 'g');
693        let r3 = r2.insert(12, 'l');
694        let r4 = r3.insert(15, 'o');
695        let r5 = r4.insert(3, 'c');
696        let r6 = r5.insert(5, 'e');
697        let r7 = r6.insert(14, 'n');
698        let r8 = r7.insert(18, 'r');
699        let r9 = r8.insert(16, 'p');
700        let r10 = r9.insert(17, 'q');
701
702        let expected = vec![(16, 'p'), (15, 'o'), (14, 'n'), (12, 'l'), (7, 'g')];
703
704        let res: Vec<_> = r10.range(Bound::Included(&6), Bound::Excluded(&17))
705                             .rev()
706                             .map(|(&k, &v)| (k, v))
707                             .collect();
708
709        assert_eq!(expected, res);
710    }
711
712    #[test]
713    fn test_debug() {
714        let r0 = TreeMap::new();
715        let r1 = r0.insert(7, 'g');
716        let r2 = r1.insert(4, 'd');
717
718        assert_eq!("{4: 'd', 7: 'g'}", &format!("{:?}", r2));
719    }
720}
721
722#[cfg(test)]
723mod quickcheck {
724    use map::TreeMap;
725    use Bound;
726
727    use quickcheck::TestResult;
728    use rand::{Rng, StdRng};
729
730    fn filter_input<K: PartialEq, V>(input: Vec<(K, V)>) -> Vec<(K, V)> {
731        let mut res: Vec<(K, V)> = Vec::new();
732
733        for (k, v) in input {
734            if res.iter().all(|pair| pair.0 != k) {
735                res.push((k, v));
736            }
737        }
738
739        res
740    }
741
742    quickcheck! {
743        fn check_length(xs: Vec<(isize, char)>) -> bool {
744            let input = filter_input(xs);
745            let m: TreeMap<isize, char> = input.iter().cloned().collect();
746
747            m.len() == input.len()
748        }
749    }
750
751    quickcheck! {
752        fn check_is_empty(xs: Vec<(isize, char)>) -> bool {
753            let input = filter_input(xs);
754            let m: TreeMap<isize, char> = input.iter().cloned().collect();
755
756            m.is_empty() == input.is_empty()
757        }
758    }
759
760    quickcheck! {
761        fn check_iter(xs: Vec<(isize, char)>) -> bool {
762            let mut input = filter_input(xs);
763            let m: TreeMap<isize, char> = input.iter().cloned().collect();
764
765            input.sort();
766
767            let collected: Vec<(isize, char)> = m.iter().map(|(&k, &v)| (k, v)).collect();
768
769            collected == input
770        }
771    }
772
773    quickcheck! {
774        fn check_iter_size_hint(xs: Vec<(isize, char)>) -> bool {
775            let input = filter_input(xs);
776            let m: TreeMap<isize, char> = input.iter().cloned().collect();
777
778            let n = m.len();
779            m.iter().size_hint() == (n, Some(n))
780        }
781    }
782
783    quickcheck! {
784        fn check_rev_iter(xs: Vec<(isize, char)>) -> bool {
785            let mut input = filter_input(xs);
786            let m: TreeMap<isize, char> = input.iter().cloned().collect();
787
788            input.sort();
789            input.reverse();
790
791            let collected: Vec<(isize, char)> = m.rev_iter().map(|(&k, &v)| (k, v)).collect();
792
793            collected == input
794        }
795    }
796
797    quickcheck! {
798        fn check_get(xs: Vec<(isize, char)>) -> bool {
799            let input = filter_input(xs);
800            let m: TreeMap<isize, char> = input.iter().cloned().collect();
801
802            input.into_iter().all(|(k, v)| m.get(&k) == Some(&v))
803        }
804    }
805
806    quickcheck! {
807        fn check_remove(xs: Vec<(isize, char)>) -> TestResult {
808            if xs.is_empty() {
809                return TestResult::discard();
810            }
811
812            let input = filter_input(xs);
813            let m: TreeMap<isize, char> = input.iter().cloned().collect();
814            let mut rng = StdRng::new().unwrap();
815
816            let &(k, v) = rng.choose(&input).unwrap();
817
818            if let Some((m_removed, removed_value)) = m.remove(&k) {
819                TestResult::from_bool(
820                    m_removed.len() == m.len() - 1 && removed_value == &v
821                )
822            } else {
823                TestResult::failed()
824            }
825        }
826    }
827
828    quickcheck! {
829        fn check_remove_all(xs: Vec<(isize, char)>) -> bool {
830            let input = filter_input(xs);
831            let mut m: TreeMap<isize, char> = input.iter().cloned().collect();
832            let mut rng = StdRng::new().unwrap();
833            let mut remove_list = input.clone();
834            rng.shuffle(&mut remove_list);
835
836            for (k, _) in remove_list {
837                let new_m = if let Some((m_removed, _)) = m.remove(&k) {
838                    m_removed
839                } else {
840                    return false;
841                };
842                m = new_m;
843                if m.contains_key(&k) {
844                    return false;
845                }
846            }
847
848            m.is_empty()
849        }
850    }
851
852    quickcheck! {
853        fn check_delete_min(xs: Vec<(isize, char)>) -> bool {
854            let input = filter_input(xs);
855            let m: TreeMap<isize, char> = input.iter().cloned().collect();
856
857            if let Some((m_removed, (&k, _))) = m.delete_min() {
858                m_removed.len() == m.len() - 1 && Some(k) == input.into_iter().min().map(|pair| pair.0)
859            } else {
860                true
861            }
862        }
863    }
864
865    quickcheck! {
866        fn check_delete_max(xs: Vec<(isize, char)>) -> bool {
867            let input = filter_input(xs);
868            let m: TreeMap<isize, char> = input.iter().cloned().collect();
869
870            if let Some((m_removed, (&k, _))) = m.delete_max() {
871                m_removed.len() == m.len() - 1 && Some(k) == input.into_iter().max().map(|pair| pair.0)
872            } else {
873                true
874            }
875        }
876    }
877
878    fn match_bound<T: Ord>(x: &T, min: &Bound<T>, max: &Bound<T>) -> bool {
879        let min_match = match *min {
880            Bound::Unbounded => true,
881            Bound::Included(ref lower) => lower <= x,
882            Bound::Excluded(ref lower) => lower < x
883        };
884
885        let max_match = match *max {
886            Bound::Unbounded => true,
887            Bound::Included(ref upper) => x <= upper,
888            Bound::Excluded(ref upper) => x < upper
889        };
890
891        min_match && max_match
892    }
893
894    quickcheck! {
895        fn check_range(xs: Vec<(isize, char)>,
896                       min_bound: Bound<isize>,
897                       max_bound: Bound<isize>)
898                -> bool
899        {
900            let input = filter_input(xs);
901            let m: TreeMap<isize, char> = input.iter().cloned().collect();
902
903            let min = match min_bound {
904                Bound::Unbounded => Bound::Unbounded,
905                Bound::Included(ref s) => Bound::Included(s),
906                Bound::Excluded(ref s) => Bound::Excluded(s),
907            };
908
909            let max = match max_bound {
910                Bound::Unbounded => Bound::Unbounded,
911                Bound::Included(ref s) => Bound::Included(s),
912                Bound::Excluded(ref s) => Bound::Excluded(s),
913            };
914
915            let res: Vec<(isize, char)> = m.range(min, max).map(|(&k, &v)| (k, v)).collect();
916
917            for window in res.windows(2) {
918                let (k0, _) = window[0];
919                let (k1, _) = window[1];
920                if k0 >= k1 {
921                    return false;
922                }
923            }
924
925            for (k, _) in input {
926                let is_match = match_bound(&k, &min_bound, &max_bound);
927                let is_res = res.iter().any(|pair| pair.0 == k);
928
929                if is_match != is_res {
930                    return false;
931                }
932            }
933
934            true
935        }
936    }
937
938    quickcheck! {
939        fn check_range_rev(xs: Vec<(isize, char)>,
940                           min_bound: Bound<isize>,
941                           max_bound: Bound<isize>)
942                -> bool
943        {
944            let input = filter_input(xs);
945            let m: TreeMap<isize, char> = input.iter().cloned().collect();
946
947            let min = match min_bound {
948                Bound::Unbounded => Bound::Unbounded,
949                Bound::Included(ref s) => Bound::Included(s),
950                Bound::Excluded(ref s) => Bound::Excluded(s),
951            };
952
953            let max = match max_bound {
954                Bound::Unbounded => Bound::Unbounded,
955                Bound::Included(ref s) => Bound::Included(s),
956                Bound::Excluded(ref s) => Bound::Excluded(s),
957            };
958
959            let res: Vec<(isize, char)> = m.range(min, max).rev().map(|(&k, &v)| (k, v)).collect();
960
961            for window in res.windows(2) {
962                let (k0, _) = window[0];
963                let (k1, _) = window[1];
964                if k0 <= k1 {
965                    return false;
966                }
967            }
968
969            for (k, _) in input {
970                let is_match = match_bound(&k, &min_bound, &max_bound);
971                let is_res = res.iter().any(|pair| pair.0 == k);
972
973                if is_match != is_res {
974                    return false;
975                }
976            }
977
978            true
979        }
980    }
981
982    quickcheck! {
983        fn check_eq(xs: Vec<(isize, char)>) -> bool
984        {
985            let mut rng = StdRng::new().unwrap();
986            let input0 = filter_input(xs);
987            let mut input1 = input0.clone();
988            rng.shuffle(&mut input1);
989
990            let m0: TreeMap<isize, char> = input0.into_iter().collect();
991            let m1: TreeMap<isize, char> = input1.into_iter().collect();
992
993            m0 == m1
994        }
995    }
996
997    quickcheck! {
998        fn check_neq(xs: Vec<(isize, char)>) -> TestResult
999        {
1000            if xs.is_empty() {
1001                return TestResult::discard();
1002            }
1003            let mut rng = StdRng::new().unwrap();
1004            let input0 = filter_input(xs);
1005            let mut input1 = input0.clone();
1006            rng.shuffle(&mut input1);
1007            input1.pop();
1008
1009            let m0: TreeMap<isize, char> = input0.into_iter().collect();
1010            let m1: TreeMap<isize, char> = input1.into_iter().collect();
1011
1012            TestResult::from_bool(m0 != m1)
1013        }
1014    }
1015
1016    quickcheck! {
1017        fn check_keys(xs: Vec<(isize, char)>) -> bool
1018        {
1019            let input = filter_input(xs);
1020            let mut expected: Vec<isize> = input.iter().map(|pair| pair.0).collect();
1021
1022            let m: TreeMap<isize, char> = input.into_iter().collect();
1023            expected.sort();
1024
1025            let keys: Vec<isize> = m.keys().cloned().collect();
1026
1027            expected == keys
1028        }
1029    }
1030
1031    quickcheck! {
1032        fn check_values(xs: Vec<(isize, char)>) -> bool
1033        {
1034            let input = filter_input(xs);
1035            let mut sorted_input = input.clone();
1036            sorted_input.sort();
1037            let expected: Vec<char> = sorted_input.into_iter().map(|pair| pair.1).collect();
1038
1039            let m: TreeMap<isize, char> = input.into_iter().collect();
1040
1041            let values: Vec<char> = m.values().cloned().collect();
1042
1043            expected == values
1044        }
1045    }
1046
1047    quickcheck! {
1048        fn check_insert_if_absent(xs: Vec<(isize, char)>, key: isize, value: char) -> bool
1049        {
1050            let input = filter_input(xs);
1051
1052            let m: TreeMap<isize, char> = input.iter().cloned().collect();
1053
1054            if input.iter().any(|&(k, _)| k == key) {
1055                None == m.insert_if_absent(key, value)
1056            } else {
1057                let res = m.insert_if_absent(key, value);
1058                res.is_some() && res.unwrap().get(&key) == Some(&value)
1059            }
1060        }
1061    }
1062
1063    quickcheck! {
1064        fn check_update(xs: Vec<(char, isize)>, key: char) -> bool
1065        {
1066            let input = filter_input(xs);
1067
1068            let m: TreeMap<char, isize> = input.iter().cloned().collect();
1069
1070            match input.into_iter().find(|&(k, _)| k == key) {
1071                Some((_, value)) => {
1072                    let res = m.update(&key, |v| v+1);
1073                    res.is_some() && res.unwrap().get(&key) == Some(&(value+1))
1074                },
1075                None => m.update(&key, |v| v+1).is_none()
1076            }
1077        }
1078    }
1079
1080    quickcheck! {
1081        fn check_insert_or_update(xs: Vec<(char, isize)>, key: char) -> bool
1082        {
1083            let input = filter_input(xs);
1084
1085            let m: TreeMap<char, isize> = input.iter().cloned().collect();
1086
1087            let m1 = m.insert_or_update(key, 1, |v| v+1);
1088            match input.into_iter().find(|&(k, _)| k == key) {
1089                Some((_, value)) => {
1090                    m1.get(&key) == Some(&(value+1))
1091                },
1092                None => {
1093                    m1.get(&key) == Some(&1)
1094                }
1095            }
1096        }
1097    }
1098}