use core::{convert::Infallible, ops::Add};
pub use crate::{Gt, Zero};
#[sealed::sealed]
pub trait SizedKind {}
#[sealed::sealed]
pub trait MetadataKind {}
pub struct Sized<K: SizedKind>(core::marker::PhantomData<K>, Infallible);
pub struct MetaSized<K: MetadataKind>(core::marker::PhantomData<K>, Infallible);
pub enum SliceLike {}
pub enum DynTraitLike {}
pub enum ExternTypeLike {}
#[sealed::sealed]
impl SizedKind for Zero {}
#[sealed::sealed]
impl SizedKind for crate::Gt<crate::Zero> {}
#[sealed::sealed]
impl MetadataKind for SliceLike {}
#[sealed::sealed]
impl MetadataKind for DynTraitLike {}
pub(crate) trait Thin {}
impl<K: SizedKind> Thin for Sized<K> {}
impl Thin for ExternTypeLike {}
pub(crate) trait Dst {}
impl Dst for ExternTypeLike {}
impl<K: MetadataKind> Dst for MetaSized<K> {}
impl<K: SizedKind> Add<Sized<K>> for Sized<Zero> {
type Output = Sized<K>;
fn add(self, _: Sized<K>) -> Self::Output {
unreachable!()
}
}
impl<K: SizedKind> Add<Sized<K>> for Sized<crate::Gt<crate::Zero>> {
type Output = Self;
fn add(self, _: Sized<K>) -> Self::Output {
unreachable!()
}
}
impl<K: Dst, U: SizedKind> Add<K> for Sized<U> {
type Output = K;
fn add(self, _: K) -> Self::Output {
unreachable!()
}
}
impl<K: MetadataKind, U: SizedKind> Add<Sized<U>> for MetaSized<K> {
type Output = Self;
fn add(self, _: Sized<U>) -> Self::Output {
unreachable!()
}
}
impl<U: SizedKind> Add<Sized<U>> for ExternTypeLike {
type Output = Self;
fn add(self, _: Sized<U>) -> Self::Output {
unreachable!()
}
}