diff options
| author | bors <bors@rust-lang.org> | 2017-04-12 00:45:49 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2017-04-12 00:45:49 +0000 |
| commit | da32752d92589e99feab80921b9eecb6090cf310 (patch) | |
| tree | 9832f02c18cd5bb0ad0b33607ea46912e4974b50 /src/librustc_data_structures/array_vec.rs | |
| parent | f8107c0d7ce4f39364fc96d0eeb6a23673491f81 (diff) | |
| parent | 72538dee4dbfe28882ae5ff37d4ae0cdafe758d5 (diff) | |
| download | rust-da32752d92589e99feab80921b9eecb6090cf310.tar.gz rust-da32752d92589e99feab80921b9eecb6090cf310.zip | |
Auto merge of #41237 - frewsxcv:rollup, r=frewsxcv
Rollup of 8 pull requests - Successful merges: #40377, #40559, #41173, #41202, #41204, #41209, #41216, #41231 - Failed merges:
Diffstat (limited to 'src/librustc_data_structures/array_vec.rs')
| -rw-r--r-- | src/librustc_data_structures/array_vec.rs | 37 |
1 files changed, 8 insertions, 29 deletions
diff --git a/src/librustc_data_structures/array_vec.rs b/src/librustc_data_structures/array_vec.rs index 29fbcb70756..adb22197226 100644 --- a/src/librustc_data_structures/array_vec.rs +++ b/src/librustc_data_structures/array_vec.rs @@ -20,10 +20,11 @@ use std::fmt; use std::mem; use std::collections::range::RangeArgument; use std::collections::Bound::{Excluded, Included, Unbounded}; +use std::mem::ManuallyDrop; pub unsafe trait Array { type Element; - type PartialStorage: Default + Unsize<[ManuallyDrop<Self::Element>]>; + type PartialStorage: Unsize<[ManuallyDrop<Self::Element>]>; const LEN: usize; } @@ -66,7 +67,7 @@ impl<A: Array> ArrayVec<A> { pub fn new() -> Self { ArrayVec { count: 0, - values: Default::default(), + values: unsafe { ::std::mem::uninitialized() }, } } @@ -81,7 +82,7 @@ impl<A: Array> ArrayVec<A> { /// Panics when the stack vector is full. pub fn push(&mut self, el: A::Element) { let arr = &mut self.values as &mut [ManuallyDrop<_>]; - arr[self.count] = ManuallyDrop { value: el }; + arr[self.count] = ManuallyDrop::new(el); self.count += 1; } @@ -90,8 +91,8 @@ impl<A: Array> ArrayVec<A> { let arr = &mut self.values as &mut [ManuallyDrop<_>]; self.count -= 1; unsafe { - let value = ptr::read(&arr[self.count]); - Some(value.value) + let value = ptr::read(&*arr[self.count]); + Some(value) } } else { None @@ -210,7 +211,7 @@ impl<A: Array> Iterator for Iter<A> { fn next(&mut self) -> Option<A::Element> { let arr = &self.store as &[ManuallyDrop<_>]; unsafe { - self.indices.next().map(|i| ptr::read(&arr[i]).value) + self.indices.next().map(|i| ptr::read(&*arr[i])) } } @@ -233,7 +234,7 @@ impl<'a, A: Array> Iterator for Drain<'a, A> { #[inline] fn next(&mut self) -> Option<A::Element> { - self.iter.next().map(|elt| unsafe { ptr::read(elt as *const ManuallyDrop<_>).value }) + self.iter.next().map(|elt| unsafe { ptr::read(&**elt) }) } fn size_hint(&self) -> (usize, Option<usize>) { @@ -295,25 +296,3 @@ impl<'a, A: Array> IntoIterator for &'a mut ArrayVec<A> { self.iter_mut() } } - -// FIXME: This should use repr(transparent) from rust-lang/rfcs#1758. -#[allow(unions_with_drop_fields)] -pub union ManuallyDrop<T> { - value: T, - #[allow(dead_code)] - empty: (), -} - -impl<T> ManuallyDrop<T> { - fn new() -> ManuallyDrop<T> { - ManuallyDrop { - empty: () - } - } -} - -impl<T> Default for ManuallyDrop<T> { - fn default() -> Self { - ManuallyDrop::new() - } -} |
