@@ -861,6 +861,34 @@ impl<K, V, S> HashMap<K, V, S>
861
861
Values { inner : self . iter ( ) }
862
862
}
863
863
864
+ /// An iterator visiting all values mutably in arbitrary order.
865
+ /// Iterator element type is `&'a mut V`.
866
+ ///
867
+ /// # Examples
868
+ ///
869
+ /// ```
870
+ /// # #![feature(map_values_mut)]
871
+ /// use std::collections::HashMap;
872
+ ///
873
+ /// let mut map = HashMap::new();
874
+ ///
875
+ /// map.insert("a", 1);
876
+ /// map.insert("b", 2);
877
+ /// map.insert("c", 3);
878
+ ///
879
+ /// for val in map.values_mut() {
880
+ /// *val = *val + 10;
881
+ /// }
882
+ ///
883
+ /// for val in map.values() {
884
+ /// print!("{}", val);
885
+ /// }
886
+ /// ```
887
+ #[ unstable( feature = "map_values_mut" , reason = "recently added" , issue = "32551" ) ]
888
+ pub fn values_mut < ' a > ( & ' a mut self ) -> ValuesMut < ' a , K , V > {
889
+ ValuesMut { inner : self . iter_mut ( ) }
890
+ }
891
+
864
892
/// An iterator visiting all key-value pairs in arbitrary order.
865
893
/// Iterator element type is `(&'a K, &'a V)`.
866
894
///
@@ -1262,6 +1290,12 @@ pub struct Drain<'a, K: 'a, V: 'a> {
1262
1290
inner : table:: Drain < ' a , K , V >
1263
1291
}
1264
1292
1293
+ /// Mutable HashMap values iterator.
1294
+ #[ unstable( feature = "map_values_mut" , reason = "recently added" , issue = "32551" ) ]
1295
+ pub struct ValuesMut < ' a , K : ' a , V : ' a > {
1296
+ inner : IterMut < ' a , K , V >
1297
+ }
1298
+
1265
1299
enum InternalEntry < K , V , M > {
1266
1300
Occupied {
1267
1301
elem : FullBucket < K , V , M > ,
@@ -1460,6 +1494,18 @@ impl<'a, K, V> ExactSizeIterator for Values<'a, K, V> {
1460
1494
#[ inline] fn len ( & self ) -> usize { self . inner . len ( ) }
1461
1495
}
1462
1496
1497
+ #[ unstable( feature = "map_values_mut" , reason = "recently added" , issue = "32551" ) ]
1498
+ impl < ' a , K , V > Iterator for ValuesMut < ' a , K , V > {
1499
+ type Item = & ' a mut V ;
1500
+
1501
+ #[ inline] fn next ( & mut self ) -> Option < ( & ' a mut V ) > { self . inner . next ( ) . map ( |( _, v) | v) }
1502
+ #[ inline] fn size_hint ( & self ) -> ( usize , Option < usize > ) { self . inner . size_hint ( ) }
1503
+ }
1504
+ #[ unstable( feature = "map_values_mut" , reason = "recently added" , issue = "32551" ) ]
1505
+ impl < ' a , K , V > ExactSizeIterator for ValuesMut < ' a , K , V > {
1506
+ #[ inline] fn len ( & self ) -> usize { self . inner . len ( ) }
1507
+ }
1508
+
1463
1509
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
1464
1510
impl < ' a , K , V > Iterator for Drain < ' a , K , V > {
1465
1511
type Item = ( K , V ) ;
@@ -1907,6 +1953,7 @@ mod test_map {
1907
1953
assert_eq ! ( m. drain( ) . next( ) , None ) ;
1908
1954
assert_eq ! ( m. keys( ) . next( ) , None ) ;
1909
1955
assert_eq ! ( m. values( ) . next( ) , None ) ;
1956
+ assert_eq ! ( m. values_mut( ) . next( ) , None ) ;
1910
1957
assert_eq ! ( m. iter( ) . next( ) , None ) ;
1911
1958
assert_eq ! ( m. iter_mut( ) . next( ) , None ) ;
1912
1959
assert_eq ! ( m. len( ) , 0 ) ;
@@ -2083,6 +2130,20 @@ mod test_map {
2083
2130
assert ! ( values. contains( & 'c' ) ) ;
2084
2131
}
2085
2132
2133
+ #[ test]
2134
+ fn test_values_mut ( ) {
2135
+ let vec = vec ! [ ( 1 , 1 ) , ( 2 , 2 ) , ( 3 , 3 ) ] ;
2136
+ let mut map: HashMap < _ , _ > = vec. into_iter ( ) . collect ( ) ;
2137
+ for value in map. values_mut ( ) {
2138
+ * value = ( * value) * 2
2139
+ }
2140
+ let values: Vec < _ > = map. values ( ) . cloned ( ) . collect ( ) ;
2141
+ assert_eq ! ( values. len( ) , 3 ) ;
2142
+ assert ! ( values. contains( & 2 ) ) ;
2143
+ assert ! ( values. contains( & 4 ) ) ;
2144
+ assert ! ( values. contains( & 6 ) ) ;
2145
+ }
2146
+
2086
2147
#[ test]
2087
2148
fn test_find ( ) {
2088
2149
let mut m = HashMap :: new ( ) ;
0 commit comments