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