@@ -15,7 +15,7 @@ use borrow::Borrow;
15
15
use cmp:: max;
16
16
use fmt:: { self , Debug } ;
17
17
use hash:: { Hash , SipHasher , BuildHasher } ;
18
- use iter:: { self , Map , FromIterator } ;
18
+ use iter:: FromIterator ;
19
19
use mem:: { self , replace} ;
20
20
use ops:: { Deref , Index } ;
21
21
use rand:: { self , Rng } ;
@@ -836,8 +836,7 @@ impl<K, V, S> HashMap<K, V, S>
836
836
/// ```
837
837
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
838
838
pub fn keys < ' a > ( & ' a self ) -> Keys < ' a , K , V > {
839
- fn first < A , B > ( ( a, _) : ( A , B ) ) -> A { a }
840
- Keys { inner : self . iter ( ) . map ( first) }
839
+ Keys { inner : self . iter ( ) }
841
840
}
842
841
843
842
/// An iterator visiting all values in arbitrary order.
@@ -859,8 +858,7 @@ impl<K, V, S> HashMap<K, V, S>
859
858
/// ```
860
859
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
861
860
pub fn values < ' a > ( & ' a self ) -> Values < ' a , K , V > {
862
- fn second < A , B > ( ( _, b) : ( A , B ) ) -> B { b }
863
- Values { inner : self . iter ( ) . map ( second) }
861
+ Values { inner : self . iter ( ) }
864
862
}
865
863
866
864
/// An iterator visiting all key-value pairs in arbitrary order.
@@ -992,9 +990,8 @@ impl<K, V, S> HashMap<K, V, S>
992
990
#[ inline]
993
991
#[ stable( feature = "drain" , since = "1.6.0" ) ]
994
992
pub fn drain ( & mut self ) -> Drain < K , V > {
995
- fn last_two < A , B , C > ( ( _, b, c) : ( A , B , C ) ) -> ( B , C ) { ( b, c) }
996
993
Drain {
997
- inner : self . table . drain ( ) . map ( last_two ) ,
994
+ inner : self . table . drain ( ) ,
998
995
}
999
996
}
1000
997
@@ -1224,13 +1221,13 @@ pub struct IterMut<'a, K: 'a, V: 'a> {
1224
1221
/// HashMap move iterator.
1225
1222
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
1226
1223
pub struct IntoIter < K , V > {
1227
- inner : iter :: Map < table:: IntoIter < K , V > , fn ( ( SafeHash , K , V ) ) -> ( K , V ) >
1224
+ inner : table:: IntoIter < K , V >
1228
1225
}
1229
1226
1230
1227
/// HashMap keys iterator.
1231
1228
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
1232
1229
pub struct Keys < ' a , K : ' a , V : ' a > {
1233
- inner : Map < Iter < ' a , K , V > , fn ( ( & ' a K , & ' a V ) ) -> & ' a K >
1230
+ inner : Iter < ' a , K , V >
1234
1231
}
1235
1232
1236
1233
// FIXME(#19839) Remove in favor of `#[derive(Clone)]`
@@ -1246,7 +1243,7 @@ impl<'a, K, V> Clone for Keys<'a, K, V> {
1246
1243
/// HashMap values iterator.
1247
1244
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
1248
1245
pub struct Values < ' a , K : ' a , V : ' a > {
1249
- inner : Map < Iter < ' a , K , V > , fn ( ( & ' a K , & ' a V ) ) -> & ' a V >
1246
+ inner : Iter < ' a , K , V >
1250
1247
}
1251
1248
1252
1249
// FIXME(#19839) Remove in favor of `#[derive(Clone)]`
@@ -1262,7 +1259,7 @@ impl<'a, K, V> Clone for Values<'a, K, V> {
1262
1259
/// HashMap drain iterator.
1263
1260
#[ stable( feature = "drain" , since = "1.6.0" ) ]
1264
1261
pub struct Drain < ' a , K : ' a , V : ' a > {
1265
- inner : iter :: Map < table:: Drain < ' a , K , V > , fn ( ( SafeHash , K , V ) ) -> ( K , V ) >
1262
+ inner : table:: Drain < ' a , K , V >
1266
1263
}
1267
1264
1268
1265
enum InternalEntry < K , V , M > {
@@ -1397,9 +1394,8 @@ impl<K, V, S> IntoIterator for HashMap<K, V, S>
1397
1394
/// let vec: Vec<(&str, isize)> = map.into_iter().collect();
1398
1395
/// ```
1399
1396
fn into_iter ( self ) -> IntoIter < K , V > {
1400
- fn last_two < A , B , C > ( ( _, b, c) : ( A , B , C ) ) -> ( B , C ) { ( b, c) }
1401
1397
IntoIter {
1402
- inner : self . table . into_iter ( ) . map ( last_two )
1398
+ inner : self . table . into_iter ( )
1403
1399
}
1404
1400
}
1405
1401
}
@@ -1432,7 +1428,7 @@ impl<'a, K, V> ExactSizeIterator for IterMut<'a, K, V> {
1432
1428
impl < K , V > Iterator for IntoIter < K , V > {
1433
1429
type Item = ( K , V ) ;
1434
1430
1435
- #[ inline] fn next ( & mut self ) -> Option < ( K , V ) > { self . inner . next ( ) }
1431
+ #[ inline] fn next ( & mut self ) -> Option < ( K , V ) > { self . inner . next ( ) . map ( | ( _ , k , v ) | ( k , v ) ) }
1436
1432
#[ inline] fn size_hint ( & self ) -> ( usize , Option < usize > ) { self . inner . size_hint ( ) }
1437
1433
}
1438
1434
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
@@ -1444,7 +1440,7 @@ impl<K, V> ExactSizeIterator for IntoIter<K, V> {
1444
1440
impl < ' a , K , V > Iterator for Keys < ' a , K , V > {
1445
1441
type Item = & ' a K ;
1446
1442
1447
- #[ inline] fn next ( & mut self ) -> Option < ( & ' a K ) > { self . inner . next ( ) }
1443
+ #[ inline] fn next ( & mut self ) -> Option < ( & ' a K ) > { self . inner . next ( ) . map ( | ( k , _ ) | k ) }
1448
1444
#[ inline] fn size_hint ( & self ) -> ( usize , Option < usize > ) { self . inner . size_hint ( ) }
1449
1445
}
1450
1446
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
@@ -1456,7 +1452,7 @@ impl<'a, K, V> ExactSizeIterator for Keys<'a, K, V> {
1456
1452
impl < ' a , K , V > Iterator for Values < ' a , K , V > {
1457
1453
type Item = & ' a V ;
1458
1454
1459
- #[ inline] fn next ( & mut self ) -> Option < ( & ' a V ) > { self . inner . next ( ) }
1455
+ #[ inline] fn next ( & mut self ) -> Option < ( & ' a V ) > { self . inner . next ( ) . map ( | ( _ , v ) | v ) }
1460
1456
#[ inline] fn size_hint ( & self ) -> ( usize , Option < usize > ) { self . inner . size_hint ( ) }
1461
1457
}
1462
1458
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
@@ -1468,7 +1464,7 @@ impl<'a, K, V> ExactSizeIterator for Values<'a, K, V> {
1468
1464
impl < ' a , K , V > Iterator for Drain < ' a , K , V > {
1469
1465
type Item = ( K , V ) ;
1470
1466
1471
- #[ inline] fn next ( & mut self ) -> Option < ( K , V ) > { self . inner . next ( ) }
1467
+ #[ inline] fn next ( & mut self ) -> Option < ( K , V ) > { self . inner . next ( ) . map ( | ( _ , k , v ) | ( k , v ) ) }
1472
1468
#[ inline] fn size_hint ( & self ) -> ( usize , Option < usize > ) { self . inner . size_hint ( ) }
1473
1469
}
1474
1470
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
@@ -1674,6 +1670,20 @@ impl<K, S, Q: ?Sized> super::Recover<Q> for HashMap<K, (), S>
1674
1670
}
1675
1671
}
1676
1672
1673
+ #[ allow( dead_code) ]
1674
+ fn assert_covariance ( ) {
1675
+ fn map_key < ' new > ( v : HashMap < & ' static str , u8 > ) -> HashMap < & ' new str , u8 > { v }
1676
+ fn map_val < ' new > ( v : HashMap < u8 , & ' static str > ) -> HashMap < u8 , & ' new str > { v }
1677
+ fn iter_key < ' a , ' new > ( v : Iter < ' a , & ' static str , u8 > ) -> Iter < ' a , & ' new str , u8 > { v }
1678
+ fn iter_val < ' a , ' new > ( v : Iter < ' a , u8 , & ' static str > ) -> Iter < ' a , u8 , & ' new str > { v }
1679
+ fn into_iter_key < ' new > ( v : IntoIter < & ' static str , u8 > ) -> IntoIter < & ' new str , u8 > { v }
1680
+ fn into_iter_val < ' new > ( v : IntoIter < u8 , & ' static str > ) -> IntoIter < u8 , & ' new str > { v }
1681
+ fn keys_key < ' a , ' new > ( v : Keys < ' a , & ' static str , u8 > ) -> Keys < ' a , & ' new str , u8 > { v }
1682
+ fn keys_val < ' a , ' new > ( v : Keys < ' a , u8 , & ' static str > ) -> Keys < ' a , u8 , & ' new str > { v }
1683
+ fn values_key < ' a , ' new > ( v : Values < ' a , & ' static str , u8 > ) -> Values < ' a , & ' new str , u8 > { v }
1684
+ fn values_val < ' a , ' new > ( v : Values < ' a , u8 , & ' static str > ) -> Values < ' a , u8 , & ' new str > { v }
1685
+ }
1686
+
1677
1687
#[ cfg( test) ]
1678
1688
mod test_map {
1679
1689
use prelude:: v1:: * ;
0 commit comments