weak_lists/unsync/
iter.rs

1use {
2    crate::unsync::Iter,
3    alloc::rc::Rc,
4    core::{
5        fmt::{Debug, Formatter},
6        iter::FusedIterator,
7    },
8};
9
10impl<T> Drop for Iter<'_, T>
11where
12    T: ?Sized,
13{
14    fn drop(&mut self) {
15        let data = unsafe { &mut *self.data.get() };
16        data.active_iterators -= 1;
17    }
18}
19
20impl<T> Iterator for Iter<'_, T>
21where
22    T: ?Sized,
23{
24    type Item = Rc<T>;
25
26    fn next(&mut self) -> Option<Self::Item> {
27        for idx in self.iter.by_ref() {
28            let data = unsafe {
29                // SAFETY:
30                // - While we hold this reference, we do not call any functions that might
31                //   create additional references to self.data. This applies to all code that
32                //   creates references to self.data.
33                // - Therefore, this is an exclusive reference to self.data.
34                // - The get_by_index and upgrade calls below only run well-known code
35                //   that does not depend on T.
36                &mut *self.data.get()
37            };
38            if let Some(member) = data.members.get_by_index(idx) {
39                if let Some(member) = member.upgrade() {
40                    return Some(member);
41                }
42            }
43        }
44        None
45    }
46}
47
48impl<T> Clone for Iter<'_, T>
49where
50    T: ?Sized,
51{
52    fn clone(&self) -> Self {
53        let data = unsafe {
54            // SAFETY:
55            // - While we hold this reference, we do not call any functions that might
56            //   create additional references to self.data. This applies to all code that
57            //   creates references to self.data.
58            // - Therefore, this is an exclusive reference to self.data.
59            &mut *self.data.get()
60        };
61        data.active_iterators += 1;
62        Self {
63            iter: self.iter.clone(),
64            data: self.data,
65        }
66    }
67}
68
69impl<T> Debug for Iter<'_, T>
70where
71    T: ?Sized + Debug,
72{
73    fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
74        f.debug_list().entries(self.clone()).finish()
75    }
76}
77
78impl<T> FusedIterator for Iter<'_, T> where T: ?Sized {}