diff options
| author | bors <bors@rust-lang.org> | 2020-01-07 18:10:56 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2020-01-07 18:10:56 +0000 |
| commit | 85976442558bf2d09cec3aa49c9c9ba86fb15c1f (patch) | |
| tree | 53989f474380c9cc1d60961309bb75594b5cbdca /src/liballoc | |
| parent | 56446fef49d73212f63ea7aa0680d5d602f19b9a (diff) | |
| parent | 81a6709cf9f6e83b6dd2311f4dcd9e1ef1fba284 (diff) | |
| download | rust-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.rs | 43 |
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() } } |
