@@ -33,18 +33,34 @@ impl_as_ptr!(MaybeUninit<c32>, lapack_sys::__BindgenComplex<f32>);
33
33
impl_as_ptr ! ( MaybeUninit <c64>, lapack_sys:: __BindgenComplex<f64 >) ;
34
34
35
35
pub ( crate ) trait VecAssumeInit {
36
- type Target ;
37
- unsafe fn assume_init ( self ) -> Self :: Target ;
36
+ type Elem ;
37
+ unsafe fn assume_init ( self ) -> Vec < Self :: Elem > ;
38
+
39
+ /// An replacement of unstable API
40
+ /// https://doc.rust-lang.org/std/mem/union.MaybeUninit.html#method.slice_assume_init_ref
41
+ unsafe fn slice_assume_init_ref ( & self ) -> & [ Self :: Elem ] ;
42
+
43
+ /// An replacement of unstable API
44
+ /// https://doc.rust-lang.org/std/mem/union.MaybeUninit.html#method.slice_assume_init_mut
45
+ unsafe fn slice_assume_init_mut ( & mut self ) -> & mut [ Self :: Elem ] ;
38
46
}
39
47
40
48
impl < T > VecAssumeInit for Vec < MaybeUninit < T > > {
41
- type Target = Vec < T > ;
42
- unsafe fn assume_init ( self ) -> Self :: Target {
49
+ type Elem = T ;
50
+ unsafe fn assume_init ( self ) -> Vec < T > {
43
51
// FIXME use Vec::into_raw_parts instead after stablized
44
52
// https://doc.rust-lang.org/std/vec/struct.Vec.html#method.into_raw_parts
45
53
let mut me = std:: mem:: ManuallyDrop :: new ( self ) ;
46
54
Vec :: from_raw_parts ( me. as_mut_ptr ( ) as * mut T , me. len ( ) , me. capacity ( ) )
47
55
}
56
+
57
+ unsafe fn slice_assume_init_ref ( & self ) -> & [ T ] {
58
+ std:: slice:: from_raw_parts ( self . as_ptr ( ) as * const T , self . len ( ) )
59
+ }
60
+
61
+ unsafe fn slice_assume_init_mut ( & mut self ) -> & mut [ T ] {
62
+ std:: slice:: from_raw_parts_mut ( self . as_mut_ptr ( ) as * mut T , self . len ( ) )
63
+ }
48
64
}
49
65
50
66
/// Create a vector without initialization
0 commit comments