about summary refs log tree commit diff
diff options
context:
space:
mode:
authorUlrik Sverdrup <bluss@users.noreply.github.com>2016-03-02 17:54:43 +0100
committerUlrik Sverdrup <bluss@users.noreply.github.com>2016-03-02 18:05:41 +0100
commit7ceafaee4f3d8ed2268b1659dd99a541d71689a3 (patch)
tree65266bd844ac98acd2dc59b2cdb8b9666be1c1a4
parent1da364e98f46c828e5746be299b58b995e5f5007 (diff)
downloadrust-7ceafaee4f3d8ed2268b1659dd99a541d71689a3.tar.gz
rust-7ceafaee4f3d8ed2268b1659dd99a541d71689a3.zip
Use ptr::drop_in_place in VecDeque::drop
Just like for Vec. This should benefit both non-optimized and optimized
performance. Non-optimized since the intrinsic drop_in_place is easily
removed, and optimized because iterating the slices is more efficient
than using the VecDeque iterators.
-rw-r--r--src/libcollections/vec_deque.rs7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/libcollections/vec_deque.rs b/src/libcollections/vec_deque.rs
index f34fe2da7e8..3e48f14d387 100644
--- a/src/libcollections/vec_deque.rs
+++ b/src/libcollections/vec_deque.rs
@@ -70,7 +70,12 @@ impl<T: Clone> Clone for VecDeque<T> {
 impl<T> Drop for VecDeque<T> {
     #[unsafe_destructor_blind_to_params]
     fn drop(&mut self) {
-        self.clear();
+        let (front, back) = self.as_mut_slices();
+        unsafe {
+            // use drop for [T]
+            ptr::drop_in_place(front);
+            ptr::drop_in_place(back);
+        }
         // RawVec handles deallocation
     }
 }