1use crate::data::Reader;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7pub struct RegInfo {
8 pub address: u64,
10 pub size: Option<u64>,
12}
13
14impl RegInfo {
15 pub fn new(address: u64, size: Option<u64>) -> Self {
17 Self { address, size }
18 }
19}
20
21#[derive(Clone)]
23pub struct RegIter<'a> {
24 reader: Reader<'a>,
25 address_cells: u8,
26 size_cells: u8,
27}
28
29impl<'a> RegIter<'a> {
30 pub(crate) fn new(reader: Reader<'a>, address_cells: u8, size_cells: u8) -> RegIter<'a> {
31 RegIter {
32 reader,
33 address_cells,
34 size_cells,
35 }
36 }
37}
38
39impl Iterator for RegIter<'_> {
40 type Item = RegInfo;
41
42 fn next(&mut self) -> Option<Self::Item> {
43 let address;
44 let size;
45 if self.address_cells == 1 {
46 address = self.reader.read_u32().map(|addr| addr as u64)?;
47 } else if self.address_cells == 2 {
48 address = self.reader.read_u64()?;
49 } else {
50 return None;
51 }
52 if self.size_cells == 0 {
53 size = None;
54 } else if self.size_cells == 1 {
55 size = self.reader.read_u32().map(|s| s as u64);
56 } else if self.size_cells == 2 {
57 size = self.reader.read_u64();
58 } else {
59 return None;
61 }
62
63 Some(RegInfo::new(address, size))
64 }
65}