about summary refs log tree commit diff
path: root/src/liballoc
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2020-01-07 18:10:56 +0000
committerbors <bors@rust-lang.org>2020-01-07 18:10:56 +0000
commit85976442558bf2d09cec3aa49c9c9ba86fb15c1f (patch)
tree53989f474380c9cc1d60961309bb75594b5cbdca /src/liballoc
parent56446fef49d73212f63ea7aa0680d5d602f19b9a (diff)
parent81a6709cf9f6e83b6dd2311f4dcd9e1ef1fba284 (diff)
downloadrust-85976442558bf2d09cec3aa49c9c9ba86fb15c1f.tar.gz
rust-85976442558bf2d09cec3aa49c9c9ba86fb15c1f.zip
Auto merge of #67312 - cuviper:clone-box-slice, r=SimonSapin
Simplify Clone for Box<[T]>

The bespoke `BoxBuilder` was basically a very simple `Vec`. Instead,
let's clone to a real `Vec`, with all of its specialization for the
task, then convert back to `Box<[T]>`.
Diffstat (limited to 'src/liballoc')
-rw-r--r--src/liballoc/boxed.rs43
1 files changed, 1 insertions, 42 deletions
diff --git a/src/liballoc/boxed.rs b/src/liballoc/boxed.rs
index cc01de08caf..87a4924f9be 100644
--- a/src/liballoc/boxed.rs
+++ b/src/liballoc/boxed.rs
@@ -1046,48 +1046,7 @@ impl<A> FromIterator<A> for Box<[A]> {
 #[stable(feature = "box_slice_clone", since = "1.3.0")]
 impl<T: Clone> Clone for Box<[T]> {
     fn clone(&self) -> Self {
-        let mut new = BoxBuilder { data: RawVec::with_capacity(self.len()), len: 0 };
-
-        let mut target = new.data.ptr();
-
-        for item in self.iter() {
-            unsafe {
-                ptr::write(target, item.clone());
-                target = target.offset(1);
-            };
-
-            new.len += 1;
-        }
-
-        return unsafe { new.into_box() };
-
-        // Helper type for responding to panics correctly.
-        struct BoxBuilder<T> {
-            data: RawVec<T>,
-            len: usize,
-        }
-
-        impl<T> BoxBuilder<T> {
-            unsafe fn into_box(self) -> Box<[T]> {
-                let raw = ptr::read(&self.data);
-                mem::forget(self);
-                raw.into_box()
-            }
-        }
-
-        impl<T> Drop for BoxBuilder<T> {
-            fn drop(&mut self) {
-                let mut data = self.data.ptr();
-                let max = unsafe { data.add(self.len) };
-
-                while data != max {
-                    unsafe {
-                        ptr::read(data);
-                        data = data.offset(1);
-                    }
-                }
-            }
-        }
+        self.to_vec().into_boxed_slice()
     }
 }