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
  • Loading branch information
termoshtt committed Aug 31, 2022
1 parent 6e5b4b0 commit ef3c5a1
Showing 1 changed file with 21 additions and 0 deletions.
21 changes: 21 additions & 0 deletions lax/src/lib.rs
Expand Up @@ -156,6 +156,27 @@ 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 VecAssureInit {
type Target;
unsafe fn assure_init(self) -> Self::Target;
}

macro_rules! impl_vec_assure_init {
($e:ty) => {
impl VecAssureInit for Vec<MaybeUninit<$e>> {
type Target = Vec<$e>;
unsafe fn assure_init(mut self) -> Self::Target {
Vec::from_raw_parts(self.as_mut_ptr() as *mut $e, self.len(), self.capacity())
}
}
};
}

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

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

0 comments on commit ef3c5a1

Please sign in to comment.