1use super::*;
2use core::marker::PhantomData;
3use core::ptr::null_mut;
4use pointers::Pointer;
5
6pub struct AvlIntoIter<P: Pointer, Tag>
7where
8 P: Pointer,
9 P::Target: AvlItem<Tag>,
10{
11 node: *mut P::Target,
12 dir: Dir,
13 _phan: PhantomData<fn(&Tag)>,
14}
15
16impl<P, Tag> AvlIntoIter<P, Tag>
17where
18 P: Pointer,
19 P::Target: AvlItem<Tag>,
20{
21 pub(crate) fn new(root: *mut P::Target, dir: Dir) -> Self {
22 Self { node: root, dir, _phan: Default::default() }
23 }
24}
25
26impl<P, Tag> Iterator for AvlIntoIter<P, Tag>
27where
28 P: Pointer,
29 P::Target: AvlItem<Tag>,
30{
31 type Item = P;
32
33 #[inline]
34 fn next(&mut self) -> Option<Self::Item> {
35 if !self.node.is_null() {
36 unsafe {
37 let item =
39 AvlTree::<P, Tag>::bottom_child(NonNull::new_unchecked(self.node), self.dir);
40 let _node = item.as_ref().get_node();
41 let right_child = _node.get_child(self.dir.reverse());
42 let parent = _node.get_parent();
43 _node.detach();
44 if !parent.is_null() {
45 if right_child.is_null() {
46 (*parent).get_node().set_child(self.dir, null_mut());
47 self.node = parent;
48 } else {
49 (*parent).get_node().set_child2::<P>(self.dir, right_child, parent);
50 self.node = right_child;
51 }
52 } else {
53 if !right_child.is_null() {
55 self.node = right_child;
56 (*right_child).get_node().parent = null_mut();
57 } else {
58 self.node = null_mut();
59 }
60 }
61 Some(P::from_raw(item.as_ptr()))
62 }
63 } else {
64 None
65 }
66 }
67}
68
69impl<P, Tag> Drop for AvlIntoIter<P, Tag>
70where
71 P: Pointer,
72 P::Target: AvlItem<Tag>,
73{
74 #[inline]
75 fn drop(&mut self) {
76 if self.node.is_null() {
77 return;
78 }
79 for _node in self.by_ref() {}
80 }
81}
82
83pub struct AvlIter<'a, P, Tag>
132where
133 P: Pointer,
134 P::Target: AvlItem<Tag>,
135{
136 cur: Option<NonNull<P::Target>>,
137 dir: Dir,
138 left: usize,
139 _phan: PhantomData<fn(&'a P, &'a Tag)>,
140}
141
142impl<'a, P, Tag> AvlIter<'a, P, Tag>
146where
147 P: Pointer,
148 P::Target: AvlItem<Tag>,
149{
150 #[inline]
151 pub(crate) fn new(
152 tree: &'a AvlTree<P, Tag>, init: Option<NonNull<P::Target>>, dir: Dir,
153 ) -> Self {
154 Self { cur: init, dir, left: tree.len(), _phan: Default::default() }
155 }
156}
157
158unsafe impl<'a, P, Tag> Send for AvlIter<'a, P, Tag>
159where
160 P: Pointer + Send,
161 P::Target: AvlItem<Tag>,
162{
163}
164
165impl<'a, P, Tag> Iterator for AvlIter<'a, P, Tag>
166where
167 P: Pointer,
168 P::Target: AvlItem<Tag>,
169{
170 type Item = AvlNodeRef<'a, P>;
171
172 #[inline]
173 fn next(&mut self) -> Option<Self::Item> {
174 let cur: NonNull<P::Target> = self.cur.take()?;
175 self.left -= 1;
176 self.cur = AvlTree::<P, Tag>::_walk_dir(cur, self.dir);
177 Some(AvlNodeRef::<'a, P>::new(cur.as_ptr()))
178 }
179}
180
181impl<'a, P, Tag> ExactSizeIterator for AvlIter<'a, P, Tag>
182where
183 P: Pointer,
184 P::Target: AvlItem<Tag>,
185{
186 #[inline]
187 fn len(&self) -> usize {
188 self.left
189 }
190}