#![expect(private_bounds, reason = "Sealed traits")]
macro_rules! impl_prim {
($trait:ident for $($P:ty),+ $(,)?) => { $( impl_prim![% $trait for $P]; )+ };
(%$trait:ident for $P:ty) => { impl $trait for $P {} };
}
trait Sealed {}
impl_prim![Sealed for
(), bool, char,
u8, u16, u32, u64, u128, usize,
i8, i16, i32, i64, i128, isize,
f32, f64,
];
#[doc = crate::_tags!(code)]
#[doc = crate::_doc_location!("code/marker")]
pub trait Prim: Sealed + Copy + 'static {}
impl_prim![Prim for
(), bool, char,
u8, u16, u32, u64, u128, usize,
i8, i16, i32, i64, i128, isize,
f32, f64,
];
#[doc = crate::_tags!(code mem)]
#[doc = crate::_doc_location!("code/marker")]
pub trait PrimFitPtr: Prim {}
impl_prim![PrimFitPtr for (), bool, u8, i8, usize, isize];
#[cfg(target_pointer_width = "16")]
impl_prim![PrimFitPtr for bool, u16, i16];
#[cfg(target_pointer_width = "32")]
impl_prim![PrimFitPtr for u16, u32, i16, i32, f32];
#[cfg(target_pointer_width = "64")]
impl_prim![PrimFitPtr for u16, u32, u64, i16, i32, i64, f32, f64];
#[doc = crate::_tags!(code mem num)]
#[doc = crate::_doc_location!("code/marker")]
pub trait PrimIndex: crate::PrimUint + PrimFitPtr {}
impl_prim![PrimIndex for u8, usize];
#[cfg(target_pointer_width = "16")]
impl_prim![PrimIndex for u16];
#[cfg(target_pointer_width = "32")]
impl_prim![PrimIndex for u16, u32];
#[cfg(target_pointer_width = "64")]
impl_prim![PrimIndex for u16, u32, u64];