1use facet_core::{MapDef, Opaque, OpaqueConst};
2
3use crate::Peek;
4
5use super::PeekValue;
6
7pub 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#[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 pub fn new(value: PeekValue<'mem>, def: MapDef) -> Self {
57 Self { value, def }
58 }
59
60 pub fn len(&self) -> usize {
62 unsafe { (self.def.vtable.len_fn)(self.value.data()) }
63 }
64
65 pub fn is_empty(&self) -> bool {
67 self.len() == 0
68 }
69
70 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 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 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}