@@ -861,6 +861,34 @@ impl<K, V, S> HashMap<K, V, S>
861861 Values { inner : self . iter ( ) }
862862 }
863863
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+
864892 /// An iterator visiting all key-value pairs in arbitrary order.
865893 /// Iterator element type is `(&'a K, &'a V)`.
866894 ///
@@ -1262,6 +1290,12 @@ pub struct Drain<'a, K: 'a, V: 'a> {
12621290 inner : table:: Drain < ' a , K , V >
12631291}
12641292
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+
12651299enum InternalEntry < K , V , M > {
12661300 Occupied {
12671301 elem : FullBucket < K , V , M > ,
@@ -1460,6 +1494,18 @@ impl<'a, K, V> ExactSizeIterator for Values<'a, K, V> {
14601494 #[ inline] fn len ( & self ) -> usize { self . inner . len ( ) }
14611495}
14621496
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+
14631509#[ stable( feature = "rust1" , since = "1.0.0" ) ]
14641510impl < ' a , K , V > Iterator for Drain < ' a , K , V > {
14651511 type Item = ( K , V ) ;
@@ -1907,6 +1953,7 @@ mod test_map {
19071953 assert_eq ! ( m. drain( ) . next( ) , None ) ;
19081954 assert_eq ! ( m. keys( ) . next( ) , None ) ;
19091955 assert_eq ! ( m. values( ) . next( ) , None ) ;
1956+ assert_eq ! ( m. values_mut( ) . next( ) , None ) ;
19101957 assert_eq ! ( m. iter( ) . next( ) , None ) ;
19111958 assert_eq ! ( m. iter_mut( ) . next( ) , None ) ;
19121959 assert_eq ! ( m. len( ) , 0 ) ;
@@ -2083,6 +2130,20 @@ mod test_map {
20832130 assert ! ( values. contains( & 'c' ) ) ;
20842131 }
20852132
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+
20862147 #[ test]
20872148 fn test_find ( ) {
20882149 let mut m = HashMap :: new ( ) ;
0 commit comments