@@ -39,7 +39,7 @@ use core::{
39
39
fmt,
40
40
hash:: { Hash , Hasher } ,
41
41
iter:: { IntoIterator , FromIterator , repeat} ,
42
- mem:: { ManuallyDrop , self } ,
42
+ mem:: { MaybeUninit , self } ,
43
43
ops,
44
44
ptr:: { self , NonNull } ,
45
45
slice,
@@ -213,26 +213,26 @@ impl<'a, T: 'a> Drop for Drain<'a,T> {
213
213
214
214
#[ cfg( feature = "union" ) ]
215
215
union SmallVecData < A : Array > {
216
- inline : ManuallyDrop < A > ,
216
+ inline : MaybeUninit < A > ,
217
217
heap : ( NonNull < A :: Item > , usize ) ,
218
218
}
219
219
220
220
#[ cfg( feature = "union" ) ]
221
221
impl < A : Array > SmallVecData < A > {
222
222
#[ inline]
223
223
unsafe fn inline ( & self ) -> & A {
224
- & self . inline
224
+ & * self . inline . as_ptr ( )
225
225
}
226
226
#[ inline]
227
227
unsafe fn inline_mut ( & mut self ) -> & mut A {
228
- & mut self . inline
228
+ & mut * self . inline . as_mut_ptr ( )
229
229
}
230
230
#[ 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 }
233
233
}
234
234
#[ inline]
235
- unsafe fn into_inline ( self ) -> A { ManuallyDrop :: into_inner ( self . inline ) }
235
+ unsafe fn into_inline ( self ) -> A { self . inline . assume_init ( ) }
236
236
#[ inline]
237
237
unsafe fn heap ( & self ) -> ( * mut A :: Item , usize ) {
238
238
( self . heap . 0 . as_ptr ( ) , self . heap . 1 )
@@ -249,7 +249,7 @@ impl<A: Array> SmallVecData<A> {
249
249
250
250
#[ cfg( not( feature = "union" ) ) ]
251
251
enum SmallVecData < A : Array > {
252
- Inline ( ManuallyDrop < A > ) ,
252
+ Inline ( MaybeUninit < A > ) ,
253
253
Heap ( ( NonNull < A :: Item > , usize ) ) ,
254
254
}
255
255
@@ -258,25 +258,25 @@ impl<A: Array> SmallVecData<A> {
258
258
#[ inline]
259
259
unsafe fn inline ( & self ) -> & A {
260
260
match * self {
261
- SmallVecData :: Inline ( ref a) => a ,
261
+ SmallVecData :: Inline ( ref a) => & * a . as_ptr ( ) ,
262
262
_ => debug_unreachable ! ( ) ,
263
263
}
264
264
}
265
265
#[ inline]
266
266
unsafe fn inline_mut ( & mut self ) -> & mut A {
267
267
match * self {
268
- SmallVecData :: Inline ( ref mut a) => a ,
268
+ SmallVecData :: Inline ( ref mut a) => & mut * a . as_mut_ptr ( ) ,
269
269
_ => debug_unreachable ! ( ) ,
270
270
}
271
271
}
272
272
#[ 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)
275
275
}
276
276
#[ inline]
277
277
unsafe fn into_inline ( self ) -> A {
278
278
match self {
279
- SmallVecData :: Inline ( a) => ManuallyDrop :: into_inner ( a ) ,
279
+ SmallVecData :: Inline ( a) => a . assume_init ( ) ,
280
280
_ => debug_unreachable ! ( ) ,
281
281
}
282
282
}
@@ -421,7 +421,7 @@ impl<A: Array> SmallVec<A> {
421
421
pub fn from_buf ( buf : A ) -> SmallVec < A > {
422
422
SmallVec {
423
423
capacity : A :: size ( ) ,
424
- data : SmallVecData :: from_inline ( buf) ,
424
+ data : SmallVecData :: from_inline ( MaybeUninit :: new ( buf) ) ,
425
425
}
426
426
}
427
427
@@ -461,7 +461,7 @@ impl<A: Array> SmallVec<A> {
461
461
pub unsafe fn from_buf_and_len_unchecked ( buf : A , len : usize ) -> SmallVec < A > {
462
462
SmallVec {
463
463
capacity : len,
464
- data : SmallVecData :: from_inline ( buf) ,
464
+ data : SmallVecData :: from_inline ( MaybeUninit :: new ( buf) ) ,
465
465
}
466
466
}
467
467
@@ -979,8 +979,9 @@ impl<A: Array> SmallVec<A> where A::Item: Copy {
979
979
SmallVec {
980
980
capacity : len,
981
981
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) ;
984
985
data
985
986
} )
986
987
}
@@ -994,7 +995,6 @@ impl<A: Array> SmallVec<A> where A::Item: Copy {
994
995
}
995
996
}
996
997
}
997
-
998
998
/// Copy elements from a slice into the vector at position `index`, shifting any following
999
999
/// elements toward the back.
1000
1000
///
0 commit comments