1use std::fmt;
2
3#[derive(Clone)]
5#[allow(non_camel_case_types)]
6pub struct Array<'value, 'dwarf, P = crate::DefaultProvider>
7where
8 P: crate::DebugInfoProvider,
9{
10 value: crate::Bytes<'value>,
11 schema: crate::schema::Array<'dwarf, P::Reader>,
12 provider: &'dwarf P,
13}
14
15impl<'dwarf, R> crate::schema::Array<'dwarf, R>
16where
17 R: crate::gimli::Reader<Offset = std::primitive::usize>,
18{
19 pub(crate) unsafe fn with_bytes<'value, P>(
20 self,
21 provider: &'dwarf P,
22 value: crate::Bytes<'value>,
23 ) -> Result<Array<'value, 'dwarf, P>, crate::Error>
24 where
25 P: crate::DebugInfoProvider<Reader = R>,
26 {
27 let len = self.len()?;
28 let elt_size = self.elt_type()?.size()?;
29 let bytes = len
30 .checked_mul(elt_size)
31 .ok_or_else(crate::error::arithmetic_overflow)?;
32 let bytes = usize::try_from(bytes)?;
33 let value = &value[..bytes];
34 Ok(Array {
35 value,
36 schema: self,
37 provider,
38 })
39 }
40}
41
42impl<'value, 'dwarf, P> Array<'value, 'dwarf, P>
43where
44 P: crate::DebugInfoProvider,
45{
46 pub fn schema(&self) -> &crate::schema::Array<'dwarf, P::Reader> {
48 &self.schema
49 }
50
51 pub fn iter(&self) -> Result<super::Iter<'value, 'dwarf, P>, crate::Error> {
53 let elt_type = self.schema.elt_type()?;
54 let elt_size = elt_type.size()?;
55 let elt_size = usize::try_from(elt_size)?;
56 let length = self.schema.len()?;
57 let length: usize = length.try_into()?;
58 Ok(unsafe { super::Iter::new(self.value, elt_size, elt_type, length, self.provider) })
59 }
60}
61
62impl<'value, 'dwarf, P> fmt::Debug for Array<'value, 'dwarf, P>
63where
64 P: crate::DebugInfoProvider,
65{
66 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
67 let mut debug_struct = f.debug_struct("deflect::value::Array");
68 debug_struct.field("schema", &self.schema);
69 debug_struct.field("value", &self.value);
70 debug_struct.finish()
71 }
72}
73
74impl<'value, 'dwarf, P> fmt::Display for Array<'value, 'dwarf, P>
75where
76 P: crate::DebugInfoProvider,
77{
78 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
79 let mut debug_list = f.debug_list();
80 for maybe_elt in self.iter().map_err(crate::fmt_err)? {
81 let elt = maybe_elt.map_err(crate::fmt_err)?;
82 debug_list.entry(&crate::DebugDisplay(elt));
83 }
84 debug_list.finish()
85 }
86}