facet_reflect/peek/
set.rs

1use super::Peek;
2use facet_core::{PtrMut, SetDef};
3
4/// Iterator over values in a `PeekSet`
5pub 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/// Lets you read from a set
40#[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    /// Constructor
55    #[inline]
56    pub fn new(value: Peek<'mem, 'facet>, def: SetDef) -> Self {
57        Self { value, def }
58    }
59
60    /// Returns true if the set is empty
61    #[inline]
62    pub fn is_empty(&self) -> bool {
63        self.len() == 0
64    }
65
66    /// Get the number of entries in the set
67    #[inline]
68    pub fn len(&self) -> usize {
69        unsafe { (self.def.vtable.len_fn)(self.value.data()) }
70    }
71
72    /// Returns an iterator over the values in the set
73    #[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    /// Def getter
81    #[inline]
82    pub fn def(&self) -> SetDef {
83        self.def
84    }
85}