@@ -495,6 +495,16 @@ where
495
495
None => Entry :: Vacant ( VacantEntry { key, map : self } ) ,
496
496
}
497
497
}
498
+
499
+ /// Retains only the elements specified by the predicate.
500
+ ///
501
+ /// In other words, remove all pairs `(k, v)` for which `f(&k, &mut v)` returns `false`.
502
+ pub fn retain < F > ( & mut self , mut f : F )
503
+ where
504
+ F : FnMut ( & K , & mut V ) -> bool ,
505
+ {
506
+ self . buffer . retain_mut ( |( k, v) | f ( k, v) ) ;
507
+ }
498
508
}
499
509
500
510
impl < K , V , Q , S : LinearMapStorage < K , V > + ?Sized > ops:: Index < & ' _ Q > for LinearMapInner < K , V , S >
@@ -926,6 +936,30 @@ mod test {
926
936
assert_eq ! ( * v, 500 ) ;
927
937
}
928
938
939
+ #[ test]
940
+ fn retain ( ) {
941
+ let mut src = almost_filled_map ( ) ;
942
+ src. retain ( |k, _v| k % 2 == 0 ) ;
943
+ src. retain ( |k, _v| k % 3 == 0 ) ;
944
+
945
+ for ( k, v) in src. iter ( ) {
946
+ assert_eq ! ( k, v) ;
947
+ assert_eq ! ( k % 2 , 0 ) ;
948
+ assert_eq ! ( k % 3 , 0 ) ;
949
+ }
950
+
951
+ let mut src = almost_filled_map ( ) ;
952
+ src. retain ( |_k, _v| false ) ;
953
+ assert ! ( src. is_empty( ) ) ;
954
+
955
+ let mut src = almost_filled_map ( ) ;
956
+ src. retain ( |_k, _v| true ) ;
957
+ assert_eq ! ( src. len( ) , MAP_SLOTS - 1 ) ;
958
+ src. insert ( 0 , 0 ) . unwrap ( ) ;
959
+ src. retain ( |_k, _v| true ) ;
960
+ assert_eq ! ( src. len( ) , MAP_SLOTS ) ;
961
+ }
962
+
929
963
#[ test]
930
964
fn entry_find ( ) {
931
965
let key = 0 ;
0 commit comments