facet_reflect/peek/
set.rs1use super::Peek;
2use facet_core::{PtrMut, SetDef};
3
4pub struct PeekSetIter<'mem, 'facet, 'shape> {
6 set: PeekSet<'mem, 'facet, 'shape>,
7 iter: PtrMut<'mem>,
8}
9
10impl<'mem, 'facet, 'shape> Iterator for PeekSetIter<'mem, 'facet, 'shape> {
11 type Item = Peek<'mem, 'facet, 'shape>;
12
13 #[inline]
14 fn next(&mut self) -> Option<Self::Item> {
15 unsafe {
16 let next = (self.set.def.vtable.iter_vtable.next)(self.iter)?;
17 Some(Peek::unchecked_new(next, self.set.def.t()))
18 }
19 }
20}
21
22impl<'mem, 'facet, 'shape> Drop for PeekSetIter<'mem, 'facet, 'shape> {
23 #[inline]
24 fn drop(&mut self) {
25 unsafe { (self.set.def.vtable.iter_vtable.dealloc)(self.iter) }
26 }
27}
28
29impl<'mem, 'facet, 'shape> IntoIterator for &'mem PeekSet<'mem, 'facet, 'shape> {
30 type Item = Peek<'mem, 'facet, 'shape>;
31 type IntoIter = PeekSetIter<'mem, 'facet, 'shape>;
32
33 #[inline]
34 fn into_iter(self) -> Self::IntoIter {
35 self.iter()
36 }
37}
38
39#[derive(Clone, Copy)]
41pub struct PeekSet<'mem, 'facet, 'shape> {
42 pub(crate) value: Peek<'mem, 'facet, 'shape>,
43
44 pub(crate) def: SetDef<'shape>,
45}
46
47impl<'mem, 'facet, 'shape> core::fmt::Debug for PeekSet<'mem, 'facet, 'shape> {
48 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
49 f.debug_struct("PeekSet").finish_non_exhaustive()
50 }
51}
52
53impl<'mem, 'facet, 'shape> PeekSet<'mem, 'facet, 'shape> {
54 #[inline]
56 pub fn new(value: Peek<'mem, 'facet, 'shape>, def: SetDef<'shape>) -> Self {
57 Self { value, def }
58 }
59
60 #[inline]
62 pub fn is_empty(&self) -> bool {
63 self.len() == 0
64 }
65
66 #[inline]
68 pub fn len(&self) -> usize {
69 unsafe { (self.def.vtable.len_fn)(self.value.data().thin().unwrap()) }
70 }
71
72 #[inline]
74 pub fn iter(self) -> PeekSetIter<'mem, 'facet, 'shape> {
75 let iter_init_with_value_fn = self.def.vtable.iter_vtable.init_with_value.unwrap();
76 let iter = unsafe { iter_init_with_value_fn(self.value.data().thin().unwrap()) };
77 PeekSetIter { set: self, iter }
78 }
79
80 #[inline]
82 pub fn def(&self) -> SetDef<'shape> {
83 self.def
84 }
85}