facet_reflect/peek/
map.rs1use facet_core::{MapDef, PtrConst, PtrMut};
2
3use super::Peek;
4
5pub 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#[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 pub fn new(value: Peek<'mem, 'facet_lifetime>, def: MapDef) -> Self {
73 Self { value, def }
74 }
75
76 pub fn len(&self) -> usize {
78 unsafe { (self.def.vtable.len_fn)(self.value.data()) }
79 }
80
81 pub fn is_empty(&self) -> bool {
83 self.len() == 0
84 }
85
86 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 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 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 pub fn def(&self) -> MapDef {
114 self.def
115 }
116}