safer tarray

- no longer unwrapping None ptr, instead creating slice from dangling nonnull
This commit is contained in:
Janis 2023-04-18 23:21:38 +02:00
parent fad1effa05
commit 8402f505bc

View file

@ -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<T, I: SliceIndex<[T]>> Index<I> for TArray<T> {
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()
}
}