@@ -731,7 +731,7 @@ impl<T> StableVec<T> {
731731 /// }
732732 /// ```
733733 pub fn iter ( & self ) -> Iter < T > {
734- Iter { sv : self , pos : 0 }
734+ Iter { sv : self , pos : 0 , count : self . used_count }
735735 }
736736
737737 /// Returns an iterator over mutable references to the existing elements
@@ -781,6 +781,7 @@ impl<T> StableVec<T> {
781781 pub fn iter_mut ( & mut self ) -> IterMut < T > {
782782 IterMut {
783783 deleted : & mut self . deleted ,
784+ count : self . used_count ,
784785 used_count : & mut self . used_count ,
785786 vec_iter : self . data . iter_mut ( ) ,
786787 pos : 0 ,
@@ -817,6 +818,7 @@ impl<T> StableVec<T> {
817818 Keys {
818819 deleted : & self . deleted ,
819820 pos : 0 ,
821+ count : self . used_count ,
820822 }
821823 }
822824
@@ -884,8 +886,8 @@ impl<T> StableVec<T> {
884886
885887 /// Retains only the elements specified by the given predicate.
886888 ///
887- /// Each element `e` for which `predicate (&e)` returns `false` is removed
888- /// from the stable vector.
889+ /// Each element `e` for which `should_be_kept (&e)` returns `false` is
890+ /// removed from the stable vector.
889891 ///
890892 /// # Example
891893 ///
@@ -896,14 +898,15 @@ impl<T> StableVec<T> {
896898 ///
897899 /// assert_eq!(sv, &[2, 4] as &[_]);
898900 /// ```
899- pub fn retain < P > ( & mut self , mut predicate : P )
901+ pub fn retain < P > ( & mut self , mut should_be_kept : P )
900902 where
901903 P : FnMut ( & T ) -> bool ,
902904 {
903- let mut it = self . iter_mut ( ) ;
904- while let Some ( e) = it. next ( ) {
905- if !predicate ( e) {
906- it. remove_current ( ) ;
905+ let mut pos = 0 ;
906+
907+ while let Some ( idx) = next_valid_index ( & mut pos, & self . deleted ) {
908+ if !should_be_kept ( & self [ idx] ) {
909+ self . remove ( idx) ;
907910 }
908911 }
909912 }
@@ -1068,16 +1071,28 @@ impl<'a, T> IntoIterator for &'a mut StableVec<T> {
10681071pub struct Iter < ' a , T : ' a > {
10691072 sv : & ' a StableVec < T > ,
10701073 pos : usize ,
1074+ count : usize ,
10711075}
10721076
10731077impl < ' a , T : ' a > Iterator for Iter < ' a , T > {
10741078 type Item = & ' a T ;
10751079 fn next ( & mut self ) -> Option < Self :: Item > {
1076- next_valid_index ( & mut self . pos , & self . sv . deleted )
1077- . map ( |i| & self . sv . data [ i] )
1080+ let out = next_valid_index ( & mut self . pos , & self . sv . deleted )
1081+ . map ( |i| & self . sv . data [ i] ) ;
1082+ if out. is_some ( ) {
1083+ self . count -= 1 ;
1084+ }
1085+
1086+ out
1087+ }
1088+
1089+ fn size_hint ( & self ) -> ( usize , Option < usize > ) {
1090+ ( self . count , Some ( self . count ) )
10781091 }
10791092}
10801093
1094+ impl < T > ExactSizeIterator for Iter < ' _ , T > { }
1095+
10811096/// Iterator over mutable references to the elements of a `StableVec`.
10821097///
10831098/// Use the method [`StableVec::iter_mut()`](struct.StableVec.html#method.iter_mut)
@@ -1089,6 +1104,7 @@ pub struct IterMut<'a, T: 'a> {
10891104 used_count : & ' a mut usize ,
10901105 vec_iter : :: std:: slice:: IterMut < ' a , T > ,
10911106 pos : usize ,
1107+ count : usize ,
10921108}
10931109
10941110impl < ' a , T : ' a > IterMut < ' a , T > {
@@ -1124,11 +1140,19 @@ impl<'a, T> Iterator for IterMut<'a, T> {
11241140 } else {
11251141 // Advance the iterator by one and return current element.
11261142 self . pos += 1 ;
1143+ self . count -= 1 ;
11271144 self . vec_iter . next ( )
11281145 }
11291146 }
1147+
1148+ fn size_hint ( & self ) -> ( usize , Option < usize > ) {
1149+ ( self . count , Some ( self . count ) )
1150+ }
11301151}
11311152
1153+ impl < T > ExactSizeIterator for IterMut < ' _ , T > { }
1154+
1155+
11321156/// Iterator over all valid indices of a `StableVec`.
11331157///
11341158/// Use the method [`StableVec::keys()`](struct.StableVec.html#method.keys) to
@@ -1137,15 +1161,27 @@ impl<'a, T> Iterator for IterMut<'a, T> {
11371161pub struct Keys < ' a > {
11381162 deleted : & ' a BitVec ,
11391163 pos : usize ,
1164+ count : usize ,
11401165}
11411166
11421167impl < ' a > Iterator for Keys < ' a > {
11431168 type Item = usize ;
11441169 fn next ( & mut self ) -> Option < Self :: Item > {
1145- next_valid_index ( & mut self . pos , self . deleted )
1170+ let out = next_valid_index ( & mut self . pos , self . deleted ) ;
1171+ if out. is_some ( ) {
1172+ self . count -= 1 ;
1173+ }
1174+
1175+ out
1176+ }
1177+
1178+ fn size_hint ( & self ) -> ( usize , Option < usize > ) {
1179+ ( self . count , Some ( self . count ) )
11461180 }
11471181}
11481182
1183+ impl ExactSizeIterator for Keys < ' _ > { }
1184+
11491185/// Advances the index `pos` while it points to a deleted element. Stops
11501186/// advancing once an existing element is found or the end is reached. In the
11511187/// former case, this element's index is returned; in the latter case, `None`
0 commit comments