deflect/value/
slice_impl.rs1use std::fmt;
2
3pub struct Slice<'value, 'dwarf, P = crate::DefaultProvider>
5where
6 P: crate::DebugInfoProvider,
7{
8 value: crate::Bytes<'value>,
9 schema: crate::schema::Slice<'dwarf, P::Reader>,
10 provider: &'dwarf P,
11}
12
13impl<'dwarf, R> crate::schema::Slice<'dwarf, R>
14where
15 R: crate::gimli::Reader<Offset = std::primitive::usize>,
16{
17 pub(crate) unsafe fn with_bytes<'value, P>(
18 self,
19 provider: &'dwarf P,
20 bytes: crate::Bytes<'value>,
21 ) -> Result<Slice<'value, 'dwarf, P>, crate::Error>
22 where
23 P: crate::DebugInfoProvider<Reader = R>,
24 {
25 Ok(Slice {
26 value: bytes,
27 schema: self,
28 provider,
29 })
30 }
31}
32
33impl<'value, 'dwarf, P> Slice<'value, 'dwarf, P>
34where
35 P: crate::DebugInfoProvider,
36{
37 pub fn schema(&self) -> &crate::schema::Slice<'dwarf, P::Reader> {
39 &self.schema
40 }
41
42 pub fn data_ptr(&self) -> Result<crate::Bytes<'value>, crate::Error> {
44 let field =
45 unsafe { super::Field::new(self.schema.data_ptr().clone(), self.value, self.provider) };
46 let value = field.value()?;
47 let value: super::Pointer<crate::schema::Mut, _> = value.try_into()?;
48 let ptr = value.deref_raw()?;
49 Ok(ptr)
50 }
51
52 pub fn length(&self) -> Result<usize, crate::Error> {
54 let field =
55 unsafe { super::Field::new(self.schema.length().clone(), self.value, self.provider) };
56 let value = field.value()?;
57 let len: usize = value.try_into()?;
58 Ok(len)
59 }
60
61 pub fn iter(&self) -> Result<super::Iter<'value, 'dwarf, P>, crate::Error> {
63 let elt_type = self.schema.elt()?;
64 let elt_size = elt_type.size()?;
65 let elt_size = usize::try_from(elt_size)?;
66
67 let length = self.length()?;
68 let bytes = elt_size * length;
69
70 let value = self.data_ptr()?.as_ptr();
71 let value = std::ptr::slice_from_raw_parts(value, bytes);
72 let value = unsafe { &*value };
73
74 Ok(unsafe { super::Iter::new(value, elt_size, elt_type, length, self.provider) })
75 }
76}
77
78impl<'value, 'dwarf, P> fmt::Debug for Slice<'value, 'dwarf, P>
79where
80 P: crate::DebugInfoProvider,
81{
82 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
83 let mut debug_struct = f.debug_struct("deflect::value::Slice");
84 debug_struct.field("schema", &self.schema);
85 debug_struct.field("value", &self.value);
86 debug_struct.finish()
87 }
88}
89
90impl<'value, 'dwarf, P> fmt::Display for Slice<'value, 'dwarf, P>
91where
92 P: crate::DebugInfoProvider,
93{
94 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
95 f.write_str("&")?;
96 let mut debug_list = f.debug_list();
97 for maybe_elt in self.iter().map_err(crate::fmt_err)? {
98 let elt = maybe_elt.map_err(crate::fmt_err)?;
99 debug_list.entry(&crate::DebugDisplay(elt));
100 }
101 debug_list.finish()
102 }
103}