@@ -20,7 +20,7 @@ use cmp::{max, Eq, PartialEq};
2020use default:: Default ;
2121use fmt:: { self , Show } ;
2222use hash:: { self , Hash , SipHasher } ;
23- use iter:: { self , Iterator , IteratorExt , FromIterator , Extend , Map } ;
23+ use iter:: { self , Iterator , ExactSizeIterator , IteratorExt , FromIterator , Extend , Map } ;
2424use marker:: Sized ;
2525use mem:: { self , replace} ;
2626use num:: { Int , UnsignedInt } ;
@@ -1384,53 +1384,71 @@ impl<'a, K, V> Iterator for Iter<'a, K, V> {
13841384 type Item = ( & ' a K , & ' a V ) ;
13851385
13861386 #[ inline] fn next ( & mut self ) -> Option < ( & ' a K , & ' a V ) > { self . inner . next ( ) }
1387- #[ inline] fn size_hint ( & self ) -> ( uint , Option < uint > ) { self . inner . size_hint ( ) }
1387+ #[ inline] fn size_hint ( & self ) -> ( usize , Option < usize > ) { self . inner . size_hint ( ) }
1388+ }
1389+ #[ stable]
1390+ impl < ' a , K , V > ExactSizeIterator for Iter < ' a , K , V > {
1391+ #[ inline] fn len ( & self ) -> usize { self . inner . len ( ) }
13881392}
13891393
13901394#[ stable]
13911395impl < ' a , K , V > Iterator for IterMut < ' a , K , V > {
13921396 type Item = ( & ' a K , & ' a mut V ) ;
13931397
13941398 #[ inline] fn next ( & mut self ) -> Option < ( & ' a K , & ' a mut V ) > { self . inner . next ( ) }
1395- #[ inline] fn size_hint ( & self ) -> ( uint , Option < uint > ) { self . inner . size_hint ( ) }
1399+ #[ inline] fn size_hint ( & self ) -> ( usize , Option < usize > ) { self . inner . size_hint ( ) }
1400+ }
1401+ #[ stable]
1402+ impl < ' a , K , V > ExactSizeIterator for IterMut < ' a , K , V > {
1403+ #[ inline] fn len ( & self ) -> usize { self . inner . len ( ) }
13961404}
13971405
13981406#[ stable]
13991407impl < K , V > Iterator for IntoIter < K , V > {
14001408 type Item = ( K , V ) ;
14011409
14021410 #[ inline] fn next ( & mut self ) -> Option < ( K , V ) > { self . inner . next ( ) }
1403- #[ inline] fn size_hint ( & self ) -> ( uint , Option < uint > ) { self . inner . size_hint ( ) }
1411+ #[ inline] fn size_hint ( & self ) -> ( usize , Option < usize > ) { self . inner . size_hint ( ) }
1412+ }
1413+ #[ stable]
1414+ impl < K , V > ExactSizeIterator for IntoIter < K , V > {
1415+ #[ inline] fn len ( & self ) -> usize { self . inner . len ( ) }
14041416}
14051417
14061418#[ stable]
14071419impl < ' a , K , V > Iterator for Keys < ' a , K , V > {
14081420 type Item = & ' a K ;
14091421
14101422 #[ inline] fn next ( & mut self ) -> Option < ( & ' a K ) > { self . inner . next ( ) }
1411- #[ inline] fn size_hint ( & self ) -> ( uint , Option < uint > ) { self . inner . size_hint ( ) }
1423+ #[ inline] fn size_hint ( & self ) -> ( usize , Option < usize > ) { self . inner . size_hint ( ) }
1424+ }
1425+ #[ stable]
1426+ impl < ' a , K , V > ExactSizeIterator for Keys < ' a , K , V > {
1427+ #[ inline] fn len ( & self ) -> usize { self . inner . len ( ) }
14121428}
14131429
14141430#[ stable]
14151431impl < ' a , K , V > Iterator for Values < ' a , K , V > {
14161432 type Item = & ' a V ;
14171433
14181434 #[ inline] fn next ( & mut self ) -> Option < ( & ' a V ) > { self . inner . next ( ) }
1419- #[ inline] fn size_hint ( & self ) -> ( uint , Option < uint > ) { self . inner . size_hint ( ) }
1435+ #[ inline] fn size_hint ( & self ) -> ( usize , Option < usize > ) { self . inner . size_hint ( ) }
1436+ }
1437+ #[ stable]
1438+ impl < ' a , K , V > ExactSizeIterator for Values < ' a , K , V > {
1439+ #[ inline] fn len ( & self ) -> usize { self . inner . len ( ) }
14201440}
14211441
14221442#[ stable]
1423- impl < ' a , K : ' a , V : ' a > Iterator for Drain < ' a , K , V > {
1443+ impl < ' a , K , V > Iterator for Drain < ' a , K , V > {
14241444 type Item = ( K , V ) ;
14251445
1426- #[ inline]
1427- fn next ( & mut self ) -> Option < ( K , V ) > {
1428- self . inner . next ( )
1429- }
1430- #[ inline]
1431- fn size_hint ( & self ) -> ( uint , Option < uint > ) {
1432- self . inner . size_hint ( )
1433- }
1446+ #[ inline] fn next ( & mut self ) -> Option < ( K , V ) > { self . inner . next ( ) }
1447+ #[ inline] fn size_hint ( & self ) -> ( usize , Option < usize > ) { self . inner . size_hint ( ) }
1448+ }
1449+ #[ stable]
1450+ impl < ' a , K , V > ExactSizeIterator for Drain < ' a , K , V > {
1451+ #[ inline] fn len ( & self ) -> usize { self . inner . len ( ) }
14341452}
14351453
14361454#[ unstable = "matches collection reform v2 specification, waiting for dust to settle" ]
@@ -2135,6 +2153,19 @@ mod test_map {
21352153 assert_eq ! ( iter. size_hint( ) , ( 3 , Some ( 3 ) ) ) ;
21362154 }
21372155
2156+ #[ test]
2157+ fn test_iter_len ( ) {
2158+ let xs = [ ( 1 i, 1 i) , ( 2 , 2 ) , ( 3 , 3 ) , ( 4 , 4 ) , ( 5 , 5 ) , ( 6 , 6 ) ] ;
2159+
2160+ let map: HashMap < int , int > = xs. iter ( ) . map ( |& x| x) . collect ( ) ;
2161+
2162+ let mut iter = map. iter ( ) ;
2163+
2164+ for _ in iter. by_ref ( ) . take ( 3 ) { }
2165+
2166+ assert_eq ! ( iter. len( ) , 3 ) ;
2167+ }
2168+
21382169 #[ test]
21392170 fn test_mut_size_hint ( ) {
21402171 let xs = [ ( 1 i, 1 i) , ( 2 , 2 ) , ( 3 , 3 ) , ( 4 , 4 ) , ( 5 , 5 ) , ( 6 , 6 ) ] ;
@@ -2148,6 +2179,19 @@ mod test_map {
21482179 assert_eq ! ( iter. size_hint( ) , ( 3 , Some ( 3 ) ) ) ;
21492180 }
21502181
2182+ #[ test]
2183+ fn test_iter_mut_len ( ) {
2184+ let xs = [ ( 1 i, 1 i) , ( 2 , 2 ) , ( 3 , 3 ) , ( 4 , 4 ) , ( 5 , 5 ) , ( 6 , 6 ) ] ;
2185+
2186+ let mut map: HashMap < int , int > = xs. iter ( ) . map ( |& x| x) . collect ( ) ;
2187+
2188+ let mut iter = map. iter_mut ( ) ;
2189+
2190+ for _ in iter. by_ref ( ) . take ( 3 ) { }
2191+
2192+ assert_eq ! ( iter. len( ) , 3 ) ;
2193+ }
2194+
21512195 #[ test]
21522196 fn test_index ( ) {
21532197 let mut map: HashMap < int , int > = HashMap :: new ( ) ;
0 commit comments