@@ -501,6 +501,16 @@ where
501501 } ) ,
502502 }
503503 }
504+
505+ /// Retains only the elements specified by the predicate.
506+ ///
507+ /// In other words, remove all pairs `(k, v)` for which `f(&k, &mut v)` returns `false`.
508+ pub fn retain < F > ( & mut self , mut f : F )
509+ where
510+ F : FnMut ( & K , & mut V ) -> bool ,
511+ {
512+ self . buffer . retain_mut ( |( k, v) | f ( k, v) ) ;
513+ }
504514}
505515
506516impl < K , V , Q , S : LinearMapStorage < K , V > + ?Sized > ops:: Index < & ' _ Q > for LinearMapInner < K , V , S >
@@ -932,6 +942,30 @@ mod test {
932942 assert_eq ! ( * v, 500 ) ;
933943 }
934944
945+ #[ test]
946+ fn retain ( ) {
947+ let mut src = almost_filled_map ( ) ;
948+ src. retain ( |k, _v| k % 2 == 0 ) ;
949+ src. retain ( |k, _v| k % 3 == 0 ) ;
950+
951+ for ( k, v) in src. iter ( ) {
952+ assert_eq ! ( k, v) ;
953+ assert_eq ! ( k % 2 , 0 ) ;
954+ assert_eq ! ( k % 3 , 0 ) ;
955+ }
956+
957+ let mut src = almost_filled_map ( ) ;
958+ src. retain ( |_k, _v| false ) ;
959+ assert ! ( src. is_empty( ) ) ;
960+
961+ let mut src = almost_filled_map ( ) ;
962+ src. retain ( |_k, _v| true ) ;
963+ assert_eq ! ( src. len( ) , MAP_SLOTS - 1 ) ;
964+ src. insert ( 0 , 0 ) . unwrap ( ) ;
965+ src. retain ( |_k, _v| true ) ;
966+ assert_eq ! ( src. len( ) , MAP_SLOTS ) ;
967+ }
968+
935969 #[ test]
936970 fn entry_find ( ) {
937971 let key = 0 ;
0 commit comments