Skip to content

Commit

Permalink
Merge pull request #333 from rust-ndarray/lax-strict-memory-management
Browse files Browse the repository at this point in the history
Strict memory management for `lax::Eig_`
  • Loading branch information
termoshtt committed Sep 24, 2022
2 parents 3a8520c + 96a83e6 commit e407602
Show file tree
Hide file tree
Showing 3 changed files with 380 additions and 163 deletions.
24 changes: 20 additions & 4 deletions lax/src/alloc.rs
Expand Up @@ -33,18 +33,34 @@ impl_as_ptr!(MaybeUninit<c32>, lapack_sys::__BindgenComplex<f32>);
impl_as_ptr!(MaybeUninit<c64>, lapack_sys::__BindgenComplex<f64>);

pub(crate) trait VecAssumeInit {
type Target;
unsafe fn assume_init(self) -> Self::Target;
type Elem;
unsafe fn assume_init(self) -> Vec<Self::Elem>;

/// An replacement of unstable API
/// https://doc.rust-lang.org/std/mem/union.MaybeUninit.html#method.slice_assume_init_ref
unsafe fn slice_assume_init_ref(&self) -> &[Self::Elem];

/// An replacement of unstable API
/// https://doc.rust-lang.org/std/mem/union.MaybeUninit.html#method.slice_assume_init_mut
unsafe fn slice_assume_init_mut(&mut self) -> &mut [Self::Elem];
}

impl<T> VecAssumeInit for Vec<MaybeUninit<T>> {
type Target = Vec<T>;
unsafe fn assume_init(self) -> Self::Target {
type Elem = T;
unsafe fn assume_init(self) -> Vec<T> {
// FIXME use Vec::into_raw_parts instead after stablized
// https://doc.rust-lang.org/std/vec/struct.Vec.html#method.into_raw_parts
let mut me = std::mem::ManuallyDrop::new(self);
Vec::from_raw_parts(me.as_mut_ptr() as *mut T, me.len(), me.capacity())
}

unsafe fn slice_assume_init_ref(&self) -> &[T] {
std::slice::from_raw_parts(self.as_ptr() as *const T, self.len())
}

unsafe fn slice_assume_init_mut(&mut self) -> &mut [T] {
std::slice::from_raw_parts_mut(self.as_mut_ptr() as *mut T, self.len())
}
}

/// Create a vector without initialization
Expand Down

0 comments on commit e407602

Please sign in to comment.