@@ -1499,26 +1499,7 @@ impl<T> ops::DerefMut for Vec<T> {
1499
1499
impl < T > FromIterator < T > for Vec < T > {
1500
1500
#[ inline]
1501
1501
fn from_iter < I : IntoIterator < Item = T > > ( iter : I ) -> Vec < T > {
1502
- // Unroll the first iteration, as the vector is going to be
1503
- // expanded on this iteration in every case when the iterable is not
1504
- // empty, but the loop in extend_desugared() is not going to see the
1505
- // vector being full in the few subsequent loop iterations.
1506
- // So we get better branch prediction.
1507
- let mut iterator = iter. into_iter ( ) ;
1508
- let mut vector = match iterator. next ( ) {
1509
- None => return Vec :: new ( ) ,
1510
- Some ( element) => {
1511
- let ( lower, _) = iterator. size_hint ( ) ;
1512
- let mut vector = Vec :: with_capacity ( lower. saturating_add ( 1 ) ) ;
1513
- unsafe {
1514
- ptr:: write ( vector. get_unchecked_mut ( 0 ) , element) ;
1515
- vector. set_len ( 1 ) ;
1516
- }
1517
- vector
1518
- }
1519
- } ;
1520
- vector. extend ( iterator) ;
1521
- vector
1502
+ <Self as SpecExtend < _ > >:: from_iter ( iter. into_iter ( ) )
1522
1503
}
1523
1504
}
1524
1505
@@ -1590,13 +1571,37 @@ impl<T> Extend<T> for Vec<T> {
1590
1571
}
1591
1572
}
1592
1573
1574
+ // Specialization trait used for Vec::from_iter and Vec::extend
1593
1575
trait SpecExtend < I > {
1576
+ fn from_iter ( iter : I ) -> Self ;
1594
1577
fn spec_extend ( & mut self , iter : I ) ;
1595
1578
}
1596
1579
1597
1580
impl < I , T > SpecExtend < I > for Vec < T >
1598
1581
where I : Iterator < Item =T > ,
1599
1582
{
1583
+ default fn from_iter ( mut iterator : I ) -> Self {
1584
+ // Unroll the first iteration, as the vector is going to be
1585
+ // expanded on this iteration in every case when the iterable is not
1586
+ // empty, but the loop in extend_desugared() is not going to see the
1587
+ // vector being full in the few subsequent loop iterations.
1588
+ // So we get better branch prediction.
1589
+ let mut vector = match iterator. next ( ) {
1590
+ None => return Vec :: new ( ) ,
1591
+ Some ( element) => {
1592
+ let ( lower, _) = iterator. size_hint ( ) ;
1593
+ let mut vector = Vec :: with_capacity ( lower. saturating_add ( 1 ) ) ;
1594
+ unsafe {
1595
+ ptr:: write ( vector. get_unchecked_mut ( 0 ) , element) ;
1596
+ vector. set_len ( 1 ) ;
1597
+ }
1598
+ vector
1599
+ }
1600
+ } ;
1601
+ vector. spec_extend ( iterator) ;
1602
+ vector
1603
+ }
1604
+
1600
1605
default fn spec_extend ( & mut self , iter : I ) {
1601
1606
self . extend_desugared ( iter)
1602
1607
}
@@ -1605,6 +1610,12 @@ impl<I, T> SpecExtend<I> for Vec<T>
1605
1610
impl < I , T > SpecExtend < I > for Vec < T >
1606
1611
where I : TrustedLen < Item =T > ,
1607
1612
{
1613
+ fn from_iter ( iterator : I ) -> Self {
1614
+ let mut vector = Vec :: new ( ) ;
1615
+ vector. spec_extend ( iterator) ;
1616
+ vector
1617
+ }
1618
+
1608
1619
fn spec_extend ( & mut self , iterator : I ) {
1609
1620
// This is the case for a TrustedLen iterator.
1610
1621
let ( low, high) = iterator. size_hint ( ) ;
0 commit comments