1use std::fmt;
2
3#[derive(Clone)]
5pub struct Box<'dwarf, R>
6where
7 R: crate::gimli::Reader<Offset = usize>,
8{
9 dwarf: &'dwarf crate::gimli::Dwarf<R>,
10 unit: &'dwarf crate::gimli::Unit<R, usize>,
11 entry: crate::gimli::UnitOffset,
12 name: Option<super::Name<R>>,
13 target: crate::gimli::UnitOffset,
14}
15
16impl<'dwarf, R> Box<'dwarf, R>
17where
18 R: crate::gimli::Reader<Offset = usize>,
19{
20 pub(super) fn new(
22 dwarf: &'dwarf crate::gimli::Dwarf<R>,
23 unit: &'dwarf crate::gimli::Unit<R, usize>,
24 entry: crate::gimli::UnitOffset,
25 name: Option<super::Name<R>>,
26 target: crate::gimli::UnitOffset,
27 ) -> Self {
28 Self {
29 dwarf,
30 unit,
31 entry,
32 name,
33 target,
34 }
35 }
36
37 pub fn name(&self) -> Option<&super::Name<R>> {
39 self.name.as_ref()
40 }
41
42 pub fn size(&self) -> u64 {
44 core::mem::size_of::<usize>() as _
45 }
46
47 pub fn r#type(&self) -> Result<super::Type<'dwarf, R>, crate::Error> {
49 let entry = self.unit.entry(self.target)?;
50 super::Type::from_die(self.dwarf, self.unit, entry)
51 }
52}
53
54impl<'dwarf, R> fmt::Debug for Box<'dwarf, R>
55where
56 R: crate::gimli::Reader<Offset = usize>,
57{
58 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
59 let entry = self.unit.entry(self.entry).map_err(crate::fmt_err)?;
60 let mut debug_tuple = f.debug_tuple("deflect::schema::Shared");
61 debug_tuple.field(&crate::debug::DebugEntry::new(
62 self.dwarf, self.unit, &entry,
63 ));
64 debug_tuple.finish()
65 }
66}
67
68impl<'dwarf, R> fmt::Display for Box<'dwarf, R>
69where
70 R: crate::gimli::Reader<Offset = usize>,
71{
72 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
73 if let Some(name) = self.name() {
74 name.fmt(f)
75 } else {
76 f.write_str("*? ")?;
77 let target = self.r#type().map_err(crate::fmt_err)?;
78 target.fmt(f)
79 }
80 }
81}