use std::fmt;
use crate::base::FileId;
#[derive(Copy, Clone, Eq, PartialEq, Hash)]
pub struct DefId {
pub file: FileId,
pub local: LocalDefId,
}
impl DefId {
#[inline]
pub const fn new(file: FileId, local: LocalDefId) -> Self {
Self { file, local }
}
}
impl fmt::Debug for DefId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "DefId({:?}:{})", self.file, self.local.0)
}
}
#[derive(Copy, Clone, Eq, PartialEq, Hash, Ord, PartialOrd)]
pub struct LocalDefId(pub u32);
impl LocalDefId {
#[inline]
pub const fn new(id: u32) -> Self {
Self(id)
}
#[inline]
pub const fn index(self) -> u32 {
self.0
}
}
impl fmt::Debug for LocalDefId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "LocalDefId({})", self.0)
}
}
impl From<u32> for LocalDefId {
#[inline]
fn from(id: u32) -> Self {
Self(id)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_def_id_equality() {
let file1 = FileId::new(1);
let file2 = FileId::new(2);
let a = DefId::new(file1, LocalDefId::new(0));
let b = DefId::new(file1, LocalDefId::new(0));
let c = DefId::new(file1, LocalDefId::new(1));
let d = DefId::new(file2, LocalDefId::new(0));
assert_eq!(a, b);
assert_ne!(a, c); assert_ne!(a, d); }
#[test]
fn test_def_id_size() {
assert_eq!(std::mem::size_of::<DefId>(), 8);
}
}