@@ -1004,7 +1004,7 @@ impl<K, V, S, H> HashMap<K, V, S>
1004
1004
reason = "matches collection reform specification, waiting for dust to settle" ) ]
1005
1005
pub fn drain ( & mut self ) -> Drain < K , V > {
1006
1006
Drain {
1007
- inner : Bucket :: at_index ( & mut self . table , 0 ) . unwrap ( )
1007
+ inner : Bucket :: at_index ( & mut self . table , 0 )
1008
1008
}
1009
1009
}
1010
1010
@@ -1295,7 +1295,7 @@ impl<'a, K, V> Clone for Values<'a, K, V> {
1295
1295
#[ unstable( feature = "std_misc" ,
1296
1296
reason = "matches collection reform specification, waiting for dust to settle" ) ]
1297
1297
pub struct Drain < ' a , K : ' a , V : ' a > {
1298
- inner : table:: Bucket < K , V , & ' a mut RawTable < K , V > > ,
1298
+ inner : Option < table:: Bucket < K , V , & ' a mut RawTable < K , V > > > ,
1299
1299
}
1300
1300
1301
1301
/// A view into a single occupied location in a HashMap.
@@ -1469,26 +1469,30 @@ impl<'a, K, V> Iterator for Drain<'a, K, V> {
1469
1469
type Item = ( K , V ) ;
1470
1470
1471
1471
fn next ( & mut self ) -> Option < ( K , V ) > {
1472
- let cap = self . inner . table ( ) . capacity ( ) ;
1473
- while self . inner . index ( ) < cap {
1474
- if let Some ( kv_pair) = self . inner . peek_take ( ) {
1475
- return Some ( kv_pair) ;
1472
+ if let Some ( ref mut bucket) = self . inner {
1473
+ let cap = bucket. table ( ) . capacity ( ) ;
1474
+ while bucket. index ( ) < cap {
1475
+ if let Some ( kv_pair) = bucket. peek_take ( ) {
1476
+ return Some ( kv_pair) ;
1477
+ }
1478
+ bucket. next ( ) ;
1476
1479
}
1477
- self . inner . next ( ) ;
1478
1480
}
1479
1481
1480
1482
None
1481
1483
}
1482
1484
1483
1485
fn size_hint ( & self ) -> ( usize , Option < usize > ) {
1484
- let size = self . inner . table ( ) . size ( ) ;
1485
- ( size, Some ( size) )
1486
+ self . inner . as_ref ( ) . map ( |bucket| {
1487
+ let size = bucket. table ( ) . size ( ) ;
1488
+ ( size, Some ( size) )
1489
+ } ) . unwrap_or ( ( 0 , Some ( 0 ) ) )
1486
1490
}
1487
1491
}
1488
1492
1489
1493
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
1490
1494
impl < ' a , K , V > ExactSizeIterator for Drain < ' a , K , V > {
1491
- fn len ( & self ) -> usize { self . inner . table ( ) . size ( ) }
1495
+ fn len ( & self ) -> usize { self . inner . as_ref ( ) . map ( |bucket| bucket . table ( ) . size ( ) ) . unwrap_or ( 0 ) }
1492
1496
}
1493
1497
1494
1498
#[ unsafe_destructor]
@@ -1879,14 +1883,14 @@ mod test_map {
1879
1883
#[ test]
1880
1884
fn test_empty_entry ( ) {
1881
1885
let mut m: HashMap < int , bool > = HashMap :: new ( ) ;
1882
- assert ! ( m. entry( 0 ) . is_err( ) ) ;
1886
+ assert ! ( m. entry( 0 ) . get ( ) . is_err( ) ) ;
1883
1887
assert ! ( * m. entry( 0 ) . get( ) . unwrap_or_else( |e| e. insert( true ) ) ) ;
1884
1888
assert_eq ! ( m. len( ) , 1 ) ;
1885
1889
}
1886
1890
1887
1891
#[ test]
1888
1892
fn test_empty_iter ( ) {
1889
- let m: HashMap < int , bool > = HashMap :: new ( ) ;
1893
+ let mut m: HashMap < int , bool > = HashMap :: new ( ) ;
1890
1894
assert_eq ! ( m. drain( ) . next( ) , None ) ;
1891
1895
assert_eq ! ( m. keys( ) . next( ) , None ) ;
1892
1896
assert_eq ! ( m. values( ) . next( ) , None ) ;
0 commit comments