facet_reflect/peek/
map.rs1use facet_core::{MapDef, PtrConst, PtrMut};
2
3use super::Peek;
4
5pub 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#[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 pub fn new(value: Peek<'mem>, def: MapDef) -> Self {
59 Self { value, def }
60 }
61
62 pub fn len(&self) -> usize {
64 unsafe { (self.def.vtable.len_fn)(self.value.data()) }
65 }
66
67 pub fn is_empty(&self) -> bool {
69 self.len() == 0
70 }
71
72 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 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 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 pub fn def(&self) -> MapDef {
100 self.def
101 }
102}