use core::fmt;
use crate::error::IntoRepr;
use crate::pointer::Size;
use crate::traits::ZeroCopy;
mod sealed {
use crate::mem::MaybeUninit;
use crate::pointer::Pointee;
use crate::traits::ZeroCopy;
pub trait Sealed {}
impl<T> Sealed for MaybeUninit<T> where T: Pointee {}
impl<T> Sealed for T where T: ZeroCopy {}
impl<T> Sealed for [T] where T: ZeroCopy {}
impl Sealed for str {}
}
pub trait Pointee: self::sealed::Sealed {
type Metadata: Copy + fmt::Debug + IntoRepr;
#[doc(hidden)]
type Stored<O>: Copy + ZeroCopy
where
O: Size;
#[doc(hidden)]
fn try_from_metadata<O>(metadata: Self::Metadata) -> Option<Self::Stored<O>>
where
O: Size;
}
impl<T> Pointee for T
where
T: ZeroCopy,
{
type Metadata = ();
type Stored<O> = () where O: Size;
#[inline(always)]
fn try_from_metadata<O>((): ()) -> Option<Self::Stored<O>>
where
O: Size,
{
Some(())
}
}
impl<T> Pointee for [T]
where
T: ZeroCopy,
{
type Metadata = usize;
type Stored<O> = O where O: Size;
#[inline(always)]
fn try_from_metadata<O>(metadata: usize) -> Option<O>
where
O: Size,
{
O::try_from_usize(metadata)
}
}
impl Pointee for str {
type Metadata = usize;
type Stored<O> = O where O: Size;
#[inline(always)]
fn try_from_metadata<O>(metadata: usize) -> Option<O>
where
O: Size,
{
O::try_from_usize(metadata)
}
}