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 {}