1use std::{cmp::Ordering, num::NonZeroU32};
2
3use crate::{search::AvltrieeSearch, AvltrieeAllocator};
4
5use super::Avltriee;
6
7#[derive(PartialEq)]
8enum Order {
9 Asc,
10 Desc,
11}
12
13pub struct AvltrieeIter<'a, T, I: ?Sized, A> {
14 now: Option<NonZeroU32>,
15 end_row: Option<NonZeroU32>,
16 same_branch: Option<NonZeroU32>,
17 triee: &'a Avltriee<T, I, A>,
18 next_func: fn(
19 &Avltriee<T, I, A>,
20 NonZeroU32,
21 Option<NonZeroU32>,
22 ) -> Option<(NonZeroU32, Option<NonZeroU32>)>,
23}
24
25impl<'a, T, I: ?Sized, A: AvltrieeAllocator<T>> AvltrieeIter<'a, T, I, A> {
26 fn new(
27 triee: &'a Avltriee<T, I, A>,
28 now: Option<NonZeroU32>,
29 end_row: Option<NonZeroU32>,
30 order: Order,
31 ) -> AvltrieeIter<'a, T, I, A> {
32 match order {
33 Order::Asc => AvltrieeIter {
34 now,
35 end_row,
36 same_branch: None,
37 triee,
38 next_func: Avltriee::<T, I, A>::next,
39 },
40 Order::Desc => AvltrieeIter {
41 now: end_row,
42 end_row: now,
43 same_branch: None,
44 triee,
45 next_func: Avltriee::<T, I, A>::next_desc,
46 },
47 }
48 }
49
50 pub fn by<S: AvltrieeSearch<T, I, A>>(s: &'a S, value: &I) -> AvltrieeIter<'a, T, I, A> {
52 let triee = s.as_ref();
53 let edge = s.edge(value);
54 let row = if edge.1 == Ordering::Equal {
55 edge.0
56 } else {
57 None
58 };
59 AvltrieeIter::new(triee, row, row, Order::Asc)
60 }
61
62 pub fn from_asc<S: AvltrieeSearch<T, I, A>>(s: &'a S, value: &I) -> AvltrieeIter<'a, T, I, A> {
64 Self::from_inner(s, value, Order::Asc)
65 }
66
67 pub fn from_desc<S: AvltrieeSearch<T, I, A>>(s: &'a S, value: &I) -> AvltrieeIter<'a, T, I, A> {
69 Self::from_inner(s, value, Order::Desc)
70 }
71
72 fn from_inner<S: AvltrieeSearch<T, I, A>>(
73 s: &'a S,
74 value: &I,
75 order: Order,
76 ) -> AvltrieeIter<'a, T, I, A> {
77 let triee = s.as_ref();
78 let now = s.ge(value);
79 AvltrieeIter::new(triee, now, now.and_then(|_| triee.max(triee.root())), order)
80 }
81
82 pub fn to_asc<S: AvltrieeSearch<T, I, A>>(s: &'a S, value: &I) -> AvltrieeIter<'a, T, I, A> {
84 Self::to_inner(s, value, Order::Asc)
85 }
86
87 pub fn to_desc<S: AvltrieeSearch<T, I, A>>(s: &'a S, value: &I) -> AvltrieeIter<'a, T, I, A> {
89 Self::to_inner(s, value, Order::Desc)
90 }
91
92 fn to_inner<S: AvltrieeSearch<T, I, A>>(
93 s: &'a S,
94 value: &I,
95 order: Order,
96 ) -> AvltrieeIter<'a, T, I, A> {
97 let triee = s.as_ref();
98 let end_row = s.le(value);
99 AvltrieeIter::new(
100 triee,
101 end_row.and_then(|_| triee.min(triee.root())),
102 end_row,
103 order,
104 )
105 }
106
107 pub fn over_asc<S: AvltrieeSearch<T, I, A>>(s: &'a S, value: &I) -> AvltrieeIter<'a, T, I, A> {
109 Self::over_inner(s, value, Order::Asc)
110 }
111
112 pub fn over_desc<S: AvltrieeSearch<T, I, A>>(s: &'a S, value: &I) -> AvltrieeIter<'a, T, I, A> {
114 Self::over_inner(s, value, Order::Desc)
115 }
116
117 fn over_inner<S: AvltrieeSearch<T, I, A>>(
118 s: &'a S,
119 value: &I,
120 order: Order,
121 ) -> AvltrieeIter<'a, T, I, A> {
122 let triee = s.as_ref();
123 let now = s.gt(value);
124 AvltrieeIter::new(triee, now, now.and_then(|_| triee.max(triee.root())), order)
125 }
126
127 pub fn under_asc<S: AvltrieeSearch<T, I, A>>(s: &'a S, value: &I) -> AvltrieeIter<'a, T, I, A> {
129 Self::under_inner(s, value, Order::Asc)
130 }
131
132 pub fn under_desc<S: AvltrieeSearch<T, I, A>>(
134 s: &'a S,
135 value: &I,
136 ) -> AvltrieeIter<'a, T, I, A> {
137 Self::under_inner(s, value, Order::Desc)
138 }
139
140 fn under_inner<S: AvltrieeSearch<T, I, A>>(
141 s: &'a S,
142 value: &I,
143 order: Order,
144 ) -> AvltrieeIter<'a, T, I, A> {
145 let triee = s.as_ref();
146 let end_row = s.lt(value);
147 AvltrieeIter::new(
148 triee,
149 end_row.and_then(|_| triee.min(triee.root())),
150 end_row,
151 order,
152 )
153 }
154
155 pub fn range_asc<S: AvltrieeSearch<T, I, A>>(
157 s: &'a S,
158 start: &I,
159 end: &I,
160 ) -> AvltrieeIter<'a, T, I, A> {
161 Self::range_inner(s, start, end, Order::Asc)
162 }
163
164 pub fn range_desc<S: AvltrieeSearch<T, I, A>>(
166 s: &'a S,
167 start: &I,
168 end: &I,
169 ) -> AvltrieeIter<'a, T, I, A> {
170 Self::range_inner(s, start, end, Order::Desc)
171 }
172
173 fn range_inner<S: AvltrieeSearch<T, I, A>>(
174 s: &'a S,
175 start: &I,
176 end: &I,
177 order: Order,
178 ) -> AvltrieeIter<'a, T, I, A> {
179 let triee = s.as_ref();
180 if let Some(range) = s.range(start, end) {
181 AvltrieeIter::new(triee, Some(range.start), Some(range.end), order)
182 } else {
183 AvltrieeIter::new(triee, None, None, order)
184 }
185 }
186}
187
188impl<'a, T, I: ?Sized, A: AvltrieeAllocator<T>> Iterator for AvltrieeIter<'a, T, I, A> {
189 type Item = NonZeroU32;
190
191 fn next(&mut self) -> Option<Self::Item> {
192 self.now.map(|c| {
193 self.now = if Some(c) == self.end_row {
194 let same = unsafe { self.triee.node_unchecked(c) }.same;
195 if same.is_some() {
196 self.end_row = same;
197 }
198 same
199 } else {
200 let next_func = self.next_func;
201 next_func(self.triee, c, self.same_branch).map(|(i, b)| {
202 self.same_branch = b;
203 i
204 })
205 };
206 c
207 })
208 }
209}
210
211impl<T, I: ?Sized, A: AvltrieeAllocator<T>> Avltriee<T, I, A> {
212 pub fn iter(&self) -> AvltrieeIter<T, I, A> {
214 AvltrieeIter::new(
215 &self,
216 self.min(self.root()),
217 self.max(self.root()),
218 Order::Asc,
219 )
220 }
221
222 pub fn desc_iter(&self) -> AvltrieeIter<T, I, A> {
224 AvltrieeIter::new(
225 &self,
226 self.min(self.root()),
227 self.max(self.root()),
228 Order::Desc,
229 )
230 }
231
232 pub fn iter_by<'a>(&'a self, value: &I) -> AvltrieeIter<T, I, A>
234 where
235 Self: AvltrieeSearch<T, I, A>,
236 {
237 AvltrieeIter::by(self, value)
238 }
239
240 pub fn iter_from<'a>(&'a self, value: &I) -> AvltrieeIter<T, I, A>
242 where
243 Self: AvltrieeSearch<T, I, A>,
244 {
245 AvltrieeIter::from_asc(self, value)
246 }
247
248 pub fn desc_iter_from<'a>(&'a self, value: &I) -> AvltrieeIter<T, I, A>
250 where
251 Self: AvltrieeSearch<T, I, A>,
252 {
253 AvltrieeIter::from_desc(self, value)
254 }
255
256 pub fn iter_to<'a>(&'a self, value: &I) -> AvltrieeIter<T, I, A>
258 where
259 Self: AvltrieeSearch<T, I, A>,
260 {
261 AvltrieeIter::to_asc(self, value)
262 }
263
264 pub fn desc_iter_to<'a>(&'a self, value: &I) -> AvltrieeIter<T, I, A>
266 where
267 Self: AvltrieeSearch<T, I, A>,
268 {
269 AvltrieeIter::to_desc(self, value)
270 }
271
272 pub fn iter_over<'a>(&'a self, value: &I) -> AvltrieeIter<T, I, A>
274 where
275 Self: AvltrieeSearch<T, I, A>,
276 {
277 AvltrieeIter::over_asc(self, value)
278 }
279
280 pub fn desc_iter_over<'a>(&'a self, value: &I) -> AvltrieeIter<T, I, A>
282 where
283 Self: AvltrieeSearch<T, I, A>,
284 {
285 AvltrieeIter::over_desc(self, value)
286 }
287
288 pub fn iter_under<'a>(&'a self, value: &I) -> AvltrieeIter<T, I, A>
290 where
291 Self: AvltrieeSearch<T, I, A>,
292 {
293 AvltrieeIter::under_asc(self, value)
294 }
295
296 pub fn desc_iter_under<'a>(&'a self, value: &I) -> AvltrieeIter<T, I, A>
298 where
299 Self: AvltrieeSearch<T, I, A>,
300 {
301 AvltrieeIter::under_desc(self, value)
302 }
303
304 pub fn iter_range<'a>(&'a self, start: &I, end: &I) -> AvltrieeIter<T, I, A>
306 where
307 Self: AvltrieeSearch<T, I, A>,
308 {
309 AvltrieeIter::range_asc(self, start, end)
310 }
311
312 pub fn desc_iter_range<'a>(&'a self, start: &I, end: &I) -> AvltrieeIter<T, I, A>
314 where
315 Self: AvltrieeSearch<T, I, A>,
316 {
317 AvltrieeIter::range_desc(self, start, end)
318 }
319
320 fn next(
321 &self,
322 c: NonZeroU32,
323 same_branch: Option<NonZeroU32>,
324 ) -> Option<(NonZeroU32, Option<NonZeroU32>)> {
325 let mut node = unsafe { self.node_unchecked(c) };
326 if let Some(same) = node.same {
327 Some((
328 same,
329 if same_branch.is_some() {
330 same_branch
331 } else {
332 Some(c)
333 },
334 ))
335 } else {
336 let current = if let Some(same_branch) = same_branch {
337 node = unsafe { self.node_unchecked(same_branch) };
338 same_branch
339 } else {
340 c
341 };
342 if node.right.is_some() {
343 Some((self.min(node.right).unwrap(), None))
344 } else {
345 node.parent.and_then(|parent| {
346 if unsafe { self.node_unchecked(parent) }.left == Some(current) {
347 Some((parent, None))
348 } else {
349 self.retroactive(parent).map(|i| (i, None))
350 }
351 })
352 }
353 }
354 }
355
356 fn retroactive(&self, c: NonZeroU32) -> Option<NonZeroU32> {
357 unsafe { self.node_unchecked(c) }.parent.and_then(|parent| {
358 if unsafe { self.node_unchecked(parent) }.right == Some(c) {
359 self.retroactive(parent).filter(|p| p.get() != c.get())
360 } else {
361 Some(parent)
362 }
363 })
364 }
365
366 fn next_desc(
367 &self,
368 c: NonZeroU32,
369 same_branch: Option<NonZeroU32>,
370 ) -> Option<(NonZeroU32, Option<NonZeroU32>)> {
371 let mut node = unsafe { self.node_unchecked(c) };
372 if let Some(same) = node.same {
373 Some((
374 same,
375 Some(if let Some(same_branch) = same_branch {
376 same_branch
377 } else {
378 c
379 }),
380 ))
381 } else {
382 let mut current = c;
383 if let Some(same_branch) = same_branch {
384 current = same_branch;
385 node = unsafe { self.node_unchecked(current) };
386 }
387 if node.left.is_some() {
388 Some((self.max(node.left).unwrap(), None))
389 } else {
390 node.parent.and_then(|parent| {
391 if unsafe { self.node_unchecked(parent) }.right == Some(current) {
392 Some((parent, None))
393 } else {
394 self.retroactive_desc(parent).map(|i| (i, None))
395 }
396 })
397 }
398 }
399 }
400
401 fn retroactive_desc(&self, c: NonZeroU32) -> Option<NonZeroU32> {
402 unsafe { self.node_unchecked(c) }.parent.and_then(|parent| {
403 if unsafe { self.node_unchecked(parent) }.left == Some(c) {
404 self.retroactive_desc(parent).filter(|p| *p != c)
405 } else {
406 Some(parent)
407 }
408 })
409 }
410}