facet_reflect/peek/
set.rs1use super::Peek;
2use facet_core::{PtrMut, SetDef};
3
4pub struct PeekSetIter<'mem, 'facet> {
6 set: PeekSet<'mem, 'facet>,
7 iter: PtrMut<'mem>,
8}
9
10impl<'mem, 'facet> Iterator for PeekSetIter<'mem, 'facet> {
11 type Item = Peek<'mem, 'facet>;
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> Drop for PeekSetIter<'mem, 'facet> {
23 #[inline]
24 fn drop(&mut self) {
25 unsafe { (self.set.def.vtable.iter_vtable.dealloc)(self.iter) }
26 }
27}
28
29impl<'mem, 'facet> IntoIterator for &'mem PeekSet<'mem, 'facet> {
30 type Item = Peek<'mem, 'facet>;
31 type IntoIter = PeekSetIter<'mem, 'facet>;
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> {
42 pub(crate) value: Peek<'mem, 'facet>,
43
44 pub(crate) def: SetDef,
45}
46
47impl<'mem, 'facet> core::fmt::Debug for PeekSet<'mem, 'facet> {
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> PeekSet<'mem, 'facet> {
54 #[inline]
56 pub fn new(value: Peek<'mem, 'facet>, def: SetDef) -> 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()) }
70 }
71
72 #[inline]
74 pub fn iter(self) -> PeekSetIter<'mem, 'facet> {
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()) };
77 PeekSetIter { set: self, iter }
78 }
79
80 #[inline]
82 pub fn def(&self) -> SetDef {
83 self.def
84 }
85}