@@ -501,6 +501,16 @@ where
501
501
} ) ,
502
502
}
503
503
}
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
+ }
504
514
}
505
515
506
516
impl < K , V , Q , S : LinearMapStorage < K , V > + ?Sized > ops:: Index < & ' _ Q > for LinearMapInner < K , V , S >
@@ -932,6 +942,30 @@ mod test {
932
942
assert_eq ! ( * v, 500 ) ;
933
943
}
934
944
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
+
935
969
#[ test]
936
970
fn entry_find ( ) {
937
971
let key = 0 ;
0 commit comments