use core::ptr::DynMetadata;
use core::convert::Infallible;
use crate::runtime::types::{UserData, UserIterator};
use crate::runtime::gc::trace::GcTrace;
#[derive(Clone, Copy)]
pub enum PtrMetadata {
None,
Size(usize),
Trace(DynMetadata<dyn GcTrace>),
Iterator(DynMetadata<dyn UserIterator>),
UserData(DynMetadata<dyn UserData>),
}
pub struct PtrMetadataError;
impl From<()> for PtrMetadata {
fn from(_: ()) -> Self {
Self::None
}
}
impl TryInto<()> for PtrMetadata {
type Error = Infallible;
fn try_into(self) -> Result<(), Self::Error> { Ok(()) }
}
impl From<usize> for PtrMetadata {
fn from(size: usize) -> Self {
Self::Size(size)
}
}
impl TryInto<usize> for PtrMetadata {
type Error = PtrMetadataError;
fn try_into(self) -> Result<usize, Self::Error> {
match self {
Self::Size(size) => Ok(size),
_ => Err(PtrMetadataError),
}
}
}
impl From<DynMetadata<dyn GcTrace>> for PtrMetadata {
fn from(meta: DynMetadata<dyn GcTrace>) -> Self {
Self::Trace(meta)
}
}
impl TryInto<DynMetadata<dyn GcTrace>> for PtrMetadata {
type Error = PtrMetadataError;
fn try_into(self) -> Result<DynMetadata<dyn GcTrace>, Self::Error> {
match self {
Self::Trace(meta) => Ok(meta),
_ => Err(PtrMetadataError),
}
}
}
impl From<DynMetadata<dyn UserIterator>> for PtrMetadata {
fn from(meta: DynMetadata<dyn UserIterator>) -> Self {
Self::Iterator(meta)
}
}
impl TryInto<DynMetadata<dyn UserIterator>> for PtrMetadata {
type Error = PtrMetadataError;
fn try_into(self) -> Result<DynMetadata<dyn UserIterator>, Self::Error> {
match self {
Self::Iterator(meta) => Ok(meta),
_ => Err(PtrMetadataError),
}
}
}
impl From<DynMetadata<dyn UserData>> for PtrMetadata {
fn from(meta: DynMetadata<dyn UserData>) -> Self {
Self::UserData(meta)
}
}
impl TryInto<DynMetadata<dyn UserData>> for PtrMetadata {
type Error = PtrMetadataError;
fn try_into(self) -> Result<DynMetadata<dyn UserData>, Self::Error> {
match self {
Self::UserData(meta) => Ok(meta),
_ => Err(PtrMetadataError),
}
}
}