Skip to content

Commit e1bb097

Browse files
committed
Make use of MaybeUninit
1 parent 7f73f8a commit e1bb097

File tree

1 file changed

+18
-18
lines changed

1 file changed

+18
-18
lines changed

lib.rs

+18-18
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ use core::{
3939
fmt,
4040
hash::{Hash, Hasher},
4141
iter::{IntoIterator, FromIterator, repeat},
42-
mem::{ManuallyDrop, self},
42+
mem::{MaybeUninit, self},
4343
ops,
4444
ptr::{self, NonNull},
4545
slice,
@@ -213,26 +213,26 @@ impl<'a, T: 'a> Drop for Drain<'a,T> {
213213

214214
#[cfg(feature = "union")]
215215
union SmallVecData<A: Array> {
216-
inline: ManuallyDrop<A>,
216+
inline: MaybeUninit<A>,
217217
heap: (NonNull<A::Item>, usize),
218218
}
219219

220220
#[cfg(feature = "union")]
221221
impl<A: Array> SmallVecData<A> {
222222
#[inline]
223223
unsafe fn inline(&self) -> &A {
224-
&self.inline
224+
&*self.inline.as_ptr()
225225
}
226226
#[inline]
227227
unsafe fn inline_mut(&mut self) -> &mut A {
228-
&mut self.inline
228+
&mut *self.inline.as_mut_ptr()
229229
}
230230
#[inline]
231-
fn from_inline(inline: A) -> SmallVecData<A> {
232-
SmallVecData { inline: ManuallyDrop::new(inline) }
231+
fn from_inline(inline: MaybeUninit<A>) -> SmallVecData<A> {
232+
SmallVecData { inline }
233233
}
234234
#[inline]
235-
unsafe fn into_inline(self) -> A { ManuallyDrop::into_inner(self.inline) }
235+
unsafe fn into_inline(self) -> A { self.inline.assume_init() }
236236
#[inline]
237237
unsafe fn heap(&self) -> (*mut A::Item, usize) {
238238
(self.heap.0.as_ptr(), self.heap.1)
@@ -249,7 +249,7 @@ impl<A: Array> SmallVecData<A> {
249249

250250
#[cfg(not(feature = "union"))]
251251
enum SmallVecData<A: Array> {
252-
Inline(ManuallyDrop<A>),
252+
Inline(MaybeUninit<A>),
253253
Heap((NonNull<A::Item>, usize)),
254254
}
255255

@@ -258,25 +258,25 @@ impl<A: Array> SmallVecData<A> {
258258
#[inline]
259259
unsafe fn inline(&self) -> &A {
260260
match *self {
261-
SmallVecData::Inline(ref a) => a,
261+
SmallVecData::Inline(ref a) => &*a.as_ptr(),
262262
_ => debug_unreachable!(),
263263
}
264264
}
265265
#[inline]
266266
unsafe fn inline_mut(&mut self) -> &mut A {
267267
match *self {
268-
SmallVecData::Inline(ref mut a) => a,
268+
SmallVecData::Inline(ref mut a) => &mut *a.as_mut_ptr(),
269269
_ => debug_unreachable!(),
270270
}
271271
}
272272
#[inline]
273-
fn from_inline(inline: A) -> SmallVecData<A> {
274-
SmallVecData::Inline(ManuallyDrop::new(inline))
273+
fn from_inline(inline: MaybeUninit<A>) -> SmallVecData<A> {
274+
SmallVecData::Inline(inline)
275275
}
276276
#[inline]
277277
unsafe fn into_inline(self) -> A {
278278
match self {
279-
SmallVecData::Inline(a) => ManuallyDrop::into_inner(a),
279+
SmallVecData::Inline(a) => a.assume_init(),
280280
_ => debug_unreachable!(),
281281
}
282282
}
@@ -421,7 +421,7 @@ impl<A: Array> SmallVec<A> {
421421
pub fn from_buf(buf: A) -> SmallVec<A> {
422422
SmallVec {
423423
capacity: A::size(),
424-
data: SmallVecData::from_inline(buf),
424+
data: SmallVecData::from_inline(MaybeUninit::new(buf)),
425425
}
426426
}
427427

@@ -461,7 +461,7 @@ impl<A: Array> SmallVec<A> {
461461
pub unsafe fn from_buf_and_len_unchecked(buf: A, len: usize) -> SmallVec<A> {
462462
SmallVec {
463463
capacity: len,
464-
data: SmallVecData::from_inline(buf),
464+
data: SmallVecData::from_inline(MaybeUninit::new(buf)),
465465
}
466466
}
467467

@@ -979,8 +979,9 @@ impl<A: Array> SmallVec<A> where A::Item: Copy {
979979
SmallVec {
980980
capacity: len,
981981
data: SmallVecData::from_inline(unsafe {
982-
let mut data: A = mem::uninitialized();
983-
ptr::copy_nonoverlapping(slice.as_ptr(), data.as_mut_ptr(), len);
982+
let mut data = MaybeUninit::<A>::uninit();
983+
let slice_mut = &mut *data.as_mut_ptr();
984+
ptr::copy_nonoverlapping(slice.as_ptr(), slice_mut.as_mut_ptr(), len);
984985
data
985986
})
986987
}
@@ -994,7 +995,6 @@ impl<A: Array> SmallVec<A> where A::Item: Copy {
994995
}
995996
}
996997
}
997-
998998
/// Copy elements from a slice into the vector at position `index`, shifting any following
999999
/// elements toward the back.
10001000
///

0 commit comments

Comments
 (0)