diff --git a/lax/src/lib.rs b/lax/src/lib.rs index 3fbe7643..7da313ff 100644 --- a/lax/src/lib.rs +++ b/lax/src/lib.rs @@ -156,6 +156,27 @@ impl_as_ptr!(MaybeUninit, f64); impl_as_ptr!(MaybeUninit, lapack_sys::__BindgenComplex); impl_as_ptr!(MaybeUninit, lapack_sys::__BindgenComplex); +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> { + 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)]