unc_vm_compiler/
sourceloc.rs1use crate::lib::std::fmt;
11
12#[derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive, Debug, Clone, Copy, PartialEq, Eq)]
17#[archive(as = "Self")]
18#[repr(transparent)]
19pub struct SourceLoc(u32);
20
21impl SourceLoc {
22 pub fn new(bits: u32) -> Self {
24 Self(bits)
25 }
26
27 pub fn is_default(self) -> bool {
29 self == Default::default()
30 }
31
32 pub fn bits(self) -> u32 {
34 self.0
35 }
36}
37
38impl Default for SourceLoc {
39 fn default() -> Self {
40 Self(!0)
41 }
42}
43
44impl fmt::Display for SourceLoc {
45 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
46 if self.is_default() {
47 write!(f, "0x-")
48 } else {
49 write!(f, "0x{:04x}", self.0)
50 }
51 }
52}
53
54#[cfg(test)]
55mod tests {
56 use super::SourceLoc;
57 use crate::lib::std::string::ToString;
58
59 #[test]
60 fn display() {
61 assert_eq!(SourceLoc::default().to_string(), "0x-");
62 assert_eq!(SourceLoc::new(0).to_string(), "0x0000");
63 assert_eq!(SourceLoc::new(16).to_string(), "0x0010");
64 assert_eq!(SourceLoc::new(0xabcdef).to_string(), "0xabcdef");
65 }
66}