devela 0.27.0

A development layer of coherence.
Documentation
// devela::num::grain::prim
//
//! Marker traits for primitives.
//
// TOC
// - (trait Sealed)
// - trait Prim
// - trait PrimFitPtr
// - trait PrimIndex

#![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 {} };
}

/// Marker trait to prevent downstream implementations of the `Prim*` traits.
trait Sealed {}
impl_prim![Sealed for
    (), bool, char,
    u8, u16, u32, u64, u128, usize,
    i8, i16, i32, i64, i128, isize,
    f32, f64,
];

/* primitives */

#[doc = crate::_tags!(code)]
/// Language primitive value types.
#[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,
];

/* pointer-width related */

#[doc = crate::_tags!(code mem)]
/// Primitive value types that fit in pointer-width on supported Rust targets.
#[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)]
/// Primitive types that can be used for indexing.
#[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];