Skip to content

Commit ec958c6

Browse files
committed
slice_assume_init_{ref,mut} for VecAssumeInit
1 parent 6d2ab7b commit ec958c6

File tree

1 file changed

+20
-4
lines changed

1 file changed

+20
-4
lines changed

lax/src/alloc.rs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,34 @@ impl_as_ptr!(MaybeUninit<c32>, lapack_sys::__BindgenComplex<f32>);
3333
impl_as_ptr!(MaybeUninit<c64>, lapack_sys::__BindgenComplex<f64>);
3434

3535
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];
3846
}
3947

4048
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> {
4351
// FIXME use Vec::into_raw_parts instead after stablized
4452
// https://doc.rust-lang.org/std/vec/struct.Vec.html#method.into_raw_parts
4553
let mut me = std::mem::ManuallyDrop::new(self);
4654
Vec::from_raw_parts(me.as_mut_ptr() as *mut T, me.len(), me.capacity())
4755
}
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+
}
4864
}
4965

5066
/// Create a vector without initialization

0 commit comments

Comments
 (0)