1use core::{borrow::Borrow, fmt, iter::FusedIterator, mem, ops, slice};
6
7#[cfg(feature = "zeroize")]
8use zeroize::Zeroize;
9
10use crate::vec::{OwnedVecStorage, Vec, VecInner, ViewVecStorage};
11
12mod storage {
13 use crate::vec::{OwnedVecStorage, VecStorage, ViewVecStorage};
14
15 use super::{LinearMapInner, LinearMapView};
16
17 pub trait LinearMapStorage<K, V>: LinearMapStorageSealed<K, V> {}
44 pub trait LinearMapStorageSealed<K, V>: VecStorage<(K, V)> {
45 fn as_linear_map_view(this: &LinearMapInner<K, V, Self>) -> &LinearMapView<K, V>
46 where
47 Self: LinearMapStorage<K, V>;
48 fn as_linear_map_mut_view(
49 this: &mut LinearMapInner<K, V, Self>,
50 ) -> &mut LinearMapView<K, V>
51 where
52 Self: LinearMapStorage<K, V>;
53 }
54
55 impl<K, V, const N: usize> LinearMapStorage<K, V> for OwnedVecStorage<(K, V), N> {}
56 impl<K, V, const N: usize> LinearMapStorageSealed<K, V> for OwnedVecStorage<(K, V), N> {
57 fn as_linear_map_view(this: &LinearMapInner<K, V, Self>) -> &LinearMapView<K, V>
58 where
59 Self: LinearMapStorage<K, V>,
60 {
61 this
62 }
63 fn as_linear_map_mut_view(this: &mut LinearMapInner<K, V, Self>) -> &mut LinearMapView<K, V>
64 where
65 Self: LinearMapStorage<K, V>,
66 {
67 this
68 }
69 }
70
71 impl<K, V> LinearMapStorage<K, V> for ViewVecStorage<(K, V)> {}
72
73 impl<K, V> LinearMapStorageSealed<K, V> for ViewVecStorage<(K, V)> {
74 fn as_linear_map_view(this: &LinearMapInner<K, V, Self>) -> &LinearMapView<K, V>
75 where
76 Self: LinearMapStorage<K, V>,
77 {
78 this
79 }
80 fn as_linear_map_mut_view(this: &mut LinearMapInner<K, V, Self>) -> &mut LinearMapView<K, V>
81 where
82 Self: LinearMapStorage<K, V>,
83 {
84 this
85 }
86 }
87}
88
89pub use storage::LinearMapStorage;
90pub type OwnedStorage<K, V, const N: usize> = OwnedVecStorage<(K, V), N>;
93pub type ViewStorage<K, V> = ViewVecStorage<(K, V)>;
95
96#[cfg_attr(
98 feature = "zeroize",
99 derive(Zeroize),
100 zeroize(bound = "S: Zeroize, K: Zeroize, V: Zeroize")
101)]
102pub struct LinearMapInner<K, V, S: LinearMapStorage<K, V> + ?Sized> {
103 pub(crate) buffer: VecInner<(K, V), usize, S>,
104}
105
106pub type LinearMap<K, V, const N: usize> = LinearMapInner<K, V, OwnedStorage<K, V, N>>;
110
111pub type LinearMapView<K, V> = LinearMapInner<K, V, ViewStorage<K, V>>;
115
116impl<K, V, const N: usize> LinearMap<K, V, N> {
117 pub const fn new() -> Self {
131 Self { buffer: Vec::new() }
132 }
133}
134
135impl<K, V, S: LinearMapStorage<K, V> + ?Sized> LinearMapInner<K, V, S>
136where
137 K: Eq,
138{
139 pub fn as_view(&self) -> &LinearMapView<K, V> {
141 S::as_linear_map_view(self)
142 }
143
144 pub fn as_mut_view(&mut self) -> &mut LinearMapView<K, V> {
146 S::as_linear_map_mut_view(self)
147 }
148
149 pub fn capacity(&self) -> usize {
162 self.buffer.capacity()
163 }
164
165 pub fn clear(&mut self) {
180 self.buffer.clear();
181 }
182
183 pub fn contains_key(&self, key: &K) -> bool {
198 self.get(key).is_some()
199 }
200
201 pub fn get<Q>(&self, key: &Q) -> Option<&V>
216 where
217 K: Borrow<Q>,
218 Q: Eq + ?Sized,
219 {
220 self.iter()
221 .find(|&(k, _)| k.borrow() == key)
222 .map(|(_, v)| v)
223 }
224
225 pub fn get_mut<Q>(&mut self, key: &Q) -> Option<&mut V>
242 where
243 K: Borrow<Q>,
244 Q: Eq + ?Sized,
245 {
246 self.iter_mut()
247 .find(|&(k, _)| k.borrow() == key)
248 .map(|(_, v)| v)
249 }
250
251 pub fn len(&self) -> usize {
266 self.buffer.len()
267 }
268
269 pub fn insert(&mut self, key: K, mut value: V) -> Result<Option<V>, (K, V)> {
291 if let Some((_, v)) = self.iter_mut().find(|&(k, _)| *k == key) {
292 mem::swap(v, &mut value);
293 return Ok(Some(value));
294 }
295
296 self.buffer.push((key, value))?;
297 Ok(None)
298 }
299
300 pub fn is_empty(&self) -> bool {
315 self.len() == 0
316 }
317
318 pub fn is_full(&self) -> bool {
336 self.len() == self.capacity()
337 }
338
339 pub fn iter(&self) -> Iter<'_, K, V> {
356 Iter {
357 iter: self.buffer.as_slice().iter(),
358 }
359 }
360
361 pub fn iter_mut(&mut self) -> IterMut<'_, K, V> {
384 IterMut {
385 iter: self.buffer.as_mut_slice().iter_mut(),
386 }
387 }
388
389 pub fn keys(&self) -> impl Iterator<Item = &K> {
406 self.iter().map(|(k, _)| k)
407 }
408
409 pub fn remove<Q>(&mut self, key: &Q) -> Option<V>
425 where
426 K: Borrow<Q>,
427 Q: Eq + ?Sized,
428 {
429 let idx = self
430 .keys()
431 .enumerate()
432 .find(|&(_, k)| k.borrow() == key)
433 .map(|(idx, _)| idx);
434
435 idx.map(|idx| self.buffer.swap_remove(idx).1)
436 }
437
438 pub fn values(&self) -> impl Iterator<Item = &V> {
455 self.iter().map(|(_, v)| v)
456 }
457
458 pub fn values_mut(&mut self) -> impl Iterator<Item = &mut V> {
479 self.iter_mut().map(|(_, v)| v)
480 }
481
482 pub fn entry(&mut self, key: K) -> Entry<'_, K, V> {
498 let idx = self
499 .keys()
500 .enumerate()
501 .find(|&(_, k)| *k.borrow() == key)
502 .map(|(idx, _)| idx);
503
504 match idx {
505 Some(idx) => Entry::Occupied(OccupiedEntry {
506 idx,
507 map: self.as_mut_view(),
508 }),
509 None => Entry::Vacant(VacantEntry {
510 key,
511 map: self.as_mut_view(),
512 }),
513 }
514 }
515
516 pub fn retain<F>(&mut self, mut f: F)
520 where
521 F: FnMut(&K, &mut V) -> bool,
522 {
523 self.buffer.retain_mut(|(k, v)| f(k, v));
524 }
525}
526
527impl<K, V, Q, S: LinearMapStorage<K, V> + ?Sized> ops::Index<&'_ Q> for LinearMapInner<K, V, S>
528where
529 K: Borrow<Q> + Eq,
530 Q: Eq + ?Sized,
531{
532 type Output = V;
533
534 fn index(&self, key: &Q) -> &V {
535 self.get(key).expect("no entry found for key")
536 }
537}
538
539impl<K, V, Q, S: LinearMapStorage<K, V> + ?Sized> ops::IndexMut<&'_ Q> for LinearMapInner<K, V, S>
540where
541 K: Borrow<Q> + Eq,
542 Q: Eq + ?Sized,
543{
544 fn index_mut(&mut self, key: &Q) -> &mut V {
545 self.get_mut(key).expect("no entry found for key")
546 }
547}
548
549impl<K, V, const N: usize> Default for LinearMap<K, V, N>
550where
551 K: Eq,
552{
553 fn default() -> Self {
554 Self::new()
555 }
556}
557
558impl<K, V, const N: usize> Clone for LinearMap<K, V, N>
559where
560 K: Eq + Clone,
561 V: Clone,
562{
563 fn clone(&self) -> Self {
564 Self {
565 buffer: self.buffer.clone(),
566 }
567 }
568}
569
570impl<K, V, S: LinearMapStorage<K, V> + ?Sized> fmt::Debug for LinearMapInner<K, V, S>
571where
572 K: Eq + fmt::Debug,
573 V: fmt::Debug,
574{
575 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
576 f.debug_map().entries(self.iter()).finish()
577 }
578}
579
580impl<K, V, const N: usize> FromIterator<(K, V)> for LinearMap<K, V, N>
581where
582 K: Eq,
583{
584 fn from_iter<I>(iter: I) -> Self
585 where
586 I: IntoIterator<Item = (K, V)>,
587 {
588 let mut out = Self::new();
589 out.buffer.extend(iter);
590 out
591 }
592}
593
594pub struct IntoIter<K, V, const N: usize>
599where
600 K: Eq,
601{
602 inner: <Vec<(K, V), N, usize> as IntoIterator>::IntoIter,
603}
604
605impl<K, V, const N: usize> Iterator for IntoIter<K, V, N>
606where
607 K: Eq,
608{
609 type Item = (K, V);
610 fn next(&mut self) -> Option<Self::Item> {
611 self.inner.next()
612 }
613
614 fn size_hint(&self) -> (usize, Option<usize>) {
615 let len = self.len();
616 (len, Some(len))
617 }
618}
619
620impl<K, V, const N: usize> FusedIterator for IntoIter<K, V, N> where K: Eq {}
621
622impl<K, V, const N: usize> ExactSizeIterator for IntoIter<K, V, N>
623where
624 K: Eq,
625{
626 fn len(&self) -> usize {
627 self.inner.len()
628 }
629}
630
631impl<K, V, const N: usize> IntoIterator for LinearMap<K, V, N>
632where
633 K: Eq,
634{
635 type Item = (K, V);
636 type IntoIter = IntoIter<K, V, N>;
637
638 fn into_iter(self) -> Self::IntoIter {
639 IntoIter {
640 inner: self.buffer.into_iter(),
641 }
642 }
643}
644
645impl<'a, K, V, S: LinearMapStorage<K, V> + ?Sized> IntoIterator for &'a LinearMapInner<K, V, S>
646where
647 K: Eq,
648{
649 type Item = (&'a K, &'a V);
650 type IntoIter = Iter<'a, K, V>;
651
652 fn into_iter(self) -> Self::IntoIter {
653 self.iter()
654 }
655}
656
657#[derive(Clone, Debug)]
661pub struct Iter<'a, K, V> {
662 iter: slice::Iter<'a, (K, V)>,
663}
664
665impl<'a, K, V> Iterator for Iter<'a, K, V> {
666 type Item = (&'a K, &'a V);
667
668 fn next(&mut self) -> Option<Self::Item> {
669 self.iter.next().map(|(k, v)| (k, v))
670 }
671}
672
673#[derive(Debug)]
677pub struct IterMut<'a, K, V> {
678 iter: slice::IterMut<'a, (K, V)>,
679}
680
681impl<'a, K, V> Iterator for IterMut<'a, K, V> {
682 type Item = (&'a K, &'a mut V);
683
684 fn next(&mut self) -> Option<Self::Item> {
685 self.iter.next().map(|(k, v)| (k as &K, v))
686 }
687}
688
689impl<K, V1, V2, S1: LinearMapStorage<K, V1> + ?Sized, S2: LinearMapStorage<K, V2> + ?Sized>
690 PartialEq<LinearMapInner<K, V2, S2>> for LinearMapInner<K, V1, S1>
691where
692 K: Eq,
693 V1: PartialEq<V2>,
694{
695 fn eq(&self, other: &LinearMapInner<K, V2, S2>) -> bool {
696 self.len() == other.len()
697 && self
698 .iter()
699 .all(|(key, value)| other.get(key).is_some_and(|v| *value == *v))
700 }
701}
702
703impl<K, V, S: LinearMapStorage<K, V> + ?Sized> Eq for LinearMapInner<K, V, S>
704where
705 K: Eq,
706 V: PartialEq,
707{
708}
709
710pub enum Entry<'a, K, V> {
712 Occupied(OccupiedEntry<'a, K, V>),
714 Vacant(VacantEntry<'a, K, V>),
716}
717
718pub struct OccupiedEntry<'a, K, V> {
720 idx: usize,
723 map: &'a mut LinearMapView<K, V>,
724}
725
726impl<'a, K, V> OccupiedEntry<'a, K, V>
727where
728 K: Eq,
729{
730 pub fn key(&self) -> &K {
732 let (k, _v) = unsafe { self.map.buffer.get_unchecked(self.idx) };
734 k
735 }
736
737 pub fn remove_entry(self) -> (K, V) {
739 unsafe { self.map.buffer.swap_remove_unchecked(self.idx) }
741 }
742
743 pub fn remove(self) -> V {
745 self.remove_entry().1
746 }
747
748 pub fn get(&self) -> &V {
750 let (_k, v) = unsafe { self.map.buffer.get_unchecked(self.idx) };
752 v
753 }
754
755 pub fn get_mut(&mut self) -> &mut V {
757 let (_k, v) = unsafe { self.map.buffer.get_unchecked_mut(self.idx) };
759 v
760 }
761
762 pub fn into_mut(self) -> &'a mut V {
764 let (_k, v) = unsafe { self.map.buffer.get_unchecked_mut(self.idx) };
766 v
767 }
768
769 pub fn insert(self, value: V) -> V {
771 let (_k, v) = unsafe { self.map.buffer.get_unchecked_mut(self.idx) };
773 mem::replace(v, value)
774 }
775}
776
777pub struct VacantEntry<'a, K, V> {
779 key: K,
780 map: &'a mut LinearMapView<K, V>,
781}
782
783impl<'a, K, V> VacantEntry<'a, K, V>
784where
785 K: Eq,
786{
787 pub fn key(&self) -> &K {
789 &self.key
790 }
791
792 pub fn into_key(self) -> K {
794 self.key
795 }
796
797 pub fn insert(self, value: V) -> Result<&'a mut V, V> {
800 self.map
801 .buffer
802 .push((self.key, value))
803 .map_err(|(_k, v)| v)?;
804 let idx = self.map.buffer.len() - 1;
805 let r = &mut self.map.buffer[idx];
806 Ok(&mut r.1)
807 }
808}
809
810#[cfg(test)]
811mod test {
812 use static_assertions::assert_not_impl_any;
813
814 use super::{Entry, LinearMap, LinearMapView};
815
816 assert_not_impl_any!(LinearMap<*const (), (), 4>: Send);
818 assert_not_impl_any!(LinearMap<(), *const (), 4>: Send);
820
821 #[test]
822 fn static_new() {
823 static mut _L: LinearMap<i32, i32, 8> = LinearMap::new();
824 }
825
826 #[test]
827 fn borrow() {
828 use crate::String;
829
830 let mut map = LinearMap::<_, _, 8>::new();
831
832 let s = String::<64>::try_from("Hello, world!").unwrap();
833 map.insert(s, 42).unwrap();
834
835 assert_eq!(map.get("Hello, world!").unwrap(), &42);
836 }
837
838 #[test]
839 fn partial_eq() {
840 {
841 let mut a = LinearMap::<_, _, 1>::new();
842 a.insert("k1", "v1").unwrap();
843
844 let mut b = LinearMap::<_, _, 2>::new();
845 b.insert("k1", "v1").unwrap();
846
847 assert!(a == b);
848
849 b.insert("k2", "v2").unwrap();
850
851 assert!(a != b);
852 }
853
854 {
855 let mut a = LinearMap::<_, _, 2>::new();
856 a.insert("k1", "v1").unwrap();
857 a.insert("k2", "v2").unwrap();
858
859 let mut b = LinearMap::<_, _, 2>::new();
860 b.insert("k2", "v2").unwrap();
861 b.insert("k1", "v1").unwrap();
862
863 assert!(a == b);
864 }
865 }
866
867 #[test]
868 fn drop() {
869 droppable!();
870
871 {
872 let mut v: LinearMap<i32, Droppable, 2> = LinearMap::new();
873 v.insert(0, Droppable::new()).ok().unwrap();
874 v.insert(1, Droppable::new()).ok().unwrap();
875 v.remove(&1).unwrap();
876 }
877
878 assert_eq!(Droppable::count(), 0);
879
880 {
881 let mut v: LinearMap<i32, Droppable, 2> = LinearMap::new();
882 v.insert(0, Droppable::new()).ok().unwrap();
883 v.insert(1, Droppable::new()).ok().unwrap();
884 }
885
886 assert_eq!(Droppable::count(), 0);
887 }
888
889 #[test]
890 fn into_iter() {
891 let mut src: LinearMap<_, _, 4> = LinearMap::new();
892 src.insert("k1", "v1").unwrap();
893 src.insert("k2", "v2").unwrap();
894 src.insert("k3", "v3").unwrap();
895 src.insert("k4", "v4").unwrap();
896 let clone = src.clone();
897 for (k, v) in clone.into_iter() {
898 assert_eq!(v, src.remove(k).unwrap());
899 }
900 assert!(src.is_empty());
901 }
902
903 #[test]
904 fn into_iter_len() {
905 let mut src: LinearMap<_, _, 2> = LinearMap::new();
906 src.insert("k1", "v1").unwrap();
907 src.insert("k2", "v2").unwrap();
908 let mut items = src.into_iter();
909 assert_eq!(items.len(), 2);
910 let _ = items.next();
911 assert_eq!(items.len(), 1);
912 let _ = items.next();
913 assert_eq!(items.len(), 0);
914 }
915
916 fn _test_variance_value<'a: 'b, 'b>(
917 x: LinearMap<u32, &'a (), 42>,
918 ) -> LinearMap<u32, &'b (), 42> {
919 x
920 }
921 fn _test_variance_value_view<'a: 'b, 'b, 'c>(
922 x: &'c LinearMapView<u32, &'a ()>,
923 ) -> &'c LinearMapView<u32, &'b ()> {
924 x
925 }
926 fn _test_variance_key<'a: 'b, 'b>(x: LinearMap<&'a (), u32, 42>) -> LinearMap<&'b (), u32, 42> {
927 x
928 }
929 fn _test_variance_key_view<'a: 'b, 'b, 'c>(
930 x: &'c LinearMapView<&'a (), u32>,
931 ) -> &'c LinearMapView<&'b (), u32> {
932 x
933 }
934
935 #[test]
936 fn partial_eq_floats() {
937 let map: LinearMap<usize, f32, 4> = Default::default();
939 assert_eq!(map, map);
940 }
941
942 #[test]
943 #[cfg(feature = "zeroize")]
944 fn test_linear_map_zeroize() {
945 use zeroize::Zeroize;
946
947 let mut map: LinearMap<u8, u8, 8> = LinearMap::new();
948 for i in 1..=8 {
949 map.insert(i, i * 10).unwrap();
950 }
951
952 assert_eq!(map.len(), 8);
953 assert_eq!(map.get(&5), Some(&50));
954
955 map.zeroize();
957
958 assert_eq!(map.len(), 0);
959 assert!(map.is_empty());
960 }
961
962 #[cfg(not(miri))]
965 const MAP_SLOTS: usize = 4096;
966 #[cfg(miri)]
967 const MAP_SLOTS: usize = 64;
968 fn almost_filled_map() -> LinearMap<usize, usize, MAP_SLOTS> {
969 let mut almost_filled = LinearMap::new();
970 for i in 1..MAP_SLOTS {
971 almost_filled.insert(i, i).unwrap();
972 }
973 almost_filled
974 }
975
976 #[test]
977 fn remove() {
978 let mut src = almost_filled_map();
979 let k = 0;
981 let r = src.remove(&k);
982 assert!(r.is_none());
983
984 let k = 5;
985 let v = 5;
986 let r = src.remove(&k);
987 assert_eq!(r, Some(v));
988 let r = src.remove(&k);
989 assert!(r.is_none());
990 assert_eq!(src.len(), MAP_SLOTS - 2);
991 }
992
993 #[test]
994 fn replace() {
995 let mut src = almost_filled_map();
996 src.insert(10, 1000).unwrap();
997 let v = src.get(&10).unwrap();
998 assert_eq!(*v, 1000);
999
1000 let mut src = almost_filled_map();
1001 let v = src.get_mut(&10).unwrap();
1002 *v = 500;
1003 let v = src.get(&10).unwrap();
1004 assert_eq!(*v, 500);
1005 }
1006
1007 #[test]
1008 fn retain() {
1009 let mut src = almost_filled_map();
1010 src.retain(|k, _v| k % 2 == 0);
1011 src.retain(|k, _v| k % 3 == 0);
1012
1013 for (k, v) in src.iter() {
1014 assert_eq!(k, v);
1015 assert_eq!(k % 2, 0);
1016 assert_eq!(k % 3, 0);
1017 }
1018
1019 let mut src = almost_filled_map();
1020 src.retain(|_k, _v| false);
1021 assert!(src.is_empty());
1022
1023 let mut src = almost_filled_map();
1024 src.retain(|_k, _v| true);
1025 assert_eq!(src.len(), MAP_SLOTS - 1);
1026 src.insert(0, 0).unwrap();
1027 src.retain(|_k, _v| true);
1028 assert_eq!(src.len(), MAP_SLOTS);
1029 }
1030
1031 #[test]
1032 fn entry_find() {
1033 let key = 0;
1034 let value = 0;
1035 let mut src = almost_filled_map();
1036 let entry = src.entry(key);
1037 match entry {
1038 Entry::Occupied(_) => {
1039 panic!("Found entry without inserting");
1040 }
1041 Entry::Vacant(v) => {
1042 assert_eq!(&key, v.key());
1043 assert_eq!(key, v.into_key());
1044 }
1045 }
1046 src.insert(key, value).unwrap();
1047 let entry = src.entry(key);
1048 match entry {
1049 Entry::Occupied(mut o) => {
1050 assert_eq!(&key, o.key());
1051 assert_eq!(&value, o.get());
1052 assert_eq!(&value, o.get_mut());
1053 assert_eq!(&value, o.into_mut());
1054 }
1055 Entry::Vacant(_) => {
1056 panic!("Entry not found");
1057 }
1058 }
1059 }
1060
1061 #[test]
1062 fn entry_vacant_insert() {
1063 let key = 0;
1064 let value = 0;
1065 let mut src = almost_filled_map();
1066 assert_eq!(MAP_SLOTS - 1, src.len());
1067 let entry = src.entry(key);
1068 match entry {
1069 Entry::Occupied(_) => {
1070 panic!("Entry found when empty");
1071 }
1072 Entry::Vacant(v) => {
1073 assert_eq!(value, *v.insert(value).unwrap());
1074 }
1075 };
1076 assert_eq!(value, *src.get(&key).unwrap());
1077 }
1078
1079 #[test]
1080 fn entry_vacant_full_insert() {
1081 let mut src = almost_filled_map();
1082
1083 let key = MAP_SLOTS * 2;
1085 let value = key;
1086 src.insert(key, value).unwrap();
1087 assert_eq!(MAP_SLOTS, src.len());
1088
1089 let key = 0;
1090 let value = 0;
1091 let entry = src.entry(key);
1092 match entry {
1093 Entry::Occupied(_) => {
1094 panic!("Entry found when missing");
1095 }
1096 Entry::Vacant(v) => {
1097 assert_eq!(value, v.insert(value).unwrap_err());
1099 }
1100 };
1101 assert!(src.get(&key).is_none());
1102 }
1103
1104 #[test]
1105 fn entry_occupied_insert() {
1106 let key = 0;
1107 let value = 0;
1108 let value2 = 5;
1109 let mut src = almost_filled_map();
1110 assert_eq!(MAP_SLOTS - 1, src.len());
1111 src.insert(key, value).unwrap();
1112 let entry = src.entry(key);
1113 match entry {
1114 Entry::Occupied(o) => {
1115 assert_eq!(value, o.insert(value2));
1116 }
1117 Entry::Vacant(_) => {
1118 panic!("Entry not found");
1119 }
1120 };
1121 assert_eq!(value2, *src.get(&key).unwrap());
1122 }
1123
1124 #[test]
1125 fn entry_remove_entry() {
1126 let key = 0;
1127 let value = 0;
1128 let mut src = almost_filled_map();
1129 src.insert(key, value).unwrap();
1130 assert_eq!(MAP_SLOTS, src.len());
1131 let entry = src.entry(key);
1132 match entry {
1133 Entry::Occupied(o) => {
1134 assert_eq!((key, value), o.remove_entry());
1135 }
1136 Entry::Vacant(_) => {
1137 panic!("Entry not found")
1138 }
1139 };
1140 assert_eq!(MAP_SLOTS - 1, src.len());
1141 assert!(!src.contains_key(&key));
1142 }
1143
1144 #[test]
1145 fn entry_remove() {
1146 let key = 0;
1147 let value = 0;
1148 let mut src = almost_filled_map();
1149 src.insert(key, value).unwrap();
1150 assert_eq!(MAP_SLOTS, src.len());
1151 let entry = src.entry(key);
1152 match entry {
1153 Entry::Occupied(o) => {
1154 assert_eq!(value, o.remove());
1155 }
1156 Entry::Vacant(_) => {
1157 panic!("Entry not found");
1158 }
1159 };
1160 assert_eq!(MAP_SLOTS - 1, src.len());
1161 }
1162}