Skip to content

Commit e35bdbb

Browse files
committed
Introduce VecAssumeInit to convert Vec<MaybeUninit<T>> to Vec<T>
Use ManuallyDrop to implement VecAssumeInit
1 parent 6e5b4b0 commit e35bdbb

File tree

1 file changed

+24
-0
lines changed

1 file changed

+24
-0
lines changed

lax/src/lib.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,30 @@ impl_as_ptr!(MaybeUninit<f64>, f64);
156156
impl_as_ptr!(MaybeUninit<c32>, lapack_sys::__BindgenComplex<f32>);
157157
impl_as_ptr!(MaybeUninit<c64>, lapack_sys::__BindgenComplex<f64>);
158158

159+
pub(crate) trait VecAssumeInit {
160+
type Target;
161+
unsafe fn assume_init(self) -> Self::Target;
162+
}
163+
164+
macro_rules! impl_vec_assume_init {
165+
($e:ty) => {
166+
impl VecAssumeInit for Vec<MaybeUninit<$e>> {
167+
type Target = Vec<$e>;
168+
unsafe fn assume_init(self) -> Self::Target {
169+
// FIXME use Vec::into_raw_parts instead after stablized
170+
// https://doc.rust-lang.org/std/vec/struct.Vec.html#method.into_raw_parts
171+
let mut me = std::mem::ManuallyDrop::new(self);
172+
Vec::from_raw_parts(me.as_mut_ptr() as *mut $e, me.len(), me.capacity())
173+
}
174+
}
175+
};
176+
}
177+
178+
impl_vec_assume_init!(f32);
179+
impl_vec_assume_init!(f64);
180+
impl_vec_assume_init!(c32);
181+
impl_vec_assume_init!(c64);
182+
159183
/// Upper/Lower specification for seveal usages
160184
#[derive(Debug, Clone, Copy)]
161185
#[repr(u8)]

0 commit comments

Comments
 (0)