use crate::implementations::jagged_arrays::RawSlice;
use alloc::vec::Vec;
pub trait AsRawSlice<T> {
fn ptr(&self) -> *const T;
fn length(&self) -> usize;
fn raw_slice(&self, begin: usize, len: usize) -> RawSlice<T>;
fn is_empty(&self) -> bool {
self.length() == 0
}
fn first_and_last_ptrs(&self) -> [*const T; 2] {
match self.length() {
0 => [core::ptr::null(), core::ptr::null()],
n => [self.ptr(), unsafe { self.ptr_at(n - 1) }],
}
}
unsafe fn ptr_at(&self, position: usize) -> *const T {
debug_assert!(position < self.length());
unsafe { self.ptr().add(position) }
}
}
pub trait AsOwningSlice<T>: AsRawSlice<T> {
fn capacity(&self) -> usize;
unsafe fn drop_in_place(&self, position: usize) {
let ptr = unsafe { self.ptr_at(position) } as *mut T;
unsafe { ptr.drop_in_place() };
}
unsafe fn drop_allocation(&self) {
let _vec_to_drop = unsafe { Vec::from_raw_parts(self.ptr() as *mut T, 0, self.capacity()) };
}
}
impl<T> AsRawSlice<T> for &[T] {
fn ptr(&self) -> *const T {
self.as_ptr()
}
fn length(&self) -> usize {
self.len()
}
fn raw_slice(&self, begin: usize, len: usize) -> RawSlice<T> {
debug_assert!(begin < self.len());
let ptr = unsafe { self.as_ptr().add(begin) };
RawSlice::new(ptr, len)
}
}
impl<T> AsRawSlice<T> for Vec<T> {
fn ptr(&self) -> *const T {
self.as_ptr()
}
fn length(&self) -> usize {
self.len()
}
fn raw_slice(&self, begin: usize, len: usize) -> RawSlice<T> {
debug_assert!(begin < self.len());
let ptr = unsafe { self.as_ptr().add(begin) };
RawSlice::new(ptr, len)
}
}