From 8402f505bcadbe872e0ed4badaf79225cce4f462 Mon Sep 17 00:00:00 2001 From: Janis Date: Tue, 18 Apr 2023 23:21:38 +0200 Subject: [PATCH] safer tarray - no longer unwrapping None ptr, instead creating slice from dangling nonnull --- src/core_types.rs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/core_types.rs b/src/core_types.rs index a140afb..312e3d5 100644 --- a/src/core_types.rs +++ b/src/core_types.rs @@ -174,14 +174,27 @@ pub mod tarray { pub fn capacity(&self) -> usize { self.max as usize } + + pub fn as_slice(&self) -> &[T] { + match self.data { + Some(ptr) => unsafe { core::slice::from_raw_parts(ptr.as_ptr(), self.len()) }, + None => unsafe { core::slice::from_raw_parts(NonNull::dangling().as_ptr(), 0) }, + } + } + + pub fn as_slice_mut(&mut self) -> &mut [T] { + match self.data { + Some(ptr) => unsafe { core::slice::from_raw_parts_mut(ptr.as_ptr(), self.len()) }, + None => unsafe { core::slice::from_raw_parts_mut(NonNull::dangling().as_ptr(), 0) }, + } + } } impl> Index for TArray { type Output = I::Output; fn index(&self, i: I) -> &Self::Output { - let data = - unsafe { std::slice::from_raw_parts(self.data.unwrap().as_ptr(), self.len()) }; + let data = self.as_slice(); &data[i] } @@ -191,7 +204,7 @@ pub mod tarray { type Target = [T]; fn deref(&self) -> &Self::Target { - unsafe { std::slice::from_raw_parts(self.data.unwrap().as_ptr(), self.len()) } + self.as_slice() } }