#[macro_export]
macro_rules! define_newtype_counter {
(
$(#[$ty_attr:meta])*
$vis:vis struct $name:ident($(#[$field_attr:meta])* $inner_vis:vis $inner:ty);
) => {
$crate::define_newtype_id! {
$(#[$ty_attr])*
$vis struct $name($(#[$field_attr])* $inner_vis $inner);
}
impl $crate::IntegerIdContiguous for $name {}
impl $crate::IntegerIdCounter for $name {
const START: Self = $name(<$inner as $crate::IntegerIdCounter>::START);
const START_INT: Self::Int = <$inner as $crate::IntegerIdCounter>::START_INT;
}
};
}
#[macro_export]
macro_rules! define_newtype_id {
(
$(#[$ty_attr:meta])*
$vis:vis struct $name:ident($(#[$field_attr:meta])* $inner_vis:vis $inner:ty);
) => {
$(#[$ty_attr])*
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
#[repr(transparent)]
$vis struct $name($(#[$field_attr])* $inner_vis $inner);
impl $crate::IntegerId for $name {
$crate::impl_newtype_id_body!(for $name($inner));
}
};
}
#[macro_export]
macro_rules! impl_newtype_id_body {
(for $name:ident($inner:ty)) => {
type Int = <$inner as $crate::IntegerId>::Int;
const MIN_ID: Option<Self> = match <$inner as $crate::IntegerId>::MIN_ID {
Some(min) => Some($name(min)),
None => None,
};
const MAX_ID: Option<Self> = match <$inner as $crate::IntegerId>::MAX_ID {
Some(max) => Some($name(max)),
None => None,
};
const MIN_ID_INT: Option<Self::Int> = <$inner as $crate::IntegerId>::MIN_ID_INT;
const MAX_ID_INT: Option<Self::Int> = <$inner as $crate::IntegerId>::MAX_ID_INT;
const TRUSTED_RANGE: Option<$crate::trusted::TrustedRangeToken<Self>> = {
unsafe { $crate::trusted::TrustedRangeToken::assume_valid_if::<$inner>() }
};
#[inline]
fn from_int(id: Self::Int) -> Self {
$name(<$inner as $crate::IntegerId>::from_int(id))
}
#[inline]
fn from_int_checked(id: Self::Int) -> Option<Self> {
Some($name(<$inner as $crate::IntegerId>::from_int_checked(id)?))
}
#[inline]
unsafe fn from_int_unchecked(id: Self::Int) -> Self {
$name({
unsafe { <$inner as $crate::IntegerId>::from_int_unchecked(id) }
})
}
#[inline]
fn to_int(self) -> Self::Int {
$crate::IntegerId::to_int(self.0)
}
};
}