1use core::cmp;
2use core::fmt::Debug;
3use core::marker::PhantomData;
4use core::ops::ControlFlow;
5use core::ops::RangeFrom;
6use core::ops::RangeFull;
7use core::ops::RangeInclusive;
8use core::ops::RangeToInclusive;
9use core::ptr::NonNull;
10use core::sync::atomic::Ordering;
11
12#[cfg_attr(not(doc), expect(unused))]
13use crate::ConcurrentMap;
14#[cfg_attr(not(doc), expect(unused))]
15use crate::SequentialMap;
16use crate::raw;
17use crate::raw::Edge;
18use crate::raw::edge;
19use crate::raw::edge::Meta as _;
20use crate::raw::iter::Order;
21use crate::raw::key;
22use crate::raw::key::Len as _;
23use crate::raw::node::Lower as _;
24use crate::raw::node::Upper as _;
25use crate::sync::Atomic;
26
27pub(crate) enum RangeIter<'g, K: key::Read, W: key::Write<K>, R: Range<K>> {
28 Root {
29 writer: W,
30 #[expect(clippy::type_complexity)]
31 next: Option<(u64, NonNull<Atomic<Edge<K::Edge>>>)>,
32 },
33 Node(NodeIter<'g, K, W, R>),
34}
35
36impl<'g, K, W, R> Default for RangeIter<'g, K, W, R>
37where
38 K: key::Read,
39 W: key::Write<K>,
40 R: Range<K>,
41{
42 fn default() -> Self {
43 Self::Root {
44 writer: W::default(),
45 next: None,
46 }
47 }
48}
49
50impl<'g, K, W, R> RangeIter<'g, K, W, R>
51where
52 K: key::Read,
53 W: key::Write<K>,
54 R: Range<K>,
55{
56 pub(crate) unsafe fn new_unchecked(
57 root: *mut Atomic<Edge<K::Edge>>,
58 edge: ribbit::Packed<Edge<K::Edge>>,
59 prefix: K,
60 order: Option<Order>,
61 range: &R,
62 ) -> Self {
63 let Some((root, child)) = NonNull::new(root).zip(edge.child()) else {
64 return Self::default();
65 };
66
67 let meta = edge.meta();
68 let len = prefix.len();
69 let mut lower = range.lower(len);
70 let mut upper = range.upper(len);
71
72 let Some((lower_byte, upper_byte)) = lower.check(meta).zip(upper.check(meta)) else {
73 return Self::default();
74 };
75
76 let (writer, len) = W::new(prefix, meta);
77
78 match child {
79 edge::Child::Value(value) => Self::Root {
80 writer,
81 next: Some((value, root)),
82 },
83 edge::Child::Node(node) => {
84 let mut stack = Vec::with_capacity(7);
85 stack.push((len, lower_byte, upper_byte, unsafe {
86 node.entries(order.is_some(), lower_byte, upper_byte)
87 }));
88
89 Self::Node(NodeIter {
90 order,
91 lower,
92 upper,
93 writer,
94 stack,
95 })
96 }
97 }
98 }
99
100 #[inline]
101 pub(crate) fn try_fold<F, B, C>(self, init: C, mut apply: F) -> ControlFlow<B, C>
102 where
103 F: FnMut(C, (&W, u64, NonNull<Atomic<Edge<K::Edge>>>)) -> ControlFlow<B, C>,
104 {
105 match self {
106 RangeIter::Root { writer, mut next } => {
107 if let Some((value, edge)) = next.take() {
108 apply(init, (&writer, value, edge))
109 } else {
110 ControlFlow::Continue(init)
111 }
112 }
113 RangeIter::Node(mut iter) => iter.try_fold(init, apply),
114 }
115 }
116
117 #[inline]
118 #[expect(clippy::type_complexity)]
119 pub(crate) fn lend(&mut self) -> Option<(&W, u64, NonNull<Atomic<Edge<K::Edge>>>)> {
120 match self {
121 RangeIter::Root { writer, next } => {
122 crate::cold();
123 let (value, edge) = next.take()?;
124 Some((writer, value, edge))
125 }
126 RangeIter::Node(iter) => iter.lend(),
127 }
128 }
129}
130
131pub(crate) struct NodeIter<'g, K, W, R>
132where
133 K: key::Read,
134 W: key::Write<K>,
135 R: Range<K>,
136{
137 order: Option<Order>,
138 lower: R::Lower,
139 upper: R::Upper,
140 writer: W,
141 #[expect(clippy::type_complexity)]
142 stack: Vec<(
143 W::Len,
144 <R::Lower as Lower<K::Edge>>::Bound,
145 <R::Upper as Upper<K::Edge>>::Bound,
146 raw::node::EntryIter<'g>,
147 )>,
148}
149
150impl<'g, K, W, R> NodeIter<'g, K, W, R>
151where
152 K: key::Read,
153 R: Range<K>,
154 W: key::Write<K>,
155{
156 #[inline]
157 #[expect(clippy::type_complexity)]
158 fn lend(&mut self) -> Option<(&W, u64, NonNull<Atomic<Edge<K::Edge>>>)> {
159 let next = match self.try_fold(None, |init, (_, value, edge)| {
160 validate!(init.is_none());
161 ControlFlow::Break((value, edge))
162 }) {
163 ControlFlow::Break((value, edge)) => Some((value, edge)),
164 ControlFlow::Continue(init) => {
165 validate!(init.is_none());
166 init
167 }
168 };
169
170 next.map(|(value, edge)| (&self.writer, value, edge))
171 }
172
173 fn try_fold<F, B, C>(&mut self, mut init: C, mut apply: F) -> ControlFlow<B, C>
191 where
192 F: FnMut(C, (&W, u64, NonNull<Atomic<Edge<K::Edge>>>)) -> ControlFlow<B, C>,
193 {
194 'vertical: loop {
195 let Some((len, lower, upper, iter)) = self.stack.last_mut() else {
196 return ControlFlow::Continue(init);
197 };
198
199 'horizontal: loop {
200 let next = match self.order {
201 None | Some(Order::Ascend) => iter.next(),
202 Some(Order::Descend) => iter.next_back(),
203 };
204
205 let Some((mut byte, mut edge)) = next else {
206 self.stack.pop();
207 continue 'vertical;
208 };
209
210 let mut len = *len;
211 let mut lower = *lower;
212 let mut upper = *upper;
213
214 'flatten: loop {
215 let (meta, child) = {
216 let edge = unsafe { edge.cast::<Atomic<Edge<K::Edge>>>().as_ref() }
217 .load_packed(Ordering::Acquire);
218 let Some(child) = edge.child() else {
219 continue 'horizontal;
220 };
221 let meta = edge.meta();
222 (meta, child)
223 };
224
225 lower = if lower.check(byte) {
226 match self.lower.check(meta) {
228 Some(lower) => lower,
229 None if matches!(self.order, Some(Order::Descend)) => {
231 self.stack.clear();
232 return ControlFlow::Continue(init);
233 }
234 None => continue 'horizontal,
236 }
237 } else {
238 Default::default()
240 };
241
242 upper = if upper.check(byte) {
243 match self.upper.check(meta) {
245 Some(upper) => upper,
246 None if matches!(self.order, Some(Order::Descend)) => {
248 continue 'horizontal;
249 }
250 None => {
252 self.stack.clear();
253 return ControlFlow::Continue(init);
254 }
255 }
256 } else {
257 Default::default()
259 };
260
261 len = self.writer.replace(len, byte, meta);
262
263 match child {
264 edge::Child::Value(value) => {
265 init = apply(init, (&self.writer, value, edge.cast()))?;
266 continue 'horizontal;
267 }
268 edge::Child::Node(node) => {
269 match unsafe {
271 node.entry_or_entries(self.order.is_some(), lower, upper)
272 } {
273 Ok((next_byte, next_edge)) => {
274 byte = next_byte;
275 edge = next_edge;
276 continue 'flatten;
277 }
278 Err(iter) => {
279 self.stack.push((len, lower, upper, iter));
280 continue 'vertical;
281 }
282 }
283 }
284 }
285 }
286 }
287 }
288 }
289}
290
291#[derive(Copy, Clone, Debug)]
292pub struct Include<T>(pub(crate) T);
293
294pub struct Unbound<T = ()>(PhantomData<T>);
295
296impl<T> Copy for Unbound<T> {}
297
298impl<T> Clone for Unbound<T> {
299 fn clone(&self) -> Self {
300 *self
301 }
302}
303
304impl<T> Default for Unbound<T> {
305 #[inline]
306 fn default() -> Self {
307 Self(PhantomData)
308 }
309}
310
311impl<T> Debug for Unbound<T> {
312 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> std::fmt::Result {
313 write!(f, "Unbound")
314 }
315}
316
317#[expect(private_bounds)]
328pub trait Range<R>
329where
330 R: key::Read,
331{
332 #[doc(hidden)]
333 #[expect(private_bounds)]
334 type Lower: Lower<R::Edge>;
335
336 #[doc(hidden)]
337 #[expect(private_bounds)]
338 type Upper: Upper<R::Edge>;
339
340 #[doc(hidden)]
341 #[expect(private_interfaces)]
342 fn lower(&self, start: R::Len) -> Self::Lower;
343
344 #[doc(hidden)]
345 #[expect(private_interfaces)]
346 fn upper(&self, start: R::Len) -> Self::Upper;
347
348 #[doc(hidden)]
349 #[inline]
350 fn common_prefix(&self) -> R {
351 R::default()
352 }
353}
354
355impl<R: key::Read, T: Into<R> + Copy> Range<R> for RangeInclusive<T> {
356 type Lower = Include<R>;
357 type Upper = Include<R>;
358
359 #[inline]
360 #[expect(private_interfaces)]
361 fn lower(&self, start: R::Len) -> Self::Lower {
362 Include((*self.start()).into().suffix(start))
363 }
364
365 #[inline]
366 #[expect(private_interfaces)]
367 fn upper(&self, start: R::Len) -> Self::Upper {
368 Include((*self.end()).into().suffix(start))
369 }
370
371 #[inline]
372 fn common_prefix(&self) -> R {
373 let lower = (*self.start()).into();
374 let upper = (*self.end()).into();
375 lower.common_prefix(upper)
376 }
377}
378
379impl<R: key::Read, T: Into<R> + Copy> Range<R> for RangeFrom<T> {
380 type Lower = Include<R>;
381 type Upper = Unbound<R>;
382
383 #[inline]
384 #[expect(private_interfaces)]
385 fn lower(&self, start: R::Len) -> Self::Lower {
386 Include(self.start.into().suffix(start))
387 }
388
389 #[inline]
390 #[expect(private_interfaces)]
391 fn upper(&self, _start: R::Len) -> Self::Upper {
392 Unbound::default()
393 }
394}
395
396impl<R: key::Read, T: Into<R> + Copy> Range<R> for RangeToInclusive<T> {
397 type Lower = Unbound<R>;
398 type Upper = Include<R>;
399
400 #[inline]
401 #[expect(private_interfaces)]
402 fn lower(&self, _start: R::Len) -> Self::Lower {
403 Unbound::default()
404 }
405
406 #[inline]
407 #[expect(private_interfaces)]
408 fn upper(&self, start: R::Len) -> Self::Upper {
409 Include(self.end.into().suffix(start))
410 }
411}
412
413impl<R> Range<R> for RangeFull
414where
415 R: key::Read,
416{
417 type Lower = Unbound<R>;
418 type Upper = Unbound<R>;
419
420 #[inline]
421 #[expect(private_interfaces)]
422 fn lower(&self, _: R::Len) -> Self::Lower {
423 Unbound::default()
424 }
425
426 #[inline]
427 #[expect(private_interfaces)]
428 fn upper(&self, _: R::Len) -> Self::Upper {
429 Unbound::default()
430 }
431}
432
433trait Lower<M>: Debug
434where
435 M: ribbit::Pack<Packed: edge::Meta>,
436{
437 type Bound: raw::node::Lower;
438
439 fn check(&mut self, edge: ribbit::Packed<M>) -> Option<Self::Bound>;
440}
441
442trait Upper<M>: Debug
443where
444 M: ribbit::Pack<Packed: edge::Meta>,
445{
446 type Bound: raw::node::Upper;
447
448 fn check(&mut self, edge: ribbit::Packed<M>) -> Option<Self::Bound>;
449}
450
451#[expect(private_bounds)]
452impl<R: key::Read> Include<R> {
453 #[inline]
454 fn check_eq(&mut self, len: <ribbit::Packed<R::Edge> as edge::Meta>::Len) -> Option<u8> {
455 let next = self.0.get_byte(len);
456 let skip = match next {
457 None => R::Len::ZERO,
458 Some(_) => R::Len::BYTE,
459 };
460 self.0 = self.0.suffix(skip + len.into());
461 next
462 }
463}
464
465impl<R: key::Read> Lower<R::Edge> for Include<R> {
466 type Bound = Option<u8>;
467
468 fn check(&mut self, edge: ribbit::Packed<R::Edge>) -> Option<Self::Bound> {
469 let len = edge.len();
470 match edge.cmp(&self.0.get_edge(len)) {
471 cmp::Ordering::Less => None,
472 cmp::Ordering::Equal => Some(self.check_eq(len)),
473 cmp::Ordering::Greater => Some(None),
474 }
475 }
476}
477
478impl<R: key::Read> Upper<R::Edge> for Include<R> {
479 type Bound = Option<u8>;
480
481 fn check(&mut self, edge: ribbit::Packed<R::Edge>) -> Option<Self::Bound> {
482 let len = edge.len();
483 match edge.cmp(&self.0.get_edge(len)) {
484 cmp::Ordering::Less => Some(None),
485 cmp::Ordering::Equal => Some(self.check_eq(len)),
486 cmp::Ordering::Greater => None,
487 }
488 }
489}
490
491impl<R: key::Read> Lower<R::Edge> for Unbound<R> {
492 type Bound = Unbound<R>;
493
494 #[inline]
495 fn check(&mut self, _: ribbit::Packed<R::Edge>) -> Option<Self::Bound> {
496 Some(Unbound::default())
497 }
498}
499
500impl<R: key::Read> Upper<R::Edge> for Unbound<R> {
501 type Bound = Unbound<R>;
502
503 #[inline]
504 fn check(&mut self, _: ribbit::Packed<R::Edge>) -> Option<Self::Bound> {
505 Some(Unbound::default())
506 }
507}