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