use core::{clone::Clone, marker::PhantomData};
pub struct Ref<'a, T: ?Sized>(*const T, PhantomData<&'a T>);
pub struct Mut<'a, T: ?Sized>(*mut T, PhantomData<&'a T>);
#[derive(Clone, Copy)]
pub struct Own<T: Sized>(T);
impl<'a, T: ?Sized> Ref<'a, T> {
#[inline(always)]
pub const fn new(inner: &'a T) -> Self {
Self(inner as *const T, PhantomData)
}
#[inline(always)]
pub const fn get(&self) -> &'a T {
unsafe { &*self.0 }
}
#[inline(always)]
pub const fn into_inner(self) -> &'a T {
self.get()
}
}
impl<'a, T: ?Sized> Mut<'a, T> {
#[inline(always)]
pub const fn new(inner: &'a mut T) -> Self {
Self(inner as *mut T, PhantomData)
}
#[inline(always)]
pub const fn get(&self) -> &'a T {
unsafe { &*self.0 }
}
#[inline(always)]
pub const fn get_mut(&mut self) -> &'a mut T {
unsafe { &mut *self.0 }
}
#[inline(always)]
pub const fn into_inner(mut self) -> &'a mut T {
self.get_mut()
}
}
impl<T: Sized> Own<T> {
#[inline(always)]
pub const fn new(inner: T) -> Self {
Self(inner)
}
#[inline(always)]
pub const fn get(&self) -> &T {
&self.0
}
#[inline(always)]
pub const fn get_mut(&mut self) -> &mut T {
&mut self.0
}
#[inline(always)]
pub fn into_inner(self) -> T {
self.0
}
}
impl<'a, T: ?Sized> AsRef<T> for Ref<'a, T> {
#[inline(always)]
fn as_ref(&self) -> &T {
self.get()
}
}
impl<'a, T: ?Sized> Clone for Ref<'a, T> {
#[inline(always)]
fn clone(&self) -> Self {
Self::new(self.get())
}
}
impl<'a, T: ?Sized> AsRef<T> for Mut<'a, T> {
#[inline(always)]
fn as_ref(&self) -> &T {
self.get()
}
}
impl<'a, T: ?Sized> AsMut<T> for Mut<'a, T> {
#[inline(always)]
fn as_mut(&mut self) -> &mut T {
self.get_mut()
}
}
impl<T: Sized> AsRef<T> for Own<T> {
#[inline(always)]
fn as_ref(&self) -> &T {
self.get()
}
}
impl<T: Sized> AsMut<T> for Own<T> {
#[inline(always)]
fn as_mut(&mut self) -> &mut T {
self.get_mut()
}
}