@@ -509,6 +509,16 @@ where
509509 } ) ,
510510 }
511511 }
512+
513+ /// Retains only the elements specified by the predicate.
514+ ///
515+ /// In other words, remove all pairs `(k, v)` for which `f(&k, &mut v)` returns `false`.
516+ pub fn retain < F > ( & mut self , mut f : F )
517+ where
518+ F : FnMut ( & K , & mut V ) -> bool ,
519+ {
520+ self . buffer . retain_mut ( |( k, v) | f ( k, v) ) ;
521+ }
512522}
513523
514524impl < K , V , Q , S : LinearMapStorage < K , V > + ?Sized > ops:: Index < & ' _ Q > for LinearMapInner < K , V , S >
@@ -960,6 +970,30 @@ mod test {
960970 assert_eq ! ( * v, 500 ) ;
961971 }
962972
973+ #[ test]
974+ fn retain ( ) {
975+ let mut src = almost_filled_map ( ) ;
976+ src. retain ( |k, _v| k % 2 == 0 ) ;
977+ src. retain ( |k, _v| k % 3 == 0 ) ;
978+
979+ for ( k, v) in src. iter ( ) {
980+ assert_eq ! ( k, v) ;
981+ assert_eq ! ( k % 2 , 0 ) ;
982+ assert_eq ! ( k % 3 , 0 ) ;
983+ }
984+
985+ let mut src = almost_filled_map ( ) ;
986+ src. retain ( |_k, _v| false ) ;
987+ assert ! ( src. is_empty( ) ) ;
988+
989+ let mut src = almost_filled_map ( ) ;
990+ src. retain ( |_k, _v| true ) ;
991+ assert_eq ! ( src. len( ) , MAP_SLOTS - 1 ) ;
992+ src. insert ( 0 , 0 ) . unwrap ( ) ;
993+ src. retain ( |_k, _v| true ) ;
994+ assert_eq ! ( src. len( ) , MAP_SLOTS ) ;
995+ }
996+
963997 #[ test]
964998 fn entry_find ( ) {
965999 let key = 0 ;
0 commit comments