lax/
alloc.rs

1use cauchy::*;
2use std::mem::MaybeUninit;
3
4/// Helper for getting pointer of slice
5pub(crate) trait AsPtr: Sized {
6    type Elem;
7    fn as_ptr(vec: &[Self]) -> *const Self::Elem;
8    fn as_mut_ptr(vec: &mut [Self]) -> *mut Self::Elem;
9}
10
11macro_rules! impl_as_ptr {
12    ($target:ty, $elem:ty) => {
13        impl AsPtr for $target {
14            type Elem = $elem;
15            fn as_ptr(vec: &[Self]) -> *const Self::Elem {
16                vec.as_ptr() as *const _
17            }
18            fn as_mut_ptr(vec: &mut [Self]) -> *mut Self::Elem {
19                vec.as_mut_ptr() as *mut _
20            }
21        }
22    };
23}
24impl_as_ptr!(i32, i32);
25impl_as_ptr!(f32, f32);
26impl_as_ptr!(f64, f64);
27impl_as_ptr!(c32, lapack_sys::__BindgenComplex<f32>);
28impl_as_ptr!(c64, lapack_sys::__BindgenComplex<f64>);
29impl_as_ptr!(MaybeUninit<i32>, i32);
30impl_as_ptr!(MaybeUninit<f32>, f32);
31impl_as_ptr!(MaybeUninit<f64>, f64);
32impl_as_ptr!(MaybeUninit<c32>, lapack_sys::__BindgenComplex<f32>);
33impl_as_ptr!(MaybeUninit<c64>, lapack_sys::__BindgenComplex<f64>);
34
35pub(crate) trait VecAssumeInit {
36    type Elem;
37    unsafe fn assume_init(self) -> Vec<Self::Elem>;
38
39    /// An replacement of unstable API
40    /// https://doc.rust-lang.org/std/mem/union.MaybeUninit.html#method.slice_assume_init_ref
41    unsafe fn slice_assume_init_ref(&self) -> &[Self::Elem];
42
43    /// An replacement of unstable API
44    /// https://doc.rust-lang.org/std/mem/union.MaybeUninit.html#method.slice_assume_init_mut
45    unsafe fn slice_assume_init_mut(&mut self) -> &mut [Self::Elem];
46}
47
48impl<T> VecAssumeInit for Vec<MaybeUninit<T>> {
49    type Elem = T;
50    unsafe fn assume_init(self) -> Vec<T> {
51        // FIXME use Vec::into_raw_parts instead after stablized
52        // https://doc.rust-lang.org/std/vec/struct.Vec.html#method.into_raw_parts
53        let mut me = std::mem::ManuallyDrop::new(self);
54        Vec::from_raw_parts(me.as_mut_ptr() as *mut T, me.len(), me.capacity())
55    }
56
57    unsafe fn slice_assume_init_ref(&self) -> &[T] {
58        std::slice::from_raw_parts(self.as_ptr() as *const T, self.len())
59    }
60
61    unsafe fn slice_assume_init_mut(&mut self) -> &mut [T] {
62        std::slice::from_raw_parts_mut(self.as_mut_ptr() as *mut T, self.len())
63    }
64}
65
66/// Create a vector without initialization
67///
68/// Safety
69/// ------
70/// - Memory is not initialized. Do not read the memory before write.
71///
72pub(crate) fn vec_uninit<T: Sized>(n: usize) -> Vec<MaybeUninit<T>> {
73    let mut v = Vec::with_capacity(n);
74    unsafe {
75        v.set_len(n);
76    }
77    v
78}