use core::fmt::{Debug, Display, Formatter};
use core::hash::Hash;
mod sealed;
maybe_trait_bound!(
MaybeNumTrait,
cfg(feature = "num-traits"),
num_traits::PrimInt
);
maybe_trait_bound!(MaybePod, cfg(feature = "bytemuck"), bytemuck::Pod);
maybe_trait_bound!(
MaybeContiguous,
cfg(feature = "bytemuck"),
bytemuck::Contiguous
);
pub trait UnsignedPrimInt:
Eq
+ Hash
+ Ord
+ Copy
+ Default
+ Debug
+ Display
+ sealed::PrivateUnsignedInt
+ MaybeNumTrait
+ MaybePod
+ MaybeContiguous
{
}
#[inline]
pub fn checked_add<T: UnsignedPrimInt>(left: T, right: T) -> Option<T> {
sealed::PrivateUnsignedInt::checked_add(left, right)
}
#[inline]
pub fn checked_sub<T: UnsignedPrimInt>(left: T, right: T) -> Option<T> {
sealed::PrivateUnsignedInt::checked_sub(left, right)
}
#[inline]
pub fn to_usize_checked<T: UnsignedPrimInt>(val: T) -> Option<usize> {
T::to_usize_checked(val)
}
#[inline]
pub fn to_usize_wrapping<T: UnsignedPrimInt>(val: T) -> usize {
T::to_usize_wrapping(val)
}
#[inline]
pub fn from_usize_checked<T: UnsignedPrimInt>(val: usize) -> Option<T> {
T::from_usize_checked(val)
}
#[inline]
pub fn from_usize_wrapping<T: UnsignedPrimInt>(val: usize) -> T {
T::from_usize_wrapping(val)
}
#[inline]
pub const fn zero<T: UnsignedPrimInt>() -> T {
T::ZERO
}
#[inline]
pub const fn one<T: UnsignedPrimInt>() -> T {
T::ONE
}
#[inline]
pub const fn max_value<T: UnsignedPrimInt>() -> T {
T::MAX
}
#[cold]
pub fn debug_desc<T: UnsignedPrimInt>(value: T) -> DebugDesc<T> {
DebugDesc(value)
}
#[derive(Clone)]
pub struct DebugDesc<T: UnsignedPrimInt>(T);
impl<T: UnsignedPrimInt> Display for DebugDesc<T> {
fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
if self.0 == T::MAX {
f.write_str(T::TYPE_NAME)?;
f.write_str("::MAX")
} else {
<T as Display>::fmt(&self.0, f)
}
}
}
impl<T: UnsignedPrimInt> Debug for DebugDesc<T> {
fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
<Self as Display>::fmt(self, f)
}
}
#[inline(never)]
#[track_caller]
#[cold]
pub(crate) fn invalid_id<T: UnsignedPrimInt>(id: T) -> ! {
panic!("Invalid id: {}", debug_desc(id))
}