1use core::{
2 fmt::{self, Debug},
3 iter::{FromIterator, FusedIterator},
4 ops::Bound::*,
5};
6
7use alloc::vec::Vec;
8
9use super::Key;
10use crate::{
11 segment::{End, Segment, Start},
12 RangeBounds, SegmentMap, SegmentSet,
13};
14
15impl<K, V> SegmentMap<K, V> {
18 pub fn len(&self) -> usize {
33 self.map.len()
34 }
35
36 pub fn is_empty(&self) -> bool {
51 self.map.is_empty()
52 }
53
54 pub fn into_vec(self) -> Vec<(Segment<K>, V)> {
56 self.into_iter().collect()
57 }
58
59 pub fn iter(&self) -> Iter<'_, K, V> {
76 Iter(self.map.iter())
77 }
78
79 pub fn iter_in<R>(&self, range: R) -> IterIn<'_, K, V>
82 where
83 R: RangeBounds<K>,
84 K: Clone + Ord,
85 {
86 IterIn {
87 iter: self.iter(),
88 range: Segment::from(&range),
89 }
90 }
91
92 pub fn iter_mut(&mut self) -> IterMut<'_, K, V> {
118 IterMut(self.map.iter_mut())
119 }
120
121 pub fn ranges(&self) -> Ranges<'_, K, V> {
141 Ranges(self.iter())
142 }
143
144 pub fn values(&self) -> Values<'_, K, V> {
161 Values(self.iter())
162 }
163
164 pub fn values_mut(&mut self) -> ValuesMut<'_, K, V> {
187 ValuesMut(self.iter_mut())
188 }
189
190 pub fn iter_subset<R>(&self, range: R) -> IterSubset<'_, K, V>
194 where
195 R: RangeBounds<K>,
196 K: Clone + Ord,
197 {
198 let range = Segment::new(range.start_bound(), range.end_bound()).cloned();
199 IterSubset(Some(match (&range.start, &range.end) {
200 (Start(Unbounded), End(Unbounded)) => IterSubsetInner::Full(self.iter()),
201 (Start(Unbounded), bounded_end) => IterSubsetInner::Partial {
202 before: None,
203 iter: self.map.range(..bounded_end.after().unwrap().cloned()),
204 range,
205 },
206 (bounded_start, End(Unbounded)) => IterSubsetInner::Partial {
207 before: Some(self.map.range(..bounded_start.clone())),
208 iter: self.map.range(bounded_start.clone()..),
209 range,
210 },
211 (bounded_start, bounded_end) => IterSubsetInner::Partial {
212 before: Some(self.map.range(..bounded_start.clone())),
213 iter: self
214 .map
215 .range(bounded_start.clone()..bounded_end.after().unwrap().cloned()),
216 range,
217 },
218 }))
219 }
220
221 pub fn subset<R>(&self, range: R) -> SegmentMap<K, &V>
223 where
224 R: RangeBounds<K>,
225 K: Clone + Ord,
226 {
227 SegmentMap {
228 map: self.iter_subset(range).map(|(r, v)| (Key(r), v)).collect(),
229 store: alloc::vec::Vec::with_capacity(self.store.len()),
230 }
231 }
232
233 pub fn iter_complement(&self) -> IterComplement<'_, K, V> {
234 IterComplement(Some(ComplementInner::Before {
235 first: self.ranges().next(),
236 iter: self.iter(),
237 }))
238 }
239
240 pub fn complement(&self) -> SegmentSet<&K>
241 where
242 K: Ord,
243 {
244 SegmentSet {
245 map: SegmentMap {
246 map: self.iter_complement().map(|r| (Key(r), ())).collect(),
247 store: alloc::vec::Vec::with_capacity(self.store.len()),
248 },
249 }
250 }
251
252 pub fn iter_gaps(&self) -> Gaps<'_, K, V> {
258 Gaps {
259 iter: self.iter(),
260 prev: None,
261 }
262 }
263
264 pub fn gaps(&self) -> SegmentSet<&K>
265 where
266 K: Ord,
267 {
268 SegmentSet {
269 map: SegmentMap {
270 map: self.iter_gaps().map(|r| (Key(r), ())).collect(),
271 store: alloc::vec::Vec::with_capacity(self.store.len()),
272 },
273 }
274 }
275
276 }
294
295impl<K, V> IntoIterator for SegmentMap<K, V> {
296 type Item = (Segment<K>, V);
297 type IntoIter = IntoIter<K, V>;
298 fn into_iter(self) -> Self::IntoIter {
299 IntoIter(self.map.into_iter())
300 }
301}
302impl<'a, K, V> IntoIterator for &'a SegmentMap<K, V> {
303 type Item = (&'a Segment<K>, &'a V);
304 type IntoIter = Iter<'a, K, V>;
305 fn into_iter(self) -> Iter<'a, K, V> {
306 self.iter()
307 }
308}
309impl<'a, K, V> IntoIterator for &'a mut SegmentMap<K, V> {
310 type Item = (&'a Segment<K>, &'a mut V);
311 type IntoIter = IterMut<'a, K, V>;
312 fn into_iter(self) -> IterMut<'a, K, V> {
313 self.iter_mut()
314 }
315}
316
317impl<R: core::ops::RangeBounds<K>, K: Clone + Ord, V: Clone + Eq> FromIterator<(R, V)>
318 for SegmentMap<K, V>
319{
320 fn from_iter<T: IntoIterator<Item = (R, V)>>(iter: T) -> Self {
321 let mut map = Self::new();
322 map.extend(iter);
323 map
324 }
325}
326
327impl<R, K, V> Extend<(R, V)> for SegmentMap<K, V>
328where
329 R: core::ops::RangeBounds<K>,
330 K: Clone + Ord,
331 V: Clone + Eq,
332{
333 #[inline]
334 fn extend<T: IntoIterator<Item = (R, V)>>(&mut self, iter: T) {
335 iter.into_iter().for_each(move |(k, v)| {
336 self.set(k, v);
337 });
338 }
339}
340
341pub struct Iter<'a, K, V>(alloc::collections::btree_map::Iter<'a, Key<K>, V>);
348
349impl<K: Debug, V: Debug> Debug for Iter<'_, K, V> {
350 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
351 f.debug_list().entries(self.clone()).finish()
352 }
353}
354
355impl<'a, K: 'a, V: 'a> Iterator for Iter<'a, K, V> {
356 type Item = (&'a Segment<K>, &'a V);
357 fn next(&mut self) -> Option<(&'a Segment<K>, &'a V)> {
358 self.0.next().map(|(wrapper, v)| (&wrapper.0, v))
359 }
360 fn size_hint(&self) -> (usize, Option<usize>) {
361 self.0.size_hint()
362 }
363 fn last(mut self) -> Option<(&'a Segment<K>, &'a V)> {
364 self.next_back()
365 }
366 fn min(mut self) -> Option<(&'a Segment<K>, &'a V)> {
367 self.next()
368 }
369 fn max(mut self) -> Option<(&'a Segment<K>, &'a V)> {
370 self.next_back()
371 }
372}
373impl<K, V> FusedIterator for Iter<'_, K, V> {}
374
375impl<'a, K: 'a, V: 'a> DoubleEndedIterator for Iter<'a, K, V> {
376 fn next_back(&mut self) -> Option<(&'a Segment<K>, &'a V)> {
377 self.0.next_back().map(|(wrapper, v)| (&wrapper.0, v))
378 }
379}
380impl<K, V> ExactSizeIterator for Iter<'_, K, V> {
381 fn len(&self) -> usize {
382 self.0.len()
383 }
384}
385impl<K, V> Clone for Iter<'_, K, V> {
386 fn clone(&self) -> Self {
387 Self(self.0.clone())
388 }
389}
390
391pub struct IterIn<'a, K, V> {
398 iter: Iter<'a, K, V>,
399 range: Segment<K>,
400}
401
402impl<K: Clone + Ord + Debug, V: Debug> Debug for IterIn<'_, K, V> {
403 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
404 f.debug_list().entries(self.clone()).finish()
405 }
406}
407
408impl<'a, K: 'a + Ord, V: 'a> Iterator for IterIn<'a, K, V> {
409 type Item = (&'a Segment<K>, &'a V);
410 fn next(&mut self) -> Option<(&'a Segment<K>, &'a V)> {
411 loop {
412 let next = self.iter.next()?;
413 if next.0.overlaps(&self.range) {
414 return Some(next);
415 }
416 }
417 }
418 fn last(mut self) -> Option<(&'a Segment<K>, &'a V)> {
419 self.next_back()
420 }
421 fn min(mut self) -> Option<(&'a Segment<K>, &'a V)> {
422 self.next()
423 }
424 fn max(mut self) -> Option<(&'a Segment<K>, &'a V)> {
425 self.next_back()
426 }
427}
428impl<K: Ord, V> FusedIterator for IterIn<'_, K, V> {}
429
430impl<'a, K: 'a + Ord, V: 'a> DoubleEndedIterator for IterIn<'a, K, V> {
431 fn next_back(&mut self) -> Option<(&'a Segment<K>, &'a V)> {
432 loop {
433 let next = self.iter.next_back()?;
434 if next.0.overlaps(&self.range) {
435 return Some(next);
436 }
437 }
438 }
439}
440impl<K: Ord, V> ExactSizeIterator for IterIn<'_, K, V> {
441 fn len(&self) -> usize {
442 self.iter.len()
443 }
444}
445impl<K: Clone, V> Clone for IterIn<'_, K, V> {
446 fn clone(&self) -> Self {
447 Self {
448 iter: self.iter.clone(),
449 range: self.range.clone(),
450 }
451 }
452}
453
454pub struct IterMut<'a, K: 'a, V: 'a>(alloc::collections::btree_map::IterMut<'a, Key<K>, V>);
461
462impl<K: Debug, V: Debug> Debug for IterMut<'_, K, V> {
463 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
464 self.0.fmt(f)
465 }
466}
467
468impl<'a, K: 'a, V: 'a> Iterator for IterMut<'a, K, V> {
469 type Item = (&'a Segment<K>, &'a mut V);
470
471 fn next(&mut self) -> Option<(&'a Segment<K>, &'a mut V)> {
472 self.0.next().map(|(wrapper, v)| (&wrapper.0, v))
473 }
474
475 fn size_hint(&self) -> (usize, Option<usize>) {
476 self.0.size_hint()
477 }
478
479 fn last(mut self) -> Option<(&'a Segment<K>, &'a mut V)> {
480 self.next_back()
481 }
482
483 fn min(mut self) -> Option<(&'a Segment<K>, &'a mut V)> {
484 self.next()
485 }
486
487 fn max(mut self) -> Option<(&'a Segment<K>, &'a mut V)> {
488 self.next_back()
489 }
490}
491
492impl<'a, K: 'a, V: 'a> DoubleEndedIterator for IterMut<'a, K, V> {
493 fn next_back(&mut self) -> Option<(&'a Segment<K>, &'a mut V)> {
494 self.0.next_back().map(|(wrapper, v)| (&wrapper.0, v))
495 }
496}
497
498impl<K, V> ExactSizeIterator for IterMut<'_, K, V> {
499 fn len(&self) -> usize {
500 self.0.len()
501 }
502}
503
504impl<K, V> FusedIterator for IterMut<'_, K, V> {}
505
506pub struct IntoIter<K, V>(alloc::collections::btree_map::IntoIter<Key<K>, V>);
521impl<K: Debug, V: Debug> Debug for IntoIter<K, V> {
522 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
523 self.0.fmt(f)
524 }
525}
526impl<K, V> Iterator for IntoIter<K, V> {
527 type Item = (Segment<K>, V);
528 fn next(&mut self) -> Option<(Segment<K>, V)> {
529 self.0.next().map(|(wrapper, v)| (wrapper.0, v))
530 }
531 fn size_hint(&self) -> (usize, Option<usize>) {
532 self.0.size_hint()
533 }
534}
535impl<K, V> DoubleEndedIterator for IntoIter<K, V> {
536 fn next_back(&mut self) -> Option<(Segment<K>, V)> {
537 self.0.next_back().map(|(wrapper, v)| (wrapper.0, v))
538 }
539}
540impl<K, V> ExactSizeIterator for IntoIter<K, V> {
541 fn len(&self) -> usize {
542 self.0.len()
543 }
544}
545impl<K, V> FusedIterator for IntoIter<K, V> {}
546pub struct Ranges<'a, K: 'a, V: 'a>(Iter<'a, K, V>);
560impl<K: Debug, V> Debug for Ranges<'_, K, V> {
561 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
562 f.debug_list().entries(self.clone()).finish()
563 }
564}
565impl<'a, K, V> Iterator for Ranges<'a, K, V> {
566 type Item = &'a Segment<K>;
567 fn next(&mut self) -> Option<&'a Segment<K>> {
568 self.0.next().map(|(k, _)| k)
569 }
570 fn size_hint(&self) -> (usize, Option<usize>) {
571 self.0.size_hint()
572 }
573 fn last(mut self) -> Option<&'a Segment<K>> {
574 self.next_back()
575 }
576 fn min(mut self) -> Option<&'a Segment<K>> {
577 self.next()
578 }
579 fn max(mut self) -> Option<&'a Segment<K>> {
580 self.next_back()
581 }
582}
583impl<'a, K, V> DoubleEndedIterator for Ranges<'a, K, V> {
584 fn next_back(&mut self) -> Option<&'a Segment<K>> {
585 self.0.next_back().map(|(k, _)| k)
586 }
587}
588impl<K, V> ExactSizeIterator for Ranges<'_, K, V> {
589 fn len(&self) -> usize {
590 self.0.len()
591 }
592}
593impl<K, V> FusedIterator for Ranges<'_, K, V> {}
594
595impl<K, V> Clone for Ranges<'_, K, V> {
596 fn clone(&self) -> Self {
597 Ranges(self.0.clone())
598 }
599}
600
601#[derive(Clone)]
608pub struct Values<'a, K: 'a, V: 'a>(Iter<'a, K, V>);
609
610impl<'a, K, V> Iterator for Values<'a, K, V> {
618 type Item = &'a V;
619 fn next(&mut self) -> Option<&'a V> {
620 self.0.next().map(|(_, v)| v)
621 }
622 fn size_hint(&self) -> (usize, Option<usize>) {
623 self.0.size_hint()
624 }
625 fn last(mut self) -> Option<&'a V> {
626 self.next_back()
627 }
628}
629impl<'a, K, V> DoubleEndedIterator for Values<'a, K, V> {
630 fn next_back(&mut self) -> Option<&'a V> {
631 self.0.next_back().map(|(_, v)| v)
632 }
633}
634impl<K, V> ExactSizeIterator for Values<'_, K, V> {
635 fn len(&self) -> usize {
636 self.0.len()
637 }
638}
639impl<K, V> FusedIterator for Values<'_, K, V> {}
640
641pub struct ValuesMut<'a, K: 'a, V: 'a>(IterMut<'a, K, V>);
648
649impl<'a, K, V> Iterator for ValuesMut<'a, K, V> {
659 type Item = &'a mut V;
660 fn next(&mut self) -> Option<&'a mut V> {
661 self.0.next().map(|(_, v)| v)
662 }
663 fn size_hint(&self) -> (usize, Option<usize>) {
664 self.0.size_hint()
665 }
666 fn last(mut self) -> Option<&'a mut V> {
667 self.next_back()
668 }
669}
670impl<'a, K, V> DoubleEndedIterator for ValuesMut<'a, K, V> {
671 fn next_back(&mut self) -> Option<&'a mut V> {
672 self.0.next_back().map(|(_, v)| v)
673 }
674}
675impl<K, V> ExactSizeIterator for ValuesMut<'_, K, V> {
676 fn len(&self) -> usize {
677 self.0.len()
678 }
679}
680impl<K, V> FusedIterator for ValuesMut<'_, K, V> {}
681
682pub struct IterSubset<'a, K, V>(Option<IterSubsetInner<'a, K, V>>);
683
684enum IterSubsetInner<'a, K, V> {
685 Full(Iter<'a, K, V>),
686
687 Partial {
688 before: Option<alloc::collections::btree_map::Range<'a, Key<K>, V>>,
689 iter: alloc::collections::btree_map::Range<'a, Key<K>, V>,
690 range: Segment<K>,
691 },
692}
693
694impl<'a, K: Clone + Ord, V> Iterator for IterSubset<'a, K, V> {
695 type Item = (Segment<K>, &'a V);
696 fn next(&mut self) -> Option<Self::Item> {
697 match self.0.take()? {
698 IterSubsetInner::Full(mut iter) => {
699 let next = iter.next().map(|(r, v)| (r.clone(), v));
700 if next.is_some() {
701 self.0.insert(IterSubsetInner::Full(iter));
702 }
703 next
704 }
705 IterSubsetInner::Partial {
706 mut before,
707 mut iter,
708 range,
709 } => {
710 if let Some((Key(r), v)) = before.take().map(|mut x| x.next_back()).flatten() {
714 let mut r = r.clone();
715
716 if r.end.cmp_start(&range.start).is_gt() {
719 if r.start < range.start {
720 r.start = range.start.clone();
721 };
722
723 self.0.insert(IterSubsetInner::Partial {
724 before: None,
725 iter,
726 range,
727 });
728 return Some((r, v));
729 }
730 }
731
732 let (Key(r), v) = iter.next()?;
735 let mut r = r.clone();
736
737 if r.start.as_ref() > range.end.after().unwrap() {
738 None
740 } else {
741 if r.end > range.end {
742 r.end = range.end;
744 } else {
745 self.0.insert(IterSubsetInner::Partial {
747 before: None,
748 iter,
749 range,
750 });
751 }
752
753 Some((r, v))
754 }
755 }
756 }
757 }
758}
759
760pub struct Gaps<'a, K, V> {
761 iter: Iter<'a, K, V>,
762 prev: Option<Segment<&'a K>>,
763}
764
765impl<'a, K, V> Iterator for Gaps<'a, K, V>
766where
767 K: Ord,
768{
769 type Item = Segment<&'a K>;
770 fn next(&mut self) -> Option<Self::Item> {
771 let next = self.iter.next()?.0.as_ref();
772
773 if let Some(prev) = self.prev.take() {
774 let start = prev.bound_after()?.cloned(); let end = next
778 .bound_before()
779 .expect("Unbounded internal range in SegmentMap")
780 .cloned();
781 self.prev.insert(next);
782 Some(Segment { start, end })
783 } else {
784 let start = next.borrow_bound_after()?;
789
790 let next = self.iter.next()?.0.as_ref();
792
793 let end = next.borrow_bound_before().unwrap();
797
798 self.prev = Some(next);
800 Some(Segment { start, end })
801 }
802 }
803}
804
805impl<K: Ord, V> FusedIterator for Gaps<'_, K, V> {}
806
807pub struct IterComplement<'a, K, V>(Option<ComplementInner<'a, K, V>>);
808enum ComplementInner<'a, K, V> {
809 Before {
810 first: Option<&'a Segment<K>>,
811 iter: Iter<'a, K, V>,
812 },
813 Gaps(Gaps<'a, K, V>), }
815
816impl<'a, K, V> Iterator for IterComplement<'a, K, V>
817where
818 K: Ord,
819{
820 type Item = Segment<&'a K>;
821 fn next(&mut self) -> Option<Self::Item> {
822 match self.0.take()? {
823 ComplementInner::Before { first, iter } => {
824 if let Some(first) = first {
825 let mut gaps = Gaps { iter, prev: None };
826 let out = first
827 .bound_before()
828 .map(|end| Segment {
829 start: Start(Unbounded),
830 end,
831 })
832 .or_else(|| gaps.next());
833
834 self.0.insert(ComplementInner::Gaps(gaps));
835 out
836 } else {
837 None
838 }
839 }
840
841 ComplementInner::Gaps(mut gaps) => {
843 if let Some(next) = gaps.next() {
844 self.0.insert(ComplementInner::Gaps(gaps));
846 Some(next)
847 } else {
848 gaps.prev
851 .map(|p| {
852 p.borrow_bound_after().map(|start| Segment {
853 start,
854 end: End(Unbounded),
855 })
856 })
857 .flatten()
858 }
859 }
860 }
861 }
862}
863
864