weak_lists/unsync/
iter.rs1use {
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 &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 &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 {}