facet_peek/
map.rs

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