Rollup merge of #66341 - crgl:vec-deque-extend, r=Amanieu
Match `VecDeque::extend` to `Vec::extend_desugared` Currently, `VecDeque::extend` [does not reserve at all](https://github.com/rust-lang/rust/pull/65069#discussion_r333166522). This implementation still runs a check every iteration of the loop, but should reallocate at most once for the common cases where the `size_hint` lower bound is exact. Further optimizations in the future could improve this for some common cases, but given the complexity of the `Vec::extend` implementation it's not immediately clear that this would be worthwhile.
This commit is contained in:
commit
2ca7b7e539
|
@ -2809,7 +2809,22 @@ impl<'a, T> IntoIterator for &'a mut VecDeque<T> {
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl<A> Extend<A> for VecDeque<A> {
|
impl<A> Extend<A> for VecDeque<A> {
|
||||||
fn extend<T: IntoIterator<Item = A>>(&mut self, iter: T) {
|
fn extend<T: IntoIterator<Item = A>>(&mut self, iter: T) {
|
||||||
iter.into_iter().for_each(move |elt| self.push_back(elt));
|
// This function should be the moral equivalent of:
|
||||||
|
//
|
||||||
|
// for item in iter.into_iter() {
|
||||||
|
// self.push_back(item);
|
||||||
|
// }
|
||||||
|
let mut iter = iter.into_iter();
|
||||||
|
while let Some(element) = iter.next() {
|
||||||
|
if self.len() == self.capacity() {
|
||||||
|
let (lower, _) = iter.size_hint();
|
||||||
|
self.reserve(lower.saturating_add(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
let head = self.head;
|
||||||
|
self.head = self.wrap_add(self.head, 1);
|
||||||
|
unsafe { self.buffer_write(head, element); }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue