1use core::ptr;
2
3use crate::base::iters::DevTreeIter;
4use crate::base::{DevTree, DevTreeNode};
5use crate::prelude::*;
6
7use unsafe_unwrap::UnsafeUnwrap;
8
9#[derive(Clone)]
11pub struct DevTreeProp<'a, 'dt: 'a> {
12 parent_iter: DevTreeIter<'a, 'dt>,
13 propbuf: &'dt [u8],
14 nameoff: usize,
15}
16
17impl<'a, 'dt: 'a> PartialEq for DevTreeProp<'a, 'dt> {
18 fn eq(&self, other: &Self) -> bool {
19 ptr::eq(self.propbuf, other.propbuf)
20 && self.parent_iter == other.parent_iter
21 && self.nameoff == other.nameoff
22 }
23}
24
25impl<'r, 'dt: 'r> PropReader<'dt> for DevTreeProp<'r, 'dt> {
26 type NodeType = DevTreeNode<'r, 'dt>;
27
28 #[inline]
29 fn propbuf(&self) -> &'dt [u8] {
30 self.propbuf
31 }
32
33 #[inline]
34 fn nameoff(&self) -> usize {
35 self.nameoff
36 }
37
38 #[inline]
39 fn fdt(&self) -> &DevTree<'dt> {
40 self.parent_iter.fdt
41 }
42
43 #[must_use]
45 fn node(&self) -> DevTreeNode<'r, 'dt> {
46 unsafe {
47 self.parent_iter.clone().last_node().unsafe_unwrap()
50 }
51 }
52}
53
54impl<'a, 'dt: 'a> DevTreeProp<'a, 'dt> {
55 pub(super) fn new(
56 parent_iter: DevTreeIter<'a, 'dt>,
57 propbuf: &'dt [u8],
58 nameoff: usize,
59 ) -> Self {
60 Self {
61 parent_iter,
62 propbuf,
63 nameoff,
64 }
65 }
66}