1#![allow(warnings)]
5#![allow(clippy)]
6#![allow(unknown_lints)]
7
8use std::{
9 borrow::Borrow, cmp, cmp::Ordering, default, fmt, hash, hash::Hash, iter, mem, ops, ops::Bound,
10};
11
12pub use crate::skipnode::IntoIter;
13use crate::{
14 level_generator::{LevelGenerator, geometric::Geometric},
15 skipnode::{self, SkipListAction, insertion_fixup},
16};
17
18type SkipNode<K, V> = skipnode::SkipNode<(K, V)>;
19
20impl<K, V> SkipNode<K, V> {
21 fn key_ref(&self) -> Option<&K> {
22 self.item.as_ref().map(|item| &item.0)
23 }
24
25 fn value_ref(&self) -> Option<&V> {
26 self.item.as_ref().map(|item| &item.1)
27 }
28
29 fn value_mut(&mut self) -> Option<&mut V> {
30 self.item.as_mut().map(|item| &mut item.1)
31 }
32
33 fn item_ref(&self) -> Option<(&K, &V)> {
34 self.item.as_ref().map(|item| (&item.0, &item.1))
35 }
36
37 fn item_mut(&mut self) -> Option<(&K, &mut V)> {
38 self.item.as_mut().map(|item| (&item.0, &mut item.1))
39 }
40}
41
42pub struct SkipMap<K, V> {
57 head: Box<SkipNode<K, V>>,
59 len: usize,
60 level_generator: Geometric,
61}
62
63impl<K, V> SkipMap<K, V>
68where
69 K: cmp::Ord,
70{
71 #[inline]
81 pub fn new() -> Self {
82 let lg = Geometric::new(16, 1.0 / 2.0).expect("Failed to create level generator.");
84 SkipMap {
85 head: Box::new(SkipNode::head(lg.total())),
86 len: 0,
87 level_generator: lg,
88 }
89 }
90
91 #[inline]
105 pub fn with_capacity(capacity: usize) -> Self {
106 let levels = cmp::max(1, (capacity as f64).log2().floor() as usize);
107 let lg = Geometric::new(levels, 1.0 / 2.0).expect("Failed to create level generator.");
109 SkipMap {
110 head: Box::new(SkipNode::head(lg.total())),
111 len: 0,
112 level_generator: lg,
113 }
114 }
115
116 pub fn insert(&mut self, key: K, value: V) -> Option<V> {
131 let level_gen = &mut self.level_generator;
132 let inserter = InsertOrReplace::new(key, value, |k, v| {
133 Box::new(SkipNode::new((k, v), level_gen.level()))
134 });
135 let insert_res = inserter.act(self.head.as_mut());
136 match insert_res {
137 Ok(_) => {
138 self.len += 1;
139 None
140 }
141 Err(old_val) => Some(old_val),
142 }
143 }
144}
145
146impl<K, V> SkipMap<K, V> {
147 #[inline]
160 pub fn clear(&mut self) {
161 self.len = 0;
162 *self.head = SkipNode::head(self.level_generator.total());
163 }
164
165 #[inline]
177 pub fn len(&self) -> usize {
178 self.len
179 }
180
181 #[inline]
195 pub fn is_empty(&self) -> bool {
196 self.len == 0
197 }
198
199 #[inline]
215 pub fn front(&self) -> Option<(&K, &V)> {
216 self.get_index(0).and_then(|node| node.item_ref())
217 }
218
219 #[inline]
238 pub fn front_mut(&mut self) -> Option<(&K, &mut V)> {
239 self.get_index_mut(0).and_then(|node| node.item_mut())
240 }
241
242 #[inline]
258 pub fn back(&self) -> Option<(&K, &V)> {
259 self.head.last().item_ref()
260 }
261
262 #[inline]
281 pub fn back_mut(&mut self) -> Option<(&K, &mut V)> {
282 self.head.last_mut().item_mut()
283 }
284
285 #[inline]
300 pub fn get<Q>(&self, key: &Q) -> Option<&V>
301 where
302 K: Borrow<Q>,
303 Q: Ord + ?Sized,
304 {
305 self.find_key(key).and_then(|node| node.value_ref())
306 }
307
308 #[inline]
329 pub fn get_mut<Q>(&mut self, key: &Q) -> Option<&mut V>
330 where
331 K: Borrow<Q>,
332 Q: Ord + ?Sized,
333 {
334 self.find_key_mut(key).and_then(|node| node.value_mut())
335 }
336
337 #[inline]
354 pub fn pop_front(&mut self) -> Option<(K, V)> {
355 if self.is_empty() {
356 None
357 } else {
358 Some(self.remove_index(0))
359 }
360 }
361
362 #[inline]
379 pub fn pop_back(&mut self) -> Option<(K, V)> {
380 let len = self.len();
381 if len > 0 {
382 Some(self.remove_index(len - 1))
383 } else {
384 None
385 }
386 }
387
388 pub fn contains_key<Q>(&self, key: &Q) -> bool
401 where
402 K: Borrow<Q>,
403 Q: Ord + ?Sized,
404 {
405 self.find_key(key).is_some()
406 }
407
408 pub fn remove<Q>(&mut self, key: &Q) -> Option<V>
422 where
423 K: Borrow<Q>,
424 Q: Ord + ?Sized,
425 {
426 let remover = Remover(key);
427 match remover.act(self.head.as_mut()) {
428 Ok(node) => {
429 self.len -= 1;
430 node.into_inner().map(|(_key, val)| val)
431 }
432 Err(_) => None,
433 }
434 }
435
436 pub fn remove_index(&mut self, index: usize) -> (K, V) {
453 if index >= self.len() {
454 panic!("Index out of bounds.");
455 } else {
456 let node = self.head.remove_at(index).unwrap();
457 self.len -= 1;
458 node.into_inner().unwrap()
459 }
460 }
461
462 #[allow(clippy::should_implement_trait)]
476 pub fn into_iter(mut self) -> IntoIter<(K, V)> {
477 let len = self.len();
478 unsafe { IntoIter::from_head(&mut self.head, len) }
479 }
480
481 pub fn iter(&self) -> Iter<K, V> {
495 let len = self.len();
496 unsafe { Iter::from_head(&self.head, len) }
497 }
498
499 pub fn iter_mut(&mut self) -> IterMut<K, V> {
515 let len = self.len();
516 unsafe { IterMut::from_head(&mut self.head, len) }
517 }
518
519 pub fn keys(&self) -> Keys<K, V> {
533 Keys(self.iter())
534 }
535
536 pub fn values(&self) -> Values<K, V> {
550 Values(self.iter())
551 }
552
553 pub fn range<Q>(&self, min: Bound<&Q>, max: Bound<&Q>) -> Iter<K, V>
573 where
574 K: Borrow<Q>,
575 Q: Ord,
576 {
577 let iter_inner = self._range(min, max).unwrap_or(skipnode::Iter {
578 first: None,
579 last: None,
580 size: 0,
581 });
582 Iter(iter_inner)
583 }
584
585 fn _range<Q>(&self, min: Bound<&Q>, max: Bound<&Q>) -> Option<skipnode::Iter<(K, V)>>
586 where
587 K: Borrow<Q>,
588 Q: Ord,
589 {
590 let (first, first_distance_from_head) = self._lower_bound(min)?;
591 let (last, last_distance_from_head) = self._upper_bound(max);
592 let size = last_distance_from_head.checked_sub(first_distance_from_head)? + 1;
593 Some(skipnode::Iter {
594 first: Some(first),
595 last: Some(last),
596 size,
597 })
598 }
599
600 pub fn lower_bound<Q>(&self, min: Bound<&Q>) -> Option<(&K, &V)>
619 where
620 K: Borrow<Q>,
621 Q: Ord,
622 {
623 self._lower_bound(min).and_then(|(node, _)| node.item_ref())
624 }
625
626 pub fn upper_bound<Q>(&self, max: Bound<&Q>) -> Option<(&K, &V)>
645 where
646 K: Borrow<Q>,
647 Q: Ord,
648 {
649 self._upper_bound(max).0.item_ref()
650 }
651
652 fn _lower_bound<Q>(&self, min: Bound<&Q>) -> Option<(&SkipNode<K, V>, usize)>
653 where
654 K: Borrow<Q>,
655 Q: Ord,
656 {
657 Some(match min {
658 Bound::Unbounded => (self.head.next_ref()?, 1usize),
659 Bound::Included(min) => {
660 let (last_lt, last_lt_from_head) = self.head.find_last_lt_with(cmp, min);
661 let first_ge = last_lt.next_ref()?;
662 (first_ge, last_lt_from_head + 1)
663 }
664 Bound::Excluded(min) => {
665 let (last_le, last_le_from_head) = self.head.find_last_le_with(cmp, min);
666 let first_gt = last_le.next_ref()?;
667 (first_gt, last_le_from_head + 1)
668 }
669 })
670 }
671
672 fn _upper_bound<Q>(&self, max: Bound<&Q>) -> (&SkipNode<K, V>, usize)
673 where
674 K: Borrow<Q>,
675 Q: Ord,
676 {
677 match max {
678 Bound::Unbounded => (self.head.last(), self.len()),
679 Bound::Included(max) => self.head.find_last_le_with(cmp, max),
680 Bound::Excluded(max) => self.head.find_last_lt_with(cmp, max),
681 }
682 }
683}
684
685fn cmp<Q: Ord, K: Borrow<Q>, V>(node_item: &(K, V), target: &Q) -> Ordering {
686 node_item.0.borrow().cmp(target)
687}
688
689impl<K: Ord, V> SkipMap<K, V> {
694 #[allow(dead_code)]
696 fn check(&self) {
697 self.head.check();
698 if let Some(mut node) = self.head.next_ref() {
699 let mut key = node.key_ref().unwrap();
700 while let Some(next_node) = node.next_ref() {
701 let next_key = next_node.key_ref().unwrap();
702 assert!(key <= next_key);
703 node = next_node;
704 key = next_key;
705 }
706 }
707 }
708}
709
710impl<K, V> SkipMap<K, V> {
711 fn find_key<Q>(&self, key: &Q) -> Option<&SkipNode<K, V>>
713 where
714 K: Borrow<Q>,
715 Q: Ord + ?Sized,
716 {
717 let (last_le, _) = self.head.find_last_le_with(
718 |(node_key, _), target| Ord::cmp(node_key.borrow(), target),
719 key,
720 );
721 let node_key = last_le.key_ref()?;
722 if node_key.borrow() == key {
723 Some(last_le)
724 } else {
725 None
726 }
727 }
728
729 fn find_key_mut<Q>(&mut self, key: &Q) -> Option<&mut SkipNode<K, V>>
731 where
732 K: Borrow<Q>,
733 Q: Ord + ?Sized,
734 {
735 let (last_le, _) = self.head.find_last_le_with_mut(
736 |(node_key, _), target| Ord::cmp(node_key.borrow(), target),
737 key,
738 );
739 let node_key = last_le.key_ref()?;
740 if node_key.borrow() == key {
741 Some(last_le)
742 } else {
743 None
744 }
745 }
746
747 fn get_index(&self, index: usize) -> Option<&SkipNode<K, V>> {
749 self.head.advance(index + 1)
750 }
751
752 fn get_index_mut(&mut self, index: usize) -> Option<&mut SkipNode<K, V>> {
754 self.head.advance_mut(index + 1)
755 }
756}
757
758impl<K, V> SkipMap<K, V>
759where
760 K: fmt::Debug,
761 V: fmt::Debug,
762{
763 #[allow(dead_code)]
766 fn debug_structure(&self) {
767 unsafe {
768 let mut node: *const SkipNode<K, V> = mem::transmute_copy(&self.head);
769 let mut rows: Vec<_> = iter::repeat(String::new())
770 .take(self.level_generator.total())
771 .collect();
772
773 loop {
774 let value = match ((*node).key_ref(), (*node).value_ref()) {
775 (Some(k), Some(v)) => {
776 format!("> ({:?}, {:?})", k, v)
777 }
778 _ => "> ()".to_string(),
779 };
780
781 let max_str_len = format!("{} -{}-", value, (*node).links_len[(*node).level]).len();
782
783 let mut lvl = self.level_generator.total();
784 while lvl > 0 {
785 lvl -= 1;
786
787 let mut value_len = if lvl <= (*node).level {
788 format!("{} -{}-", value, (*node).links_len[lvl])
789 } else {
790 format!("{} -", value)
791 };
792 for _ in 0..(max_str_len - value_len.len()) {
793 value_len.push('-');
794 }
795
796 let mut dashes = String::new();
797 for _ in 0..value_len.len() {
798 dashes.push('-');
799 }
800
801 if lvl <= (*node).level {
802 rows[lvl].push_str(value_len.as_ref());
803 } else {
804 rows[lvl].push_str(dashes.as_ref());
805 }
806 }
807
808 match (*node).links[0].and_then(|p| p.as_ptr().as_ref()) {
809 Some(next) => {
810 node = next;
811 }
812 _ => {
813 break;
814 }
815 }
816 }
817
818 for row in rows.iter().rev() {
819 println!("{}", row);
820 }
821 }
822 }
823}
824
825struct InsertOrReplace<K, V, MakeNode>
830where
831 K: Ord,
832 MakeNode: FnOnce(K, V) -> Box<SkipNode<K, V>>,
833{
834 key: K,
835 value: V,
836 make_node: MakeNode,
837}
838
839impl<K, V, MakeNode> InsertOrReplace<K, V, MakeNode>
840where
841 K: Ord,
842 MakeNode: FnOnce(K, V) -> Box<SkipNode<K, V>>,
843{
844 fn new(key: K, value: V, make_node: MakeNode) -> Self {
845 Self {
846 key,
847 value,
848 make_node,
849 }
850 }
851}
852
853impl<'a, K: 'a, V: 'a, MakeNode> SkipListAction<'a, (K, V)> for InsertOrReplace<K, V, MakeNode>
854where
855 K: Ord,
856 MakeNode: FnOnce(K, V) -> Box<SkipNode<K, V>>,
857{
858 type Ok = &'a mut SkipNode<K, V>;
859 type Err = V;
860 fn fail(self) -> Self::Err {
861 panic!("This action should never fail")
862 }
863 fn seek(
864 &mut self,
865 node: &'a mut SkipNode<K, V>,
866 level: usize,
867 ) -> Option<(&'a mut SkipNode<K, V>, usize)> {
868 Some(node.advance_while_at_level_mut(level, |_, next_node| {
869 let next_key = next_node.key_ref().unwrap();
870 let target_key = &self.key;
871 next_key < target_key
872 }))
873 }
874
875 unsafe fn act_on_node(self, node: &'a mut SkipNode<K, V>) -> Result<Self::Ok, Self::Err> {
876 unsafe {
877 let target_key = &self.key;
878 if let Some(target_node) = node.next_mut() {
879 if let Some(node_key) = target_node.key_ref() {
880 if target_key == node_key {
881 let old_value = mem::replace(target_node.value_mut().unwrap(), self.value);
882 return Err(old_value);
883 }
884 }
885 }
886 let new_node = (self.make_node)(self.key, self.value);
887 node.insert_next(new_node);
888 Ok(node.next_mut().unwrap())
889 }
890 }
891 fn fixup(
892 level: usize,
893 level_head: &'a mut SkipNode<K, V>,
894 distance_to_target: usize,
895 action_result: &mut Self::Ok,
896 ) {
897 insertion_fixup(level, level_head, distance_to_target, action_result)
898 }
899}
900
901struct Remover<'a, Q: ?Sized>(&'a Q);
902
903impl<'a, Q: Ord + ?Sized, K: Borrow<Q>, V> SkipListAction<'a, (K, V)> for Remover<'a, Q> {
904 type Ok = Box<SkipNode<K, V>>;
905 type Err = ();
906 #[allow(clippy::unused_unit)]
907 fn fail(self) -> Self::Err {
908 ()
909 }
910
911 fn seek(
912 &mut self,
913 node: &'a mut SkipNode<K, V>,
914 level: usize,
915 ) -> Option<(&'a mut SkipNode<K, V>, usize)> {
916 Some(node.advance_while_at_level_mut(level, |_, next_node| {
917 let next_key = next_node.key_ref().unwrap().borrow();
918 let target_key = self.0;
919 next_key < target_key
920 }))
921 }
922
923 unsafe fn act_on_node(
924 self,
925 target_parent: &'a mut SkipNode<K, V>,
926 ) -> Result<Self::Ok, Self::Err> {
927 unsafe {
928 let node_key = target_parent
929 .next_mut()
930 .and_then(|node| node.key_ref())
931 .ok_or(())?
932 .borrow();
933 let target_key = self.0;
934 if node_key == target_key {
935 Ok(target_parent.take_next().unwrap())
936 } else {
937 Err(())
938 }
939 }
940 }
941 fn fixup(
942 level: usize,
943 level_head: &'a mut SkipNode<K, V>,
944 _distance: usize,
945 action_result: &mut Self::Ok,
946 ) {
947 skipnode::removal_fixup(level, level_head, action_result)
948 }
949}
950
951unsafe impl<K: Send, V: Send> Send for SkipMap<K, V> {}
956unsafe impl<K: Sync, V: Sync> Sync for SkipMap<K, V> {}
957
958impl<K: Ord, V> default::Default for SkipMap<K, V> {
959 fn default() -> SkipMap<K, V> {
960 SkipMap::new()
961 }
962}
963
964impl<AK, AV, BK, BV> cmp::PartialEq<SkipMap<BK, BV>> for SkipMap<AK, AV>
969where
970 AK: cmp::PartialEq<BK>,
971 AV: cmp::PartialEq<BV>,
972{
973 #[inline]
974 fn eq(&self, other: &SkipMap<BK, BV>) -> bool {
975 self.len() == other.len()
976 && self
977 .iter()
978 .zip(other.iter())
979 .all(|(x, y)| x.0 == y.0 && x.1 == y.1)
980 }
981 #[allow(clippy::partialeq_ne_impl)]
982 #[inline]
983 fn ne(&self, other: &SkipMap<BK, BV>) -> bool {
984 self.len() != other.len()
985 || self
986 .iter()
987 .zip(other.iter())
988 .any(|(x, y)| x.0 != y.0 || x.1 != y.1)
989 }
990}
991
992impl<K, V> cmp::Eq for SkipMap<K, V>
993where
994 K: cmp::Eq,
995 V: cmp::Eq,
996{
997}
998
999impl<AK, AV, BK, BV> cmp::PartialOrd<SkipMap<BK, BV>> for SkipMap<AK, AV>
1000where
1001 AK: cmp::PartialOrd<BK>,
1002 AV: cmp::PartialOrd<BV>,
1003{
1004 #[inline]
1005 fn partial_cmp(&self, other: &SkipMap<BK, BV>) -> Option<Ordering> {
1006 match self
1007 .iter()
1008 .map(|x| x.0)
1009 .partial_cmp(other.iter().map(|x| x.0))
1010 {
1011 None => None,
1012 Some(Ordering::Less) => Some(Ordering::Less),
1013 Some(Ordering::Greater) => Some(Ordering::Greater),
1014 Some(Ordering::Equal) => self
1015 .iter()
1016 .map(|x| x.1)
1017 .partial_cmp(other.iter().map(|x| x.1)),
1018 }
1019 }
1020}
1021
1022impl<K, V> Ord for SkipMap<K, V>
1023where
1024 K: cmp::Ord,
1025 V: cmp::Ord,
1026{
1027 #[inline]
1028 fn cmp(&self, other: &SkipMap<K, V>) -> Ordering {
1029 self.iter().cmp(other)
1030 }
1031}
1032
1033impl<K, V> Extend<(K, V)> for SkipMap<K, V>
1034where
1035 K: Ord,
1036{
1037 #[inline]
1038 fn extend<I: iter::IntoIterator<Item = (K, V)>>(&mut self, iterable: I) {
1039 let iterator = iterable.into_iter();
1040 for element in iterator {
1041 self.insert(element.0, element.1);
1042 }
1043 }
1044}
1045
1046impl<K, V> ops::Index<usize> for SkipMap<K, V> {
1047 type Output = V;
1048
1049 fn index(&self, index: usize) -> &V {
1050 self.get_index(index)
1051 .and_then(|node| node.value_ref())
1052 .expect("Index out of bounds")
1053 }
1054}
1055
1056impl<K, V> ops::IndexMut<usize> for SkipMap<K, V> {
1057 fn index_mut(&mut self, index: usize) -> &mut V {
1058 self.get_index_mut(index)
1059 .and_then(|node| node.value_mut())
1060 .expect("Index out of bounds")
1061 }
1062}
1063
1064impl<K, V> fmt::Debug for SkipMap<K, V>
1065where
1066 K: fmt::Debug,
1067 V: fmt::Debug,
1068{
1069 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1070 write!(f, "[")?;
1071
1072 for (i, (k, v)) in self.iter().enumerate() {
1073 if i != 0 {
1074 write!(f, ", ")?;
1075 }
1076 write!(f, "({:?}, {:?})", k, v)?;
1077 }
1078 write!(f, "]")
1079 }
1080}
1081
1082impl<K, V> fmt::Display for SkipMap<K, V>
1083where
1084 K: fmt::Display,
1085 V: fmt::Display,
1086{
1087 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1088 write!(f, "[")?;
1089
1090 for (i, (k, v)) in self.iter().enumerate() {
1091 if i != 0 {
1092 write!(f, ", ")?;
1093 }
1094 write!(f, "({}, {})", k, v)?;
1095 }
1096 write!(f, "]")
1097 }
1098}
1099
1100impl<K, V> iter::IntoIterator for SkipMap<K, V> {
1101 type Item = (K, V);
1102 type IntoIter = IntoIter<(K, V)>;
1103
1104 fn into_iter(self) -> Self::IntoIter {
1105 self.into_iter()
1106 }
1107}
1108impl<'a, K, V> iter::IntoIterator for &'a SkipMap<K, V> {
1109 type Item = (&'a K, &'a V);
1110 type IntoIter = Iter<'a, K, V>;
1111
1112 fn into_iter(self) -> Self::IntoIter {
1113 self.iter()
1114 }
1115}
1116impl<'a, K, V> iter::IntoIterator for &'a mut SkipMap<K, V> {
1117 type Item = (&'a K, &'a mut V);
1118 type IntoIter = IterMut<'a, K, V>;
1119
1120 fn into_iter(self) -> IterMut<'a, K, V> {
1121 self.iter_mut()
1122 }
1123}
1124
1125impl<K, V> iter::FromIterator<(K, V)> for SkipMap<K, V>
1126where
1127 K: Ord,
1128{
1129 #[inline]
1130 fn from_iter<I>(iter: I) -> SkipMap<K, V>
1131 where
1132 I: iter::IntoIterator<Item = (K, V)>,
1133 {
1134 let mut skipmap = SkipMap::new();
1135 skipmap.extend(iter);
1136 skipmap
1137 }
1138}
1139
1140impl<K: Hash, V: Hash> Hash for SkipMap<K, V> {
1141 #[inline]
1142 fn hash<H: hash::Hasher>(&self, state: &mut H) {
1143 for elt in self {
1144 elt.hash(state);
1145 }
1146 }
1147}
1148
1149pub struct Iter<'a, K: 'a, V: 'a>(skipnode::Iter<'a, (K, V)>);
1156
1157impl<'a, K: 'a, V: 'a> Iter<'a, K, V> {
1158 unsafe fn from_head(head: &'a SkipNode<K, V>, len: usize) -> Self {
1160 unsafe { Self(skipnode::Iter::from_head(head, len)) }
1161 }
1162}
1163
1164impl<'a, K: 'a, V: 'a> Iterator for Iter<'a, K, V> {
1165 type Item = (&'a K, &'a V);
1166 fn next(&mut self) -> Option<Self::Item> {
1167 self.0.next().map(|x| (&x.0, &x.1))
1168 }
1169 fn size_hint(&self) -> (usize, Option<usize>) {
1170 self.0.size_hint()
1171 }
1172}
1173
1174impl<'a, K: 'a, V: 'a> DoubleEndedIterator for Iter<'a, K, V> {
1175 fn next_back(&mut self) -> Option<Self::Item> {
1176 self.0.next_back().map(|x| (&x.0, &x.1))
1177 }
1178}
1179
1180pub struct IterMut<'a, K: 'a, V: 'a>(skipnode::IterMut<'a, (K, V)>);
1182
1183impl<'a, K: 'a, V: 'a> IterMut<'a, K, V> {
1184 unsafe fn from_head(head: &'a mut SkipNode<K, V>, len: usize) -> Self {
1186 unsafe { Self(skipnode::IterMut::from_head(head, len)) }
1187 }
1188}
1189
1190impl<'a, K: 'a, V: 'a> Iterator for IterMut<'a, K, V> {
1191 type Item = (&'a K, &'a mut V);
1192 fn next(&mut self) -> Option<Self::Item> {
1193 self.0.next().map(|x| (&x.0, &mut x.1))
1194 }
1195 fn size_hint(&self) -> (usize, Option<usize>) {
1196 self.0.size_hint()
1197 }
1198}
1199
1200impl<'a, K: 'a, V: 'a> DoubleEndedIterator for IterMut<'a, K, V> {
1201 fn next_back(&mut self) -> Option<Self::Item> {
1202 self.0.next_back().map(|x| (&x.0, &mut x.1))
1203 }
1204}
1205
1206pub struct Keys<'a, K: 'a, V>(Iter<'a, K, V>);
1208
1209impl<'a, K: 'a, V> Iterator for Keys<'a, K, V> {
1210 type Item = &'a K;
1211 fn next(&mut self) -> Option<Self::Item> {
1212 self.0.next().map(|x| x.0)
1213 }
1214 fn size_hint(&self) -> (usize, Option<usize>) {
1215 self.0.size_hint()
1216 }
1217}
1218
1219impl<'a, K: 'a, V> DoubleEndedIterator for Keys<'a, K, V> {
1220 fn next_back(&mut self) -> Option<Self::Item> {
1221 self.0.next_back().map(|x| x.0)
1222 }
1223}
1224
1225pub struct Values<'a, K, V: 'a>(Iter<'a, K, V>);
1227
1228impl<'a, K, V: 'a> Iterator for Values<'a, K, V> {
1229 type Item = &'a V;
1230 fn next(&mut self) -> Option<Self::Item> {
1231 self.0.next().map(|x| x.1)
1232 }
1233 fn size_hint(&self) -> (usize, Option<usize>) {
1234 self.0.size_hint()
1235 }
1236}
1237
1238impl<'a, K, V: 'a> DoubleEndedIterator for Values<'a, K, V> {
1239 fn next_back(&mut self) -> Option<Self::Item> {
1240 self.0.next_back().map(|x| x.1)
1241 }
1242}
1243
1244#[cfg(test)]
1249mod tests {
1250 use std::ops::Bound::{self, Excluded, Included, Unbounded};
1251
1252 use super::SkipMap;
1253
1254 #[test]
1255 fn basic_small() {
1256 let mut sm: SkipMap<i64, i64> = SkipMap::new();
1257 sm.check();
1258 assert!(sm.remove(&1).is_none());
1259 sm.check();
1260 assert!(sm.insert(1, 0).is_none());
1261 sm.check();
1262 assert_eq!(sm.insert(1, 5), Some(0));
1263 sm.check();
1264 assert_eq!(sm.remove(&1), Some(5));
1265 sm.check();
1266 assert!(sm.insert(1, 10).is_none());
1267 sm.check();
1268 assert!(sm.insert(2, 20).is_none());
1269 sm.check();
1270 assert_eq!(sm.remove(&1), Some(10));
1271 sm.check();
1272 assert_eq!(sm.remove(&2), Some(20));
1273 sm.check();
1274 assert!(sm.remove(&1).is_none());
1275 sm.check();
1276 }
1277
1278 #[test]
1279 fn basic_large() {
1280 let size = 10_000;
1281 let mut sm = SkipMap::with_capacity(size);
1282 assert!(sm.is_empty());
1283
1284 for i in 0..size {
1285 sm.insert(i, i * 10);
1286 assert_eq!(sm.len(), i + 1);
1287 }
1288 sm.check();
1289
1290 for i in 0..size {
1291 assert_eq!(sm.remove(&i), Some(i * 10));
1292 assert_eq!(sm.len(), size - i - 1);
1293 }
1294 sm.check();
1295 }
1296
1297 #[test]
1298 fn insert_existing() {
1299 let size = 100;
1300 let mut sm = SkipMap::new();
1301
1302 for i in 0..size {
1303 assert!(sm.insert(i, format!("{}", i)).is_none());
1304 }
1305
1306 for i in 0..size {
1307 assert_eq!(sm.insert(i, format!("{}", i)), Some(format!("{}", i)));
1308 }
1309 for i in (0..size).rev() {
1310 assert_eq!(sm.insert(i, format!("{}", i)), Some(format!("{}", i)));
1311 }
1312 }
1313
1314 #[test]
1315 fn clear() {
1316 let mut sm: SkipMap<_, _> = (0..100).map(|x| (x, x)).collect();
1317 assert_eq!(sm.len(), 100);
1318 sm.clear();
1319 sm.check();
1320 assert!(sm.is_empty());
1321 }
1322
1323 #[test]
1324 fn iter() {
1325 let size = 10000;
1326
1327 let mut sm: SkipMap<_, _> = (0..size).map(|x| (x, x)).collect();
1328
1329 fn test<T>(size: usize, mut iter: T)
1330 where
1331 T: Iterator<Item = (usize, usize)>,
1332 {
1333 for i in 0..size {
1334 assert_eq!(iter.size_hint(), (size - i, Some(size - i)));
1335 assert_eq!(iter.next().unwrap(), (i, i));
1336 }
1337 assert_eq!(iter.size_hint(), (0, Some(0)));
1338 assert!(iter.next().is_none());
1339 }
1340 test(size, sm.iter().map(|(&a, &b)| (a, b)));
1341 test(size, sm.iter_mut().map(|(&a, &mut b)| (a, b)));
1342 test(size, sm.into_iter());
1343 }
1344
1345 #[test]
1346 fn iter_rev() {
1347 let size = 1000;
1348
1349 let mut sm: SkipMap<_, _> = (0..size).map(|x| (x, x)).collect();
1350
1351 fn test<T>(size: usize, mut iter: T)
1352 where
1353 T: Iterator<Item = (usize, usize)>,
1354 {
1355 for i in 0..size {
1356 assert_eq!(iter.size_hint(), (size - i, Some(size - i)));
1357 assert_eq!(iter.next().unwrap(), (size - i - 1, size - i - 1));
1358 }
1359 assert_eq!(iter.size_hint(), (0, Some(0)));
1360 assert!(iter.next().is_none());
1361 }
1362 test(size, sm.iter().rev().map(|(&a, &b)| (a, b)));
1363 test(size, sm.iter_mut().rev().map(|(&a, &mut b)| (a, b)));
1364 test(size, sm.into_iter().rev());
1365 }
1366
1367 #[test]
1368 fn iter_mixed() {
1369 let size = 1000;
1370 let mut sm: SkipMap<_, _> = (0..size).map(|x| (x, x)).collect();
1371
1372 fn test<T>(size: usize, mut iter: T)
1373 where
1374 T: Iterator<Item = (usize, usize)> + DoubleEndedIterator,
1375 {
1376 for i in 0..size / 4 {
1377 assert_eq!(iter.size_hint(), (size - i * 2, Some(size - i * 2)));
1378 assert_eq!(iter.next().unwrap(), (i, i));
1379 assert_eq!(iter.next_back().unwrap(), (size - i - 1, size - i - 1));
1380 }
1381 for i in size / 4..size * 3 / 4 {
1382 assert_eq!(iter.size_hint(), (size * 3 / 4 - i, Some(size * 3 / 4 - i)));
1383 assert_eq!(iter.next().unwrap(), (i, i));
1384 }
1385 assert_eq!(iter.size_hint(), (0, Some(0)));
1386 assert!(iter.next().is_none());
1387 }
1388 test(size, sm.iter().map(|(&a, &b)| (a, b)));
1389 test(size, sm.iter_mut().map(|(&a, &mut b)| (a, b)));
1390 test(size, sm.into_iter());
1391 }
1392
1393 #[test]
1394 fn iter_key_val() {
1395 let size = 1000;
1396 let sm: SkipMap<_, _> = (0..size).map(|x| (x, 2 * x)).collect();
1397
1398 let mut keys = sm.keys();
1399 for i in 0..size / 2 {
1400 assert_eq!(keys.next(), Some(&i));
1401 }
1402 for i in 0..size / 2 {
1403 assert_eq!(keys.next_back(), Some(&(size - i - 1)))
1404 }
1405 assert!(keys.next().is_none());
1406
1407 let mut vals = sm.values();
1408 for i in 0..size / 2 {
1409 assert_eq!(vals.next(), Some(&(2 * i)));
1410 }
1411 for i in 0..size / 2 {
1412 assert_eq!(vals.next_back(), Some(&(2 * (size - i) - 2)))
1413 }
1414 assert!(vals.next().is_none());
1415 }
1416
1417 #[test]
1418 fn range_small() {
1419 let size = 5;
1420
1421 let sm: SkipMap<_, _> = (0..size).map(|x| (x, x)).collect();
1422
1423 let mut j = 0;
1424 for ((&k, &v), i) in sm.range(Included(&2), Unbounded).zip(2..size) {
1425 assert_eq!(k, i);
1426 assert_eq!(v, i);
1427 j += 1;
1428 }
1429 assert_eq!(j, size - 2);
1430 }
1431
1432 #[test]
1433 fn range_1000() {
1434 let size = 1000;
1435 let sm: SkipMap<_, _> = (0..size).map(|x| (x, x)).collect();
1436
1437 fn test(sm: &SkipMap<usize, usize>, min: Bound<&usize>, max: Bound<&usize>) {
1438 let mut values = sm.range(min, max);
1439 #[allow(clippy::range_plus_one)]
1440 let mut expects = match (min, max) {
1441 (Excluded(&a), Excluded(&b)) => (a + 1)..b,
1442 (Included(&a), Excluded(&b)) => a..b,
1443 (Unbounded, Excluded(&b)) => 0..b,
1444 (Excluded(&a), Included(&b)) => (a + 1)..(b + 1),
1445 (Included(&a), Included(&b)) => a..(b + 1),
1446 (Unbounded, Included(&b)) => 0..(b + 1),
1447 (Excluded(&a), Unbounded) => (a + 1)..1000,
1448 (Included(&a), Unbounded) => a..1000,
1449 (Unbounded, Unbounded) => 0..1000,
1450 };
1451
1452 assert_eq!(values.size_hint(), expects.size_hint());
1453
1454 for ((&k, &v), e) in values.by_ref().zip(expects.by_ref()) {
1455 assert_eq!(k, e);
1456 assert_eq!(v, e);
1457 }
1458 assert!(values.next().is_none());
1459 assert!(expects.next().is_none());
1460 }
1461
1462 test(&sm, Excluded(&200), Excluded(&800));
1463 test(&sm, Included(&200), Excluded(&800));
1464 test(&sm, Unbounded, Excluded(&800));
1465 test(&sm, Excluded(&200), Included(&800));
1466 test(&sm, Included(&200), Included(&800));
1467 test(&sm, Unbounded, Included(&800));
1468 test(&sm, Excluded(&200), Unbounded);
1469 test(&sm, Included(&200), Unbounded);
1470 test(&sm, Unbounded, Unbounded);
1471 }
1472
1473 #[test]
1474 fn range() {
1475 let size = 200;
1476 let sm: SkipMap<_, _> = (0..size).map(|x| (x, x)).collect();
1477
1478 for i in 0..size {
1479 for j in 0..size {
1480 let mut values = sm.range(Included(&i), Included(&j)).map(|(&a, &b)| (a, b));
1481 let mut expects = i..=j;
1482
1483 assert_eq!(values.size_hint(), expects.size_hint());
1484
1485 for ((k, v), e) in values.by_ref().zip(expects.by_ref()) {
1486 assert_eq!(k, e);
1487 assert_eq!(v, e);
1488 }
1489 assert!(values.next().is_none());
1490 assert!(expects.next().is_none());
1491 }
1492 }
1493
1494 }
1497
1498 #[test]
1499 fn bound() {
1500 let sm: SkipMap<_, _> = (1..3).map(|x| (x, x)).collect();
1501
1502 assert_eq!(sm.lower_bound(Unbounded), Some((&1, &1)));
1503 assert_eq!(sm.lower_bound(Excluded(&1)), Some((&2, &2)));
1504 assert_eq!(sm.lower_bound(Included(&1)), Some((&1, &1)));
1505
1506 assert_eq!(sm.lower_bound(Excluded(&3)), None);
1507 assert_eq!(sm.lower_bound(Included(&3)), None);
1508
1509 assert_eq!(sm.upper_bound(Unbounded), Some((&2, &2)));
1510 assert_eq!(sm.upper_bound(Excluded(&2)), Some((&1, &1)));
1511 assert_eq!(sm.upper_bound(Included(&2)), Some((&2, &2)));
1512
1513 assert_eq!(sm.upper_bound(Excluded(&0)), None);
1514 assert_eq!(sm.upper_bound(Included(&0)), None);
1515 }
1516
1517 #[test]
1518 fn index_pop() {
1519 let size = 1000;
1520 let mut sm: SkipMap<_, _> = (0..size).map(|x| (x, 2 * x)).collect();
1521 assert_eq!(sm.front(), Some((&0, &0)));
1522 assert_eq!(sm.front_mut(), Some((&0, &mut 0)));
1523 assert_eq!(sm.back(), Some((&(size - 1), &(2 * size - 2))));
1524 assert_eq!(sm.back_mut(), Some((&(size - 1), &mut (2 * size - 2))));
1525 for i in 0..size {
1526 assert_eq!(sm[i], 2 * i);
1527 assert_eq!(sm.get(&i), Some(&(2 * i)));
1528 assert_eq!(sm.get_mut(&i), Some(&mut (2 * i)));
1529 }
1530
1531 let mut sm: SkipMap<_, _> = (0..size).map(|x| (x, 2 * x)).collect();
1532 for i in 0..size {
1533 assert_eq!(sm.pop_front(), Some((i, 2 * i)));
1534 assert_eq!(sm.len(), size - i - 1);
1535 }
1536 assert!(sm.pop_front().is_none());
1537 assert!(sm.front().is_none());
1538 assert!(sm.is_empty());
1539
1540 let mut sm: SkipMap<_, _> = (0..size).map(|x| (x, 2 * x)).collect();
1541 for i in 0..size {
1542 assert_eq!(sm.pop_back(), Some((size - i - 1, 2 * (size - i - 1))));
1543 assert_eq!(sm.len(), size - i - 1);
1544 }
1545 assert!(sm.pop_back().is_none());
1546 assert!(sm.back().is_none());
1547 assert!(sm.is_empty());
1548 }
1549
1550 #[test]
1551 fn remove_index() {
1552 let size = 100;
1553
1554 for i in 0..size {
1555 let mut sm: SkipMap<_, _> = (0..size).map(|x| (x, x)).collect();
1556 assert_eq!(sm.remove_index(i), (i, i));
1557 assert_eq!(sm.len(), size - 1);
1558 }
1559
1560 let mut sm: SkipMap<_, _> = (0..size).map(|x| (x, x)).collect();
1561 for i in 0..size {
1562 assert_eq!(sm.remove_index(0), (i, i));
1563 assert_eq!(sm.len(), size - i - 1);
1564 sm.check();
1565 }
1566 assert!(sm.is_empty());
1567 }
1568
1569 #[test]
1570 fn contains() {
1571 let (min, max) = (25, 75);
1572 let sm: SkipMap<_, _> = (min..max).map(|x| (x, x)).collect();
1573
1574 for i in 0..100 {
1575 println!("i = {} (contained: {})", i, sm.contains_key(&i));
1576 if i < min || i >= max {
1577 assert!(!sm.contains_key(&i));
1578 } else {
1579 assert!(sm.contains_key(&i));
1580 }
1581 }
1582 }
1583
1584 #[test]
1585 fn debug_display() {
1586 let sl: SkipMap<_, _> = (0..10).map(|x| (x, x)).collect();
1587 sl.debug_structure();
1588 println!("{:?}", sl);
1589 println!("{}", sl);
1590 }
1591
1592 #[test]
1593 #[allow(clippy::eq_op, clippy::many_single_char_names)]
1594 fn equality() {
1595 let a: SkipMap<i64, i64> = (0..100).map(|x| (x, x)).collect();
1596 let b: SkipMap<i64, i64> = (0..100).map(|x| (x, x)).collect();
1597 let c: SkipMap<i64, i64> = (0..10).map(|x| (x, x)).collect();
1598 let d: SkipMap<i64, i64> = (100..200).map(|x| (x, x)).collect();
1599 let e: SkipMap<i64, i64> = (0..100).chain(0..1).map(|x| (x, x)).collect();
1600
1601 assert_eq!(a, a);
1602 assert_eq!(a, b);
1603 assert_ne!(a, c);
1604 assert_ne!(a, d);
1605 assert_eq!(a, e);
1606 assert_eq!(b, b);
1607 assert_ne!(b, c);
1608 assert_ne!(b, d);
1609 assert_eq!(b, e);
1610 assert_eq!(c, c);
1611 assert_ne!(c, d);
1612 assert_ne!(c, e);
1613 assert_eq!(d, d);
1614 assert_ne!(d, e);
1615 assert_eq!(e, e);
1616 }
1617}