about summary refs log tree commit diff
path: root/src/liballoc/collections
diff options
context:
space:
mode:
authorCharles Gleason <charles_gleason@alumni.brown.edu>2019-11-12 13:01:10 -0500
committerCharles Gleason <charles_gleason@alumni.brown.edu>2019-11-13 11:56:30 -0500
commit164d1a205d21e0bc54b60cb4e9badf27b3883ffd (patch)
tree3869a98a9f264bee44e0e6929b4d4fd72c75d80e /src/liballoc/collections
parent5dda3ee9314cfee9c4e30a7b17dcd5ebdec081a7 (diff)
downloadrust-164d1a205d21e0bc54b60cb4e9badf27b3883ffd.tar.gz
rust-164d1a205d21e0bc54b60cb4e9badf27b3883ffd.zip
Match VecDeque::extend to Vec::extend
Diffstat (limited to 'src/liballoc/collections')
-rw-r--r--src/liballoc/collections/vec_deque.rs17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/liballoc/collections/vec_deque.rs b/src/liballoc/collections/vec_deque.rs
index 7795083e058..ebd3f010077 100644
--- a/src/liballoc/collections/vec_deque.rs
+++ b/src/liballoc/collections/vec_deque.rs
@@ -2809,7 +2809,22 @@ impl<'a, T> IntoIterator for &'a mut VecDeque<T> {
 #[stable(feature = "rust1", since = "1.0.0")]
 impl<A> Extend<A> for VecDeque<A> {
     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); }
+        }
     }
 }