mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-30 02:33:55 +00:00
Auto merge of #37094 - fhartwig:spec-extend-from-slice, r=alexcrichton
Specialize Vec::extend to Vec::extend_from_slice I tried using the existing `SpecExtend` as a helper trait for this, but the instances would always conflict with the instances higher up in the file, so I created a new helper trait. Benchmarking `extend` vs `extend_from_slice` with an slice of 1000 `u64`s gives the following results: ``` before: running 2 tests test tests::bench_extend_from_slice ... bench: 166 ns/iter (+/- 78) test tests::bench_extend_trait ... bench: 1,187 ns/iter (+/- 697) after: running 2 tests test tests::bench_extend_from_slice ... bench: 149 ns/iter (+/- 87) test tests::bench_extend_trait ... bench: 138 ns/iter (+/- 70) ```
This commit is contained in:
commit
030bc49bb4
@ -1614,7 +1614,24 @@ impl<T> Vec<T> {
|
||||
#[stable(feature = "extend_ref", since = "1.2.0")]
|
||||
impl<'a, T: 'a + Copy> Extend<&'a T> for Vec<T> {
|
||||
fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
|
||||
self.extend(iter.into_iter().cloned());
|
||||
<I as SpecExtendVec<T>>::extend_vec(iter, self);
|
||||
}
|
||||
}
|
||||
|
||||
// helper trait for specialization of Vec's Extend impl
|
||||
trait SpecExtendVec<T> {
|
||||
fn extend_vec(self, vec: &mut Vec<T>);
|
||||
}
|
||||
|
||||
impl <'a, T: 'a + Copy, I: IntoIterator<Item=&'a T>> SpecExtendVec<T> for I {
|
||||
default fn extend_vec(self, vec: &mut Vec<T>) {
|
||||
vec.extend(self.into_iter().cloned());
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, T: Copy> SpecExtendVec<T> for &'a [T] {
|
||||
fn extend_vec(self, vec: &mut Vec<T>) {
|
||||
vec.extend_from_slice(self);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user