facet_reflect/peek/
map.rs

1use facet_core::{MapDef, PtrConst, PtrMut};
2
3use super::Peek;
4
5/// Iterator over key-value pairs in a `PeekMap`
6pub struct PeekMapIter<'mem> {
7    map: PeekMap<'mem>,
8    iter: PtrMut<'mem>,
9}
10
11impl<'mem> Iterator for PeekMapIter<'mem> {
12    type Item = (Peek<'mem>, Peek<'mem>);
13
14    fn next(&mut self) -> Option<Self::Item> {
15        unsafe {
16            let next = (self.map.def.vtable.iter_vtable.next)(self.iter);
17            next.map(|(key_ptr, value_ptr)| {
18                (
19                    Peek {
20                        data: key_ptr,
21                        shape: self.map.def.k,
22                    },
23                    Peek {
24                        data: value_ptr,
25                        shape: self.map.def.v,
26                    },
27                )
28            })
29        }
30    }
31}
32
33impl Drop for PeekMapIter<'_> {
34    fn drop(&mut self) {
35        unsafe { (self.map.def.vtable.iter_vtable.dealloc)(self.iter) }
36    }
37}
38
39impl<'mem> IntoIterator for &'mem PeekMap<'mem> {
40    type Item = (Peek<'mem>, Peek<'mem>);
41    type IntoIter = PeekMapIter<'mem>;
42
43    fn into_iter(self) -> Self::IntoIter {
44        self.iter()
45    }
46}
47
48/// Lets you read from a map (implements read-only [`facet_core::MapVTable`] proxies)
49#[derive(Clone, Copy)]
50pub struct PeekMap<'mem> {
51    pub(crate) value: Peek<'mem>,
52
53    pub(crate) def: MapDef,
54}
55
56impl<'mem> PeekMap<'mem> {
57    /// Constructor
58    pub fn new(value: Peek<'mem>, def: MapDef) -> Self {
59        Self { value, def }
60    }
61
62    /// Get the number of entries in the map
63    pub fn len(&self) -> usize {
64        unsafe { (self.def.vtable.len_fn)(self.value.data()) }
65    }
66
67    /// Returns true if the map is empty
68    pub fn is_empty(&self) -> bool {
69        self.len() == 0
70    }
71
72    /// Check if the map contains a key
73    pub fn contains_key(&self, key: &impl facet_core::Facet) -> bool {
74        unsafe {
75            let key_ptr = PtrConst::new(key);
76            (self.def.vtable.contains_key_fn)(self.value.data(), key_ptr)
77        }
78    }
79
80    /// Get a value from the map for the given key
81    pub fn get<'k>(&self, key: &'k impl facet_core::Facet) -> Option<Peek<'mem>> {
82        unsafe {
83            let key_ptr = PtrConst::new(key);
84            let value_ptr = (self.def.vtable.get_value_ptr_fn)(self.value.data(), key_ptr)?;
85            Some(Peek {
86                data: value_ptr,
87                shape: self.def.v,
88            })
89        }
90    }
91
92    /// Returns an iterator over the key-value pairs in the map
93    pub fn iter(self) -> PeekMapIter<'mem> {
94        let iter = unsafe { (self.def.vtable.iter_fn)(self.value.data()) };
95        PeekMapIter { map: self, iter }
96    }
97
98    /// Def getter
99    pub fn def(&self) -> MapDef {
100        self.def
101    }
102}