From ef3c5a1e35fe9a1720d72129c2bfe6945cca2006 Mon Sep 17 00:00:00 2001 From: Toshiki Teramura Date: Wed, 31 Aug 2022 21:40:40 +0900 Subject: [PATCH] Introduce VecAssumeInit to convert Vec> to Vec --- lax/src/lib.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) 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)]