@@ -1244,7 +1244,7 @@ impl<T: Clone> Vec<T> {
1244
1244
/// ```
1245
1245
#[ stable( feature = "vec_extend_from_slice" , since = "1.6.0" ) ]
1246
1246
pub fn extend_from_slice ( & mut self , other : & [ T ] ) {
1247
- self . extend ( other. iter ( ) . cloned ( ) )
1247
+ self . spec_extend ( other. iter ( ) )
1248
1248
}
1249
1249
}
1250
1250
@@ -1499,7 +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
- <Self as SpecExtend < _ > >:: from_iter ( iter. into_iter ( ) )
1502
+ <Self as SpecExtend < _ , _ > >:: from_iter ( iter. into_iter ( ) )
1503
1503
}
1504
1504
}
1505
1505
@@ -1572,12 +1572,12 @@ impl<T> Extend<T> for Vec<T> {
1572
1572
}
1573
1573
1574
1574
// Specialization trait used for Vec::from_iter and Vec::extend
1575
- trait SpecExtend < I > {
1575
+ trait SpecExtend < T , I > {
1576
1576
fn from_iter ( iter : I ) -> Self ;
1577
1577
fn spec_extend ( & mut self , iter : I ) ;
1578
1578
}
1579
1579
1580
- impl < I , T > SpecExtend < I > for Vec < T >
1580
+ impl < T , I > SpecExtend < T , I > for Vec < T >
1581
1581
where I : Iterator < Item =T > ,
1582
1582
{
1583
1583
default fn from_iter ( mut iterator : I ) -> Self {
@@ -1607,7 +1607,7 @@ impl<I, T> SpecExtend<I> for Vec<T>
1607
1607
}
1608
1608
}
1609
1609
1610
- impl < I , T > SpecExtend < I > for Vec < T >
1610
+ impl < T , I > SpecExtend < T , I > for Vec < T >
1611
1611
where I : TrustedLen < Item =T > ,
1612
1612
{
1613
1613
fn from_iter ( iterator : I ) -> Self {
@@ -1642,6 +1642,33 @@ impl<I, T> SpecExtend<I> for Vec<T>
1642
1642
}
1643
1643
}
1644
1644
1645
+ impl < ' a , T : ' a , I > SpecExtend < & ' a T , I > for Vec < T >
1646
+ where I : Iterator < Item =& ' a T > ,
1647
+ T : Clone ,
1648
+ {
1649
+ default fn from_iter ( iterator : I ) -> Self {
1650
+ SpecExtend :: from_iter ( iterator. cloned ( ) )
1651
+ }
1652
+
1653
+ default fn spec_extend ( & mut self , iterator : I ) {
1654
+ self . spec_extend ( iterator. cloned ( ) )
1655
+ }
1656
+ }
1657
+
1658
+ impl < ' a , T : ' a > SpecExtend < & ' a T , slice:: Iter < ' a , T > > for Vec < T >
1659
+ where T : Copy ,
1660
+ {
1661
+ fn spec_extend ( & mut self , iterator : slice:: Iter < ' a , T > ) {
1662
+ let slice = iterator. as_slice ( ) ;
1663
+ self . reserve ( slice. len ( ) ) ;
1664
+ unsafe {
1665
+ let len = self . len ( ) ;
1666
+ self . set_len ( len + slice. len ( ) ) ;
1667
+ self . get_unchecked_mut ( len..) . copy_from_slice ( slice) ;
1668
+ }
1669
+ }
1670
+ }
1671
+
1645
1672
impl < T > Vec < T > {
1646
1673
fn extend_desugared < I : Iterator < Item = T > > ( & mut self , mut iterator : I ) {
1647
1674
// This is the case for a general iterator.
@@ -1669,7 +1696,7 @@ impl<T> Vec<T> {
1669
1696
#[ stable( feature = "extend_ref" , since = "1.2.0" ) ]
1670
1697
impl < ' a , T : ' a + Copy > Extend < & ' a T > for Vec < T > {
1671
1698
fn extend < I : IntoIterator < Item = & ' a T > > ( & mut self , iter : I ) {
1672
- self . extend ( iter. into_iter ( ) . map ( | & x| x ) )
1699
+ self . spec_extend ( iter. into_iter ( ) )
1673
1700
}
1674
1701
}
1675
1702
0 commit comments