fdt_rs/base/
prop.rs

1use core::ptr;
2
3use crate::base::iters::DevTreeIter;
4use crate::base::{DevTree, DevTreeNode};
5use crate::prelude::*;
6
7use unsafe_unwrap::UnsafeUnwrap;
8
9/// A handle to a [`DevTreeNode`]'s Device Tree Property
10#[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    /// Returns the node which this property is attached to
44    #[must_use]
45    fn node(&self) -> DevTreeNode<'r, 'dt> {
46        unsafe {
47            // Unsafe unwrap okay.
48            // We're look back in the tree - our parent node is behind us.
49            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}