use core::{fmt::Debug, marker::PhantomData, ops::Deref, slice};
use super::StableLayout;
#[repr(C)]
pub struct SharedSlice<'a, T>
where
T: StableLayout,
{
ptr: *const T,
len: usize,
life: PhantomData<&'a [T]>,
}
unsafe impl<'a, T: StableLayout> StableLayout for SharedSlice<'a, T> {}
impl<'a, T: Debug> Debug for SharedSlice<'a, T>
where
T: StableLayout,
{
fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
Debug::fmt(self.deref(), f)
}
}
impl<'a, T> Clone for SharedSlice<'a, T>
where
T: StableLayout,
{
#[inline(always)]
fn clone(&self) -> Self {
*self
}
}
impl<'a, T> Copy for SharedSlice<'a, T> where T: StableLayout {}
impl<'a, T> Default for SharedSlice<'a, T>
where
T: StableLayout,
{
#[inline(always)]
fn default() -> Self {
let life = PhantomData;
let len = 0;
let ptr = core::ptr::NonNull::dangling().as_ptr();
Self { ptr, len, life }
}
}
impl<'a, T> Deref for SharedSlice<'a, T>
where
T: StableLayout,
{
type Target = [T];
#[inline(always)]
fn deref(&self) -> &[T] {
unsafe { slice::from_raw_parts(self.ptr, self.len) }
}
}
impl<'a, T> From<&'a [T]> for SharedSlice<'a, T>
where
T: StableLayout,
{
#[inline(always)]
fn from(sli: &'a [T]) -> Self {
let life = PhantomData;
let len = sli.len();
let ptr = sli.as_ptr();
Self { ptr, len, life }
}
}
impl<'a, T> From<SharedSlice<'a, T>> for &'a [T]
where
T: StableLayout,
{
#[inline(always)]
fn from(shared: SharedSlice<'a, T>) -> Self {
unsafe { slice::from_raw_parts(shared.ptr, shared.len) }
}
}