@@ -1410,42 +1410,8 @@ impl<T> ops::DerefMut for Vec<T> {
1410
1410
impl < T > FromIterator < T > for Vec < T > {
1411
1411
#[ inline]
1412
1412
fn from_iter < I : IntoIterator < Item =T > > ( iterable : I ) -> Vec < T > {
1413
- let mut iterator = iterable. into_iter ( ) ;
1414
- let ( lower, _) = iterator. size_hint ( ) ;
1415
- let mut vector = Vec :: with_capacity ( lower) ;
1416
-
1417
- // This function should be the moral equivalent of:
1418
- //
1419
- // for item in iterator {
1420
- // vector.push(item);
1421
- // }
1422
- //
1423
- // This equivalent crucially runs the iterator precisely once. Below we
1424
- // actually in theory run the iterator twice (one without bounds checks
1425
- // and one with). To achieve the "moral equivalent", we use the `if`
1426
- // statement below to break out early.
1427
- //
1428
- // If the first loop has terminated, then we have one of two conditions.
1429
- //
1430
- // 1. The underlying iterator returned `None`. In this case we are
1431
- // guaranteed that less than `vector.capacity()` elements have been
1432
- // returned, so we break out early.
1433
- // 2. The underlying iterator yielded `vector.capacity()` elements and
1434
- // has not yielded `None` yet. In this case we run the iterator to
1435
- // its end below.
1436
- for element in iterator. by_ref ( ) . take ( vector. capacity ( ) ) {
1437
- let len = vector. len ( ) ;
1438
- unsafe {
1439
- ptr:: write ( vector. get_unchecked_mut ( len) , element) ;
1440
- vector. set_len ( len + 1 ) ;
1441
- }
1442
- }
1443
-
1444
- if vector. len ( ) == vector. capacity ( ) {
1445
- for element in iterator {
1446
- vector. push ( element) ;
1447
- }
1448
- }
1413
+ let mut vector = Vec :: new ( ) ;
1414
+ vector. extend ( iterable) ;
1449
1415
vector
1450
1416
}
1451
1417
}
@@ -1482,13 +1448,31 @@ impl<'a, T> IntoIterator for &'a mut Vec<T> {
1482
1448
1483
1449
#[ unstable( feature = "collections" , reason = "waiting on Extend stability" ) ]
1484
1450
impl < T > Extend < T > for Vec < T > {
1485
- #[ inline]
1486
1451
fn extend < I : IntoIterator < Item =T > > ( & mut self , iterable : I ) {
1487
- let iterator = iterable. into_iter ( ) ;
1488
- let ( lower, _) = iterator. size_hint ( ) ;
1489
- self . reserve ( lower) ;
1490
- for element in iterator {
1491
- self . push ( element)
1452
+ let mut iterator = iterable. into_iter ( ) ;
1453
+
1454
+ // This function should be the moral equivalent of:
1455
+ //
1456
+ // for item in iterator {
1457
+ // self.push(item);
1458
+ // }
1459
+ loop {
1460
+ match iterator. next ( ) {
1461
+ None => {
1462
+ break ;
1463
+ }
1464
+ Some ( element) => {
1465
+ let len = self . len ( ) ;
1466
+ if len == self . capacity ( ) {
1467
+ let ( lower, _) = iterator. size_hint ( ) ;
1468
+ self . reserve ( lower + 1 ) ;
1469
+ }
1470
+ unsafe {
1471
+ ptr:: write ( self . get_unchecked_mut ( len) , element) ;
1472
+ self . set_len ( len + 1 ) ;
1473
+ }
1474
+ }
1475
+ }
1492
1476
}
1493
1477
}
1494
1478
}
0 commit comments