1use cauchy::*;
2use std::mem::MaybeUninit;
3
4pub(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 unsafe fn slice_assume_init_ref(&self) -> &[Self::Elem];
42
43 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 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
66pub(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}