weak_lists/sync/
iter.rs

1use {
2    crate::sync::Iter,
3    alloc::sync::Arc,
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 = &mut *self.data.lock();
16        data.active_iterators -= 1;
17    }
18}
19
20impl<T> Iterator for Iter<'_, T>
21where
22    T: ?Sized,
23{
24    type Item = Arc<T>;
25
26    fn next(&mut self) -> Option<Self::Item> {
27        for idx in self.iter.by_ref() {
28            let data = self.data.lock();
29            if let Some(member) = data.members.get_by_index(idx) {
30                if let Some(member) = member.upgrade() {
31                    return Some(member);
32                }
33            }
34        }
35        None
36    }
37}
38
39impl<T> Clone for Iter<'_, T>
40where
41    T: ?Sized,
42{
43    fn clone(&self) -> Self {
44        let data = &mut *self.data.lock();
45        data.active_iterators += 1;
46        Self {
47            iter: self.iter.clone(),
48            data: self.data,
49        }
50    }
51}
52
53impl<T> Debug for Iter<'_, T>
54where
55    T: ?Sized + Debug,
56{
57    fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
58        f.debug_list().entries(self.clone()).finish()
59    }
60}
61
62impl<T> FusedIterator for Iter<'_, T> where T: ?Sized {}