Skip to content

Commit

Permalink
Introduce VecAssumeInit to convert Vec<MaybeUninit<T>> to Vec<T>
Browse files Browse the repository at this point in the history
Use ManuallyDrop to implement VecAssumeInit
  • Loading branch information
termoshtt committed Aug 31, 2022
1 parent 6e5b4b0 commit e35bdbb
Showing 1 changed file with 24 additions and 0 deletions.
24 changes: 24 additions & 0 deletions lax/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,30 @@ impl_as_ptr!(MaybeUninit<f64>, f64);
impl_as_ptr!(MaybeUninit<c32>, lapack_sys::__BindgenComplex<f32>);
impl_as_ptr!(MaybeUninit<c64>, lapack_sys::__BindgenComplex<f64>);

pub(crate) trait VecAssumeInit {
type Target;
unsafe fn assume_init(self) -> Self::Target;
}

macro_rules! impl_vec_assume_init {
($e:ty) => {
impl VecAssumeInit for Vec<MaybeUninit<$e>> {
type Target = Vec<$e>;
unsafe fn assume_init(self) -> Self::Target {
// FIXME use Vec::into_raw_parts instead after stablized
// https://doc.rust-lang.org/std/vec/struct.Vec.html#method.into_raw_parts
let mut me = std::mem::ManuallyDrop::new(self);
Vec::from_raw_parts(me.as_mut_ptr() as *mut $e, me.len(), me.capacity())
}
}
};
}

impl_vec_assume_init!(f32);
impl_vec_assume_init!(f64);
impl_vec_assume_init!(c32);
impl_vec_assume_init!(c64);

/// Upper/Lower specification for seveal usages
#[derive(Debug, Clone, Copy)]
#[repr(u8)]
Expand Down

0 comments on commit e35bdbb

Please sign in to comment.