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#[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 pub fn new() -> TreeMap<K, V> {
57 TreeMap { root: None }
58 }
59
60 pub fn len(&self) -> usize {
71 tree::size(&self.root)
72 }
73
74 pub fn is_empty(&self) -> bool {
88 self.root.is_none()
89 }
90
91 pub fn iter<'r>(&'r self) -> TreeMapIter<'r, K, V> {
108 tree::Iter::new(&self.root)
109 }
110
111 pub fn rev_iter<'r>(&'r self) -> TreeMapRevIter<'r, K, V> {
128 tree::RevIter::new(&self.root)
129 }
130
131 pub fn keys<'r>(&'r self) -> TreeMapKeys<'r, K, V> {
148 tree::Keys::new(tree::Iter::new(&self.root))
149 }
150
151 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 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 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 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 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 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 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 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 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 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 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}