use core::{
fmt::Debug,
marker::PhantomData,
ops::{Deref, DerefMut},
slice,
};
use super::StableLayout;
#[repr(C)]
pub struct UniqueSlice<'a, T>
where
T: StableLayout,
{
ptr: *mut T,
len: usize,
life: PhantomData<&'a mut [T]>,
}
unsafe impl<'a, T: StableLayout> StableLayout for UniqueSlice<'a, T> {}
impl<'a, T: Debug> Debug for UniqueSlice<'a, T>
where
T: StableLayout,
{
fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
Debug::fmt(self.deref(), f)
}
}
impl<'a, T> Default for UniqueSlice<'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 UniqueSlice<'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> DerefMut for UniqueSlice<'a, T>
where
T: StableLayout,
{
#[inline(always)]
fn deref_mut(&mut self) -> &mut [T] {
unsafe { slice::from_raw_parts_mut(self.ptr, self.len) }
}
}
impl<'a, T> From<&'a mut [T]> for UniqueSlice<'a, T>
where
T: StableLayout,
{
#[inline(always)]
fn from(sli: &'a mut [T]) -> Self {
let life = PhantomData;
let len = sli.len();
let ptr = sli.as_mut_ptr();
Self { ptr, len, life }
}
}
impl<'a, T> From<UniqueSlice<'a, T>> for &'a mut [T]
where
T: StableLayout,
{
#[inline(always)]
fn from(unique: UniqueSlice<'a, T>) -> Self {
unsafe { slice::from_raw_parts_mut(unique.ptr, unique.len) }
}
}