use std::{fmt, num::NonZeroUsize};
macro_rules! arena_id {
($(#[$meta:meta])* $name:ident) => {
$(#[$meta])*
#[repr(transparent)]
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
pub struct $name(NonZeroUsize);
impl $name {
pub(super) fn from_index(index: usize) -> Self {
let value = NonZeroUsize::new(index.wrapping_add(1))
.expect("binding arena indices must be smaller than usize::MAX");
Self(value)
}
pub(super) fn index(self) -> usize {
self.0.get() - 1
}
}
impl fmt::Debug for $name {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.debug_tuple(stringify!($name)).field(&self.index()).finish()
}
}
};
}
arena_id! {
TsContainerId
}
arena_id! {
TsMemberId
}
arena_id! {
TsNamespaceBodyId
}
arena_id! {
TsDeclarationId
}
arena_id! {
TsAliasId
}