1use super::range_wrapper::RangeStartWrapper;
2use crate::range_wrapper::RangeEndWrapper;
3use crate::std_ext::*;
4use alloc::collections::BTreeMap;
5use core::borrow::Borrow;
6use core::cmp::Ordering;
7use core::fmt::{self, Debug};
8use core::hash::Hash;
9use core::iter::{DoubleEndedIterator, FromIterator};
10use core::ops::{Bound, Range};
11use core::prelude::v1::*;
12
13#[cfg(feature = "serde1")]
14use core::marker::PhantomData;
15#[cfg(feature = "serde1")]
16use serde::{
17 de::{Deserialize, Deserializer, SeqAccess, Visitor},
18 ser::{Serialize, Serializer},
19};
20
21#[derive(Clone, Eq)]
27pub struct RangeMap<K, V> {
28 pub(crate) btm: BTreeMap<RangeStartWrapper<K>, V>,
31}
32
33impl<K, V> Default for RangeMap<K, V> {
34 fn default() -> Self {
35 Self {
36 btm: BTreeMap::default(),
37 }
38 }
39}
40
41impl<K, V> Hash for RangeMap<K, V>
42where
43 K: Hash,
44 V: Hash,
45{
46 fn hash<H: core::hash::Hasher>(&self, state: &mut H) {
47 state.write_usize(self.btm.len());
48 for elt in self.iter() {
49 elt.hash(state);
50 }
51 }
52}
53
54impl<K, V> PartialEq for RangeMap<K, V>
55where
56 K: PartialEq,
57 V: PartialEq,
58{
59 fn eq(&self, other: &RangeMap<K, V>) -> bool {
60 self.iter().eq(other.iter())
61 }
62}
63
64impl<K, V> PartialOrd for RangeMap<K, V>
65where
66 K: PartialOrd,
67 V: PartialOrd,
68{
69 #[inline]
70 fn partial_cmp(&self, other: &RangeMap<K, V>) -> Option<Ordering> {
71 self.expanded_iter().partial_cmp(other.expanded_iter())
72 }
73}
74
75impl<K, V> Ord for RangeMap<K, V>
76where
77 K: Ord,
78 V: Ord,
79{
80 #[inline]
81 fn cmp(&self, other: &RangeMap<K, V>) -> Ordering {
82 self.expanded_iter().cmp(other.expanded_iter())
83 }
84}
85
86#[cfg(feature = "quickcheck")]
87impl<K, V> quickcheck::Arbitrary for RangeMap<K, V>
88where
89 K: quickcheck::Arbitrary + Ord,
90 V: quickcheck::Arbitrary + PartialEq,
91{
92 fn arbitrary(g: &mut quickcheck::Gen) -> Self {
93 <alloc::vec::Vec<(Range<_>, _)>>::arbitrary(g)
95 .into_iter()
96 .filter(|(range, _)| !range.is_empty())
97 .collect()
98 }
99}
100
101impl<K, V> RangeMap<K, V> {
102 #[cfg(feature = "const_fn")]
104 pub const fn new() -> Self {
105 RangeMap {
106 btm: BTreeMap::new(),
107 }
108 }
109
110 #[cfg(not(feature = "const_fn"))]
112 pub fn new() -> Self {
113 RangeMap {
114 btm: BTreeMap::new(),
115 }
116 }
117
118 pub fn iter(&self) -> Iter<'_, K, V> {
123 Iter {
124 inner: self.btm.iter(),
125 }
126 }
127
128 pub fn clear(&mut self) {
130 self.btm.clear();
131 }
132
133 pub fn len(&self) -> usize {
135 self.btm.len()
136 }
137
138 pub fn is_empty(&self) -> bool {
140 self.btm.is_empty()
141 }
142
143 fn expanded_iter(&self) -> impl Iterator<Item = (&K, &K, &V)> {
147 self.btm.iter().map(|(k, v)| (&k.start, &k.end, v))
148 }
149}
150
151impl<K, V> RangeMap<K, V>
152where
153 K: Ord + Clone,
154{
155 pub fn get(&self, key: &K) -> Option<&V> {
158 self.get_key_value(key).map(|(_range, value)| value)
159 }
160
161 pub fn get_key_value(&self, key: &K) -> Option<(&Range<K>, &V)> {
164 let key_as_start = RangeStartWrapper::new(key.clone()..key.clone());
167 self.btm
168 .range((Bound::Unbounded, Bound::Included(key_as_start)))
169 .next_back()
170 .filter(|(start_wrapper, _value)| {
171 start_wrapper.end_wrapper.range.contains(key)
174 })
175 .map(|(start_wrapper, value)| (&start_wrapper.end_wrapper.range, value))
176 }
177
178 pub fn contains_key(&self, key: &K) -> bool {
180 self.get(key).is_some()
181 }
182
183 pub fn gaps<'a>(&'a self, outer_range: &'a Range<K>) -> Gaps<'a, K, V> {
193 let overlap_iter = self.overlapping(outer_range);
194 Gaps {
195 candidate_start: &outer_range.start,
196 query_end: &outer_range.end,
197 btm_range_iter: overlap_iter.btm_range_iter,
198 }
199 }
200
201 pub fn overlapping<R: Borrow<Range<K>>>(&'_ self, range: R) -> Overlapping<'_, K, V, R> {
204 let start_sliver =
207 RangeEndWrapper::new(range.borrow().start.clone()..range.borrow().start.clone());
208 let btm_range_iter = self
209 .btm
210 .range::<RangeEndWrapper<K>, (Bound<&RangeEndWrapper<K>>, Bound<_>)>((
211 Bound::Excluded(&start_sliver),
212 Bound::Unbounded,
213 ));
214 Overlapping {
215 query_range: range,
216 btm_range_iter,
217 }
218 }
219
220 pub fn overlaps(&self, range: &Range<K>) -> bool {
223 self.overlapping(range).next().is_some()
224 }
225
226 pub fn first_range_value(&self) -> Option<(&Range<K>, &V)> {
229 self.btm
230 .first_key_value()
231 .map(|(range, value)| (&range.end_wrapper.range, value))
232 }
233
234 pub fn last_range_value(&self) -> Option<(&Range<K>, &V)> {
237 self.btm
238 .last_key_value()
239 .map(|(range, value)| (&range.end_wrapper.range, value))
240 }
241}
242
243impl<K, V> RangeMap<K, V>
244where
245 K: Ord + Clone,
246 V: PartialEq + Clone,
247{
248 pub fn insert(&mut self, range: Range<K>, value: V) {
262 assert!(range.start < range.end);
265
266 let mut new_start_wrapper: RangeStartWrapper<K> = RangeStartWrapper::new(range);
270 let new_value = value;
271
272 let mut candidates = self
279 .btm
280 .range::<RangeStartWrapper<K>, (Bound<&RangeStartWrapper<K>>, Bound<&RangeStartWrapper<K>>)>((
281 Bound::Unbounded,
282 Bound::Included(&new_start_wrapper),
283 ))
284 .rev()
285 .take(2)
286 .filter(|(stored_start_wrapper, _stored_value)| {
287 stored_start_wrapper
292 .end_wrapper
293 .range
294 .touches(&new_start_wrapper.end_wrapper.range)
295 });
296 if let Some(mut candidate) = candidates.next() {
297 if let Some(another_candidate) = candidates.next() {
299 candidate = another_candidate;
300 }
301 let (stored_start_wrapper, stored_value) = (candidate.0.clone(), candidate.1.clone());
302 self.adjust_touching_ranges_for_insert(
303 stored_start_wrapper,
304 stored_value,
305 &mut new_start_wrapper.end_wrapper.range,
306 &new_value,
307 );
308 }
309
310 let new_range_end_as_start = RangeStartWrapper::new(
323 new_start_wrapper.end_wrapper.range.end.clone()
324 ..new_start_wrapper.end_wrapper.range.end.clone(),
325 );
326 while let Some((stored_start_wrapper, stored_value)) = self
327 .btm
328 .range::<RangeStartWrapper<K>, (Bound<&RangeStartWrapper<K>>, Bound<&RangeStartWrapper<K>>)>((
329 Bound::Included(&new_start_wrapper),
330 Bound::Included(&new_range_end_as_start),
331 ))
332 .next()
333 {
334 #[allow(clippy::suspicious_operation_groupings)]
338 if stored_start_wrapper.end_wrapper.range.start
339 == new_start_wrapper.end_wrapper.range.end
340 && *stored_value != new_value
341 {
342 break;
348 }
349
350 let stored_start_wrapper = stored_start_wrapper.clone();
351 let stored_value = stored_value.clone();
352
353 self.adjust_touching_ranges_for_insert(
354 stored_start_wrapper,
355 stored_value,
356 &mut new_start_wrapper.end_wrapper.range,
357 &new_value,
358 );
359 }
360
361 self.btm.insert(new_start_wrapper, new_value);
363 }
364
365 pub fn remove(&mut self, range: Range<K>) {
376 assert!(range.start < range.end);
379
380 let start_wrapper: RangeStartWrapper<K> = RangeStartWrapper::new(range);
381 let range = &start_wrapper.end_wrapper.range;
382
383 if let Some((stored_start_wrapper, stored_value)) = self
389 .btm
390 .range::<RangeStartWrapper<K>, (Bound<&RangeStartWrapper<K>>, Bound<&RangeStartWrapper<K>>)>((Bound::Unbounded, Bound::Included(&start_wrapper)))
391 .next_back()
392 .filter(|(stored_start_wrapper, _stored_value)| {
393 stored_start_wrapper
396 .end_wrapper
397 .range
398 .overlaps(range)
399 })
400 .map(|(stored_start_wrapper, stored_value)| {
401 (stored_start_wrapper.clone(), stored_value.clone())
402 })
403 {
404 self.adjust_overlapping_ranges_for_remove(
405 stored_start_wrapper,
406 stored_value,
407 range,
408 );
409 }
410
411 let new_range_end_as_start = RangeStartWrapper::new(range.end.clone()..range.end.clone());
420 while let Some((stored_start_wrapper, stored_value)) = self
421 .btm
422 .range::<RangeStartWrapper<K>, (Bound<&RangeStartWrapper<K>>, Bound<&RangeStartWrapper<K>>)>((
423 Bound::Excluded(&start_wrapper),
424 Bound::Excluded(&new_range_end_as_start),
425 ))
426 .next()
427 .map(|(stored_start_wrapper, stored_value)| {
428 (stored_start_wrapper.clone(), stored_value.clone())
429 })
430 {
431 self.adjust_overlapping_ranges_for_remove(
432 stored_start_wrapper,
433 stored_value,
434 range,
435 );
436 }
437 }
438
439 fn adjust_touching_ranges_for_insert(
440 &mut self,
441 stored_start_wrapper: RangeStartWrapper<K>,
442 stored_value: V,
443 new_range: &mut Range<K>,
444 new_value: &V,
445 ) {
446 use core::cmp::{max, min};
447
448 if stored_value == *new_value {
449 new_range.start = min(&new_range.start, &stored_start_wrapper.start).clone();
456 new_range.end = max(&new_range.end, &stored_start_wrapper.end).clone();
457 self.btm.remove(&stored_start_wrapper);
458 } else {
459 if new_range.overlaps(&stored_start_wrapper.range) {
461 self.btm.remove(&stored_start_wrapper);
465 if stored_start_wrapper.start < new_range.start {
466 self.btm.insert(
468 RangeStartWrapper::new(
469 stored_start_wrapper.end_wrapper.range.start..new_range.start.clone(),
470 ),
471 stored_value.clone(),
472 );
473 }
474 if stored_start_wrapper.end_wrapper.range.end > new_range.end {
475 self.btm.insert(
477 RangeStartWrapper::new(
478 new_range.end.clone()..stored_start_wrapper.end_wrapper.range.end,
479 ),
480 stored_value,
481 );
482 }
483 } else {
484 }
487 }
488 }
489
490 fn adjust_overlapping_ranges_for_remove(
491 &mut self,
492 stored: RangeStartWrapper<K>,
493 stored_value: V,
494 range_to_remove: &Range<K>,
495 ) {
496 self.btm.remove(&stored);
499 let stored_range = stored.end_wrapper;
500 if stored_range.start < range_to_remove.start {
501 self.btm.insert(
503 RangeStartWrapper::new(stored_range.range.start..range_to_remove.start.clone()),
504 stored_value.clone(),
505 );
506 }
507 if stored_range.range.end > range_to_remove.end {
508 self.btm.insert(
510 RangeStartWrapper::new(range_to_remove.end.clone()..stored_range.range.end),
511 stored_value,
512 );
513 }
514 }
515}
516
517pub struct Iter<'a, K, V> {
526 inner: alloc::collections::btree_map::Iter<'a, RangeStartWrapper<K>, V>,
527}
528
529impl<'a, K, V> Iterator for Iter<'a, K, V>
530where
531 K: 'a,
532 V: 'a,
533{
534 type Item = (&'a Range<K>, &'a V);
535
536 fn next(&mut self) -> Option<Self::Item> {
537 self.inner
538 .next()
539 .map(|(by_start, v)| (&by_start.end_wrapper.range, v))
540 }
541
542 fn size_hint(&self) -> (usize, Option<usize>) {
543 self.inner.size_hint()
544 }
545}
546
547impl<'a, K, V> DoubleEndedIterator for Iter<'a, K, V>
548where
549 K: 'a,
550 V: 'a,
551{
552 fn next_back(&mut self) -> Option<Self::Item> {
553 self.inner
554 .next_back()
555 .map(|(range, value)| (&range.end_wrapper.range, value))
556 }
557}
558
559pub struct IntoIter<K, V> {
568 inner: alloc::collections::btree_map::IntoIter<RangeStartWrapper<K>, V>,
569}
570
571impl<K, V> IntoIterator for RangeMap<K, V> {
572 type Item = (Range<K>, V);
573 type IntoIter = IntoIter<K, V>;
574 fn into_iter(self) -> Self::IntoIter {
575 IntoIter {
576 inner: self.btm.into_iter(),
577 }
578 }
579}
580
581impl<K, V> Iterator for IntoIter<K, V> {
582 type Item = (Range<K>, V);
583 fn next(&mut self) -> Option<(Range<K>, V)> {
584 self.inner
585 .next()
586 .map(|(by_start, v)| (by_start.end_wrapper.range, v))
587 }
588 fn size_hint(&self) -> (usize, Option<usize>) {
589 self.inner.size_hint()
590 }
591}
592
593impl<K, V> DoubleEndedIterator for IntoIter<K, V> {
594 fn next_back(&mut self) -> Option<Self::Item> {
595 self.inner
596 .next_back()
597 .map(|(range, value)| (range.end_wrapper.range, value))
598 }
599}
600
601impl<K: Debug, V: Debug> Debug for RangeMap<K, V> {
605 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
606 f.debug_map().entries(self.iter()).finish()
607 }
608}
609
610impl<K, V> FromIterator<(Range<K>, V)> for RangeMap<K, V>
611where
612 K: Ord + Clone,
613 V: PartialEq + Clone,
614{
615 fn from_iter<T: IntoIterator<Item = (Range<K>, V)>>(iter: T) -> Self {
616 let mut range_map = RangeMap::new();
617 range_map.extend(iter);
618 range_map
619 }
620}
621
622impl<K, V> Extend<(Range<K>, V)> for RangeMap<K, V>
623where
624 K: Ord + Clone,
625 V: PartialEq + Clone,
626{
627 fn extend<T: IntoIterator<Item = (Range<K>, V)>>(&mut self, iter: T) {
628 iter.into_iter().for_each(move |(k, v)| {
629 self.insert(k, v);
630 })
631 }
632}
633
634#[cfg(feature = "serde1")]
635impl<K, V> Serialize for RangeMap<K, V>
636where
637 K: Serialize,
638 V: Serialize,
639{
640 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
641 where
642 S: Serializer,
643 {
644 use serde::ser::SerializeSeq;
645 let mut seq = serializer.serialize_seq(Some(self.btm.len()))?;
646 for (k, v) in self.iter() {
647 seq.serialize_element(&((&k.start, &k.end), &v))?;
648 }
649 seq.end()
650 }
651}
652
653#[cfg(feature = "serde1")]
654impl<'de, K, V> Deserialize<'de> for RangeMap<K, V>
655where
656 K: Ord + Clone + Deserialize<'de>,
657 V: PartialEq + Clone + Deserialize<'de>,
658{
659 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
660 where
661 D: Deserializer<'de>,
662 {
663 deserializer.deserialize_seq(RangeMapVisitor::new())
664 }
665}
666
667#[cfg(feature = "serde1")]
668struct RangeMapVisitor<K, V> {
669 marker: PhantomData<fn() -> RangeMap<K, V>>,
670}
671
672#[cfg(feature = "serde1")]
673impl<K, V> RangeMapVisitor<K, V> {
674 fn new() -> Self {
675 RangeMapVisitor {
676 marker: PhantomData,
677 }
678 }
679}
680
681#[cfg(feature = "serde1")]
682impl<'de, K, V> Visitor<'de> for RangeMapVisitor<K, V>
683where
684 K: Ord + Clone + Deserialize<'de>,
685 V: PartialEq + Clone + Deserialize<'de>,
686{
687 type Value = RangeMap<K, V>;
688
689 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
690 formatter.write_str("RangeMap")
691 }
692
693 fn visit_seq<A>(self, mut access: A) -> Result<Self::Value, A::Error>
694 where
695 A: SeqAccess<'de>,
696 {
697 let mut range_map = RangeMap::new();
698 while let Some(((start, end), value)) = access.next_element()? {
699 range_map.insert(start..end, value);
700 }
701 Ok(range_map)
702 }
703}
704
705pub struct Gaps<'a, K, V> {
714 candidate_start: &'a K,
715 query_end: &'a K,
716 btm_range_iter: alloc::collections::btree_map::Range<'a, RangeStartWrapper<K>, V>,
717}
718
719impl<'a, K, V> core::iter::FusedIterator for Gaps<'a, K, V> where K: Ord + Clone {}
721
722impl<'a, K, V> Iterator for Gaps<'a, K, V>
723where
724 K: Ord + Clone,
725{
726 type Item = Range<K>;
727
728 fn next(&mut self) -> Option<Self::Item> {
729 for overlap in self.btm_range_iter.by_ref() {
731 let overlap = &overlap.0.range;
732
733 if *self.query_end <= overlap.start {
736 break;
737 }
738
739 let original_start = core::mem::replace(&mut self.candidate_start, &overlap.end);
740
741 if *original_start < overlap.start {
743 let gap = original_start.clone()..overlap.start.clone();
744 return Some(gap);
745 }
746
747 self.candidate_start = &overlap.end;
750 }
751
752 if *self.candidate_start < *self.query_end {
755 let gap = self.candidate_start.clone()..self.query_end.clone();
756 self.candidate_start = self.query_end;
757 return Some(gap);
758 }
759
760 None
761 }
762}
763
764pub struct Overlapping<'a, K, V, R: Borrow<Range<K>> = &'a Range<K>> {
774 query_range: R,
775 btm_range_iter: alloc::collections::btree_map::Range<'a, RangeStartWrapper<K>, V>,
776}
777
778impl<'a, K, V, R: Borrow<Range<K>>> core::iter::FusedIterator for Overlapping<'a, K, V, R> where
780 K: Ord
781{
782}
783
784impl<'a, K, V, R: Borrow<Range<K>>> Iterator for Overlapping<'a, K, V, R>
785where
786 K: Ord,
787{
788 type Item = (&'a Range<K>, &'a V);
789
790 fn next(&mut self) -> Option<Self::Item> {
791 if let Some((k, v)) = self.btm_range_iter.next() {
792 if k.start < self.query_range.borrow().end {
793 Some((&k.range, v))
794 } else {
795 None
800 }
801 } else {
802 None
803 }
804 }
805}
806
807impl<'a, K, V, R: Borrow<Range<K>>> DoubleEndedIterator for Overlapping<'a, K, V, R>
808where
809 K: Ord,
810{
811 fn next_back(&mut self) -> Option<Self::Item> {
812 while let Some((k, v)) = self.btm_range_iter.next_back() {
813 if k.start < self.query_range.borrow().end {
814 return Some((&k.range, v));
815 }
816 }
817
818 None
819 }
820}
821
822impl<K: Ord + Clone, V: PartialEq + Clone, const N: usize> From<[(Range<K>, V); N]> for RangeMap<K, V> {
823 fn from(value: [(Range<K>, V); N]) -> Self {
824 let mut map = Self::new();
825 for (range, value) in IntoIterator::into_iter(value) {
826 map.insert(range, value);
827 }
828 map
829 }
830}
831
832#[macro_export]
845macro_rules! range_map {
846 ($($k:expr => $v:expr),* $(,)?) => {{
847 $crate::RangeMap::from([$(($k, $v)),*])
848 }};
849}
850
851#[cfg(test)]
852mod tests {
853 use super::*;
854 use alloc as std;
855 use alloc::{format, string::String, vec, vec::Vec};
856 use proptest::prelude::*;
857 use test_strategy::proptest;
858
859 impl<K, V> Arbitrary for RangeMap<K, V>
860 where
861 K: Ord + Clone + Debug + Arbitrary + 'static,
862 V: Clone + PartialEq + Arbitrary + 'static,
863 {
864 type Parameters = ();
865 type Strategy = BoxedStrategy<Self>;
866
867 fn arbitrary_with(_parameters: Self::Parameters) -> Self::Strategy {
868 any::<Vec<(Range<K>, V)>>()
869 .prop_map(|ranges| ranges.into_iter().collect::<RangeMap<K, V>>())
870 .boxed()
871 }
872 }
873
874 #[proptest]
875 fn test_first(set: RangeMap<u64, String>) {
876 assert_eq!(
877 set.first_range_value(),
878 set.iter().min_by_key(|(range, _)| range.start)
879 );
880 }
881
882 #[proptest]
883 #[allow(clippy::len_zero)]
884 fn test_len(mut map: RangeMap<u64, String>) {
885 assert_eq!(map.len(), map.iter().count());
886 assert_eq!(map.is_empty(), map.len() == 0);
887 map.clear();
888 assert_eq!(map.len(), 0);
889 assert!(map.is_empty());
890 assert_eq!(map.iter().count(), 0);
891 }
892
893 #[proptest]
894 fn test_last(set: RangeMap<u64, String>) {
895 assert_eq!(
896 set.last_range_value(),
897 set.iter().max_by_key(|(range, _)| range.end)
898 );
899 }
900
901 #[proptest]
902 fn test_iter_reversible(set: RangeMap<u64, String>) {
903 let forward: Vec<_> = set.iter().collect();
904 let mut backward: Vec<_> = set.iter().rev().collect();
905 backward.reverse();
906 assert_eq!(forward, backward);
907 }
908
909 #[proptest]
910 fn test_into_iter_reversible(set: RangeMap<u64, String>) {
911 let forward: Vec<_> = set.clone().into_iter().collect();
912 let mut backward: Vec<_> = set.into_iter().rev().collect();
913 backward.reverse();
914 assert_eq!(forward, backward);
915 }
916
917 #[proptest]
918 fn test_overlapping_reversible(set: RangeMap<u64, String>, range: Range<u64>) {
919 let forward: Vec<_> = set.overlapping(&range).collect();
920 let mut backward: Vec<_> = set.overlapping(&range).rev().collect();
921 backward.reverse();
922 assert_eq!(forward, backward);
923 }
924
925 #[proptest]
926 fn test_arbitrary_map_u8(ranges: Vec<(Range<u8>, String)>) {
927 let ranges: Vec<_> = ranges
928 .into_iter()
929 .filter(|(range, _value)| range.start != range.end)
930 .collect();
931 let set = ranges
932 .iter()
933 .fold(RangeMap::new(), |mut set, (range, value)| {
934 set.insert(range.clone(), value.clone());
935 set
936 });
937
938 for value in 0..u8::MAX {
939 assert_eq!(
940 set.get(&value),
941 ranges
942 .iter()
943 .rev()
944 .find(|(range, _value)| range.contains(&value))
945 .map(|(_range, value)| value)
946 );
947 }
948 }
949
950 #[proptest]
951 #[allow(deprecated)]
952 fn test_hash(left: RangeMap<u64, u64>, right: RangeMap<u64, u64>) {
953 use core::hash::{Hash, Hasher, SipHasher};
954
955 let hash = |set: &RangeMap<_, _>| {
956 let mut hasher = SipHasher::new();
957 set.hash(&mut hasher);
958 hasher.finish()
959 };
960
961 if left == right {
962 assert!(
963 hash(&left) == hash(&right),
964 "if two values are equal, their hash must be equal"
965 );
966 }
967
968 if hash(&left) != hash(&right) {
970 assert!(
971 left != right,
972 "if two value's hashes are not equal, they must not be equal"
973 );
974 }
975 }
976
977 #[proptest]
978 fn test_ord(left: RangeMap<u64, u64>, right: RangeMap<u64, u64>) {
979 assert_eq!(
980 left == right,
981 left.cmp(&right).is_eq(),
982 "ordering and equality must match"
983 );
984 assert_eq!(
985 left.cmp(&right),
986 left.partial_cmp(&right).unwrap(),
987 "ordering is total for ordered parameters"
988 );
989 }
990
991 #[test]
992 fn test_from_array() {
993 let mut map = RangeMap::new();
994 map.insert(0..100, "hello");
995 map.insert(200..300, "world");
996 assert_eq!(
997 map,
998 RangeMap::from([(0..100, "hello"), (200..300, "world")])
999 );
1000 }
1001
1002 #[test]
1003 fn test_macro() {
1004 assert_eq!(range_map![], RangeMap::<i64, i64>::default());
1005 assert_eq!(
1006 range_map!(0..100 => "abc", 100..200 => "def", 200..300 => "ghi"),
1007 [(0..100, "abc"), (100..200, "def"), (200..300, "ghi")]
1008 .iter()
1009 .cloned()
1010 .collect(),
1011 );
1012 }
1013
1014 trait RangeMapExt<K, V> {
1015 fn to_vec(&self) -> Vec<(Range<K>, V)>;
1016 }
1017
1018 impl<K, V> RangeMapExt<K, V> for RangeMap<K, V>
1019 where
1020 K: Ord + Clone,
1021 V: PartialEq + Clone,
1022 {
1023 fn to_vec(&self) -> Vec<(Range<K>, V)> {
1024 self.iter().map(|(kr, v)| (kr.clone(), v.clone())).collect()
1025 }
1026 }
1027
1028 #[test]
1033 fn empty_map_is_empty() {
1034 let range_map: RangeMap<u32, bool> = RangeMap::new();
1035 assert_eq!(range_map.to_vec(), vec![]);
1036 }
1037
1038 #[test]
1039 fn insert_into_empty_map() {
1040 let mut range_map: RangeMap<u32, bool> = RangeMap::new();
1041 range_map.insert(0..50, false);
1042 assert_eq!(range_map.to_vec(), vec![(0..50, false)]);
1043 }
1044
1045 #[test]
1046 fn new_same_value_immediately_following_stored() {
1047 let mut range_map: RangeMap<u32, bool> = RangeMap::new();
1048 range_map.insert(1..3, false);
1051 range_map.insert(3..5, false);
1054 assert_eq!(range_map.to_vec(), vec![(1..5, false)]);
1057 }
1058
1059 #[test]
1060 fn new_different_value_immediately_following_stored() {
1061 let mut range_map: RangeMap<u32, bool> = RangeMap::new();
1062 range_map.insert(1..3, false);
1065 range_map.insert(3..5, true);
1068 assert_eq!(range_map.to_vec(), vec![(1..3, false), (3..5, true)]);
1072 }
1073
1074 #[test]
1075 fn new_same_value_overlapping_end_of_stored() {
1076 let mut range_map: RangeMap<u32, bool> = RangeMap::new();
1077 range_map.insert(1..4, false);
1080 range_map.insert(3..5, false);
1083 assert_eq!(range_map.to_vec(), vec![(1..5, false)]);
1086 }
1087
1088 #[test]
1089 fn new_different_value_overlapping_end_of_stored() {
1090 let mut range_map: RangeMap<u32, bool> = RangeMap::new();
1091 range_map.insert(1..4, false);
1094 range_map.insert(3..5, true);
1097 assert_eq!(range_map.to_vec(), vec![(1..3, false), (3..5, true)]);
1101 }
1102
1103 #[test]
1104 fn new_same_value_immediately_preceding_stored() {
1105 let mut range_map: RangeMap<u32, bool> = RangeMap::new();
1106 range_map.insert(3..5, false);
1109 range_map.insert(1..3, false);
1112 assert_eq!(range_map.to_vec(), vec![(1..5, false)]);
1115 }
1116
1117 #[test]
1118 fn new_different_value_immediately_preceding_stored() {
1119 let mut range_map: RangeMap<u32, bool> = RangeMap::new();
1120 range_map.insert(3..5, true);
1123 range_map.insert(1..3, false);
1126 assert_eq!(range_map.to_vec(), vec![(1..3, false), (3..5, true)]);
1130 }
1131
1132 #[test]
1133 fn new_same_value_wholly_inside_stored() {
1134 let mut range_map: RangeMap<u32, bool> = RangeMap::new();
1135 range_map.insert(1..5, false);
1138 range_map.insert(2..4, false);
1141 assert_eq!(range_map.to_vec(), vec![(1..5, false)]);
1144 }
1145
1146 #[test]
1147 fn new_different_value_wholly_inside_stored() {
1148 let mut range_map: RangeMap<u32, bool> = RangeMap::new();
1149 range_map.insert(1..5, true);
1152 range_map.insert(2..4, false);
1155 assert_eq!(
1160 range_map.to_vec(),
1161 vec![(1..2, true), (2..4, false), (4..5, true)]
1162 );
1163 }
1164
1165 #[test]
1166 fn replace_at_end_of_existing_range_should_coalesce() {
1167 let mut range_map: RangeMap<u32, bool> = RangeMap::new();
1168 range_map.insert(1..3, false);
1171 range_map.insert(3..5, true);
1174 range_map.insert(3..5, false);
1177 assert_eq!(range_map.to_vec(), vec![(1..5, false)]);
1180 }
1181
1182 #[test]
1183 fn lots_of_interesting_ranges() {
1185 use crate::dense::DenseU32RangeMap;
1186 use permutator::Permutation;
1187
1188 let mut ranges_with_values = [
1189 (2..3, false),
1190 (2..3, false),
1192 (2..3, true),
1194 (3..5, true),
1197 (4..6, true),
1198 (5..7, true),
1199 (2..6, true),
1201 ];
1202
1203 ranges_with_values.permutation().for_each(|permutation| {
1204 let mut range_map: RangeMap<u32, bool> = RangeMap::new();
1205 let mut dense: DenseU32RangeMap<bool> = DenseU32RangeMap::new();
1206
1207 for (k, v) in permutation {
1208 range_map.insert(k.clone(), v);
1210 #[allow(clippy::range_minus_one)]
1213 dense.insert(k.start..=(k.end - 1), v);
1214
1215 let sparse = range_map.to_vec();
1217 let dense = dense.to_end_exclusive_vec();
1218 assert_eq!(sparse, dense);
1219 }
1220 });
1221 }
1222
1223 #[test]
1228 fn get() {
1229 let mut range_map: RangeMap<u32, bool> = RangeMap::new();
1230 range_map.insert(0..50, false);
1231 assert_eq!(range_map.get(&49), Some(&false));
1232 assert_eq!(range_map.get(&50), None);
1233 }
1234
1235 #[test]
1236 fn get_key_value() {
1237 let mut range_map: RangeMap<u32, bool> = RangeMap::new();
1238 range_map.insert(0..50, false);
1239 assert_eq!(range_map.get_key_value(&49), Some((&(0..50), &false)));
1240 assert_eq!(range_map.get_key_value(&50), None);
1241 }
1242
1243 #[test]
1248 fn remove_from_empty_map() {
1249 let mut range_map: RangeMap<u32, bool> = RangeMap::new();
1250 range_map.remove(0..50);
1251 assert_eq!(range_map.to_vec(), vec![]);
1252 }
1253
1254 #[test]
1255 fn remove_non_covered_range_before_stored() {
1256 let mut range_map: RangeMap<u32, bool> = RangeMap::new();
1257 range_map.insert(25..75, false);
1258 range_map.remove(0..25);
1259 assert_eq!(range_map.to_vec(), vec![(25..75, false)]);
1260 }
1261
1262 #[test]
1263 fn remove_non_covered_range_after_stored() {
1264 let mut range_map: RangeMap<u32, bool> = RangeMap::new();
1265 range_map.insert(25..75, false);
1266 range_map.remove(75..100);
1267 assert_eq!(range_map.to_vec(), vec![(25..75, false)]);
1268 }
1269
1270 #[test]
1271 fn remove_overlapping_start_of_stored() {
1272 let mut range_map: RangeMap<u32, bool> = RangeMap::new();
1273 range_map.insert(25..75, false);
1274 range_map.remove(0..30);
1275 assert_eq!(range_map.to_vec(), vec![(30..75, false)]);
1276 }
1277
1278 #[test]
1279 fn remove_middle_of_stored() {
1280 let mut range_map: RangeMap<u32, bool> = RangeMap::new();
1281 range_map.insert(25..75, false);
1282 range_map.remove(30..70);
1283 assert_eq!(range_map.to_vec(), vec![(25..30, false), (70..75, false)]);
1284 }
1285
1286 #[test]
1287 fn remove_overlapping_end_of_stored() {
1288 let mut range_map: RangeMap<u32, bool> = RangeMap::new();
1289 range_map.insert(25..75, false);
1290 range_map.remove(70..100);
1291 assert_eq!(range_map.to_vec(), vec![(25..70, false)]);
1292 }
1293
1294 #[test]
1295 fn remove_exactly_stored() {
1296 let mut range_map: RangeMap<u32, bool> = RangeMap::new();
1297 range_map.insert(25..75, false);
1298 range_map.remove(25..75);
1299 assert_eq!(range_map.to_vec(), vec![]);
1300 }
1301
1302 #[test]
1303 fn remove_superset_of_stored() {
1304 let mut range_map: RangeMap<u32, bool> = RangeMap::new();
1305 range_map.insert(25..75, false);
1306 range_map.remove(0..100);
1307 assert_eq!(range_map.to_vec(), vec![]);
1308 }
1309
1310 #[test]
1313 fn whole_range_is_a_gap() {
1314 let range_map: RangeMap<u32, ()> = RangeMap::new();
1317 let outer_range = 1..8;
1320 let mut gaps = range_map.gaps(&outer_range);
1321 assert_eq!(gaps.next(), Some(1..8));
1323 assert_eq!(gaps.next(), None);
1324 assert_eq!(gaps.next(), None);
1326 assert_eq!(gaps.next(), None);
1327 }
1328
1329 #[test]
1330 fn whole_range_is_covered_exactly() {
1331 let mut range_map: RangeMap<u32, ()> = RangeMap::new();
1332 range_map.insert(1..6, ());
1335 let outer_range = 1..6;
1338 let mut gaps = range_map.gaps(&outer_range);
1339 assert_eq!(gaps.next(), None);
1341 assert_eq!(gaps.next(), None);
1343 assert_eq!(gaps.next(), None);
1344 }
1345
1346 #[test]
1347 fn item_before_outer_range() {
1348 let mut range_map: RangeMap<u32, ()> = RangeMap::new();
1349 range_map.insert(1..3, ());
1352 let outer_range = 5..8;
1355 let mut gaps = range_map.gaps(&outer_range);
1356 assert_eq!(gaps.next(), Some(5..8));
1358 assert_eq!(gaps.next(), None);
1359 assert_eq!(gaps.next(), None);
1361 assert_eq!(gaps.next(), None);
1362 }
1363
1364 #[test]
1365 fn item_touching_start_of_outer_range() {
1366 let mut range_map: RangeMap<u32, ()> = RangeMap::new();
1367 range_map.insert(1..5, ());
1370 let outer_range = 5..8;
1373 let mut gaps = range_map.gaps(&outer_range);
1374 assert_eq!(gaps.next(), Some(5..8));
1376 assert_eq!(gaps.next(), None);
1377 assert_eq!(gaps.next(), None);
1379 assert_eq!(gaps.next(), None);
1380 }
1381
1382 #[test]
1383 fn item_overlapping_start_of_outer_range() {
1384 let mut range_map: RangeMap<u32, ()> = RangeMap::new();
1385 range_map.insert(1..6, ());
1388 let outer_range = 5..8;
1391 let mut gaps = range_map.gaps(&outer_range);
1392 assert_eq!(gaps.next(), Some(6..8));
1395 assert_eq!(gaps.next(), None);
1396 assert_eq!(gaps.next(), None);
1398 assert_eq!(gaps.next(), None);
1399 }
1400
1401 #[test]
1402 fn item_starting_at_start_of_outer_range() {
1403 let mut range_map: RangeMap<u32, ()> = RangeMap::new();
1404 range_map.insert(5..6, ());
1407 let outer_range = 5..8;
1410 let mut gaps = range_map.gaps(&outer_range);
1411 assert_eq!(gaps.next(), Some(6..8));
1413 assert_eq!(gaps.next(), None);
1414 assert_eq!(gaps.next(), None);
1416 assert_eq!(gaps.next(), None);
1417 }
1418
1419 #[test]
1420 fn items_floating_inside_outer_range() {
1421 let mut range_map: RangeMap<u32, ()> = RangeMap::new();
1422 range_map.insert(5..6, ());
1425 range_map.insert(3..4, ());
1428 let outer_range = 1..8;
1431 let mut gaps = range_map.gaps(&outer_range);
1432 assert_eq!(gaps.next(), Some(1..3));
1435 assert_eq!(gaps.next(), Some(4..5));
1436 assert_eq!(gaps.next(), Some(6..8));
1437 assert_eq!(gaps.next(), None);
1438 assert_eq!(gaps.next(), None);
1440 assert_eq!(gaps.next(), None);
1441 }
1442
1443 #[test]
1444 fn item_ending_at_end_of_outer_range() {
1445 let mut range_map: RangeMap<u32, ()> = RangeMap::new();
1446 range_map.insert(7..8, ());
1449 let outer_range = 5..8;
1452 let mut gaps = range_map.gaps(&outer_range);
1453 assert_eq!(gaps.next(), Some(5..7));
1456 assert_eq!(gaps.next(), None);
1457 assert_eq!(gaps.next(), None);
1459 assert_eq!(gaps.next(), None);
1460 }
1461
1462 #[test]
1463 fn item_overlapping_end_of_outer_range() {
1464 let mut range_map: RangeMap<u32, ()> = RangeMap::new();
1465 range_map.insert(4..6, ());
1468 let outer_range = 2..5;
1471 let mut gaps = range_map.gaps(&outer_range);
1472 assert_eq!(gaps.next(), Some(2..4));
1475 assert_eq!(gaps.next(), None);
1476 assert_eq!(gaps.next(), None);
1478 assert_eq!(gaps.next(), None);
1479 }
1480
1481 #[test]
1482 fn item_touching_end_of_outer_range() {
1483 let mut range_map: RangeMap<u32, ()> = RangeMap::new();
1484 range_map.insert(4..8, ());
1487 let outer_range = 1..4;
1490 let mut gaps = range_map.gaps(&outer_range);
1491 assert_eq!(gaps.next(), Some(1..4));
1493 assert_eq!(gaps.next(), None);
1494 assert_eq!(gaps.next(), None);
1496 assert_eq!(gaps.next(), None);
1497 }
1498
1499 #[test]
1500 fn item_after_outer_range() {
1501 let mut range_map: RangeMap<u32, ()> = RangeMap::new();
1502 range_map.insert(6..7, ());
1505 let outer_range = 1..4;
1508 let mut gaps = range_map.gaps(&outer_range);
1509 assert_eq!(gaps.next(), Some(1..4));
1511 assert_eq!(gaps.next(), None);
1512 assert_eq!(gaps.next(), None);
1514 assert_eq!(gaps.next(), None);
1515 }
1516
1517 #[test]
1518 fn empty_outer_range_with_items_away_from_both_sides() {
1519 let mut range_map: RangeMap<u32, ()> = RangeMap::new();
1520 range_map.insert(1..3, ());
1523 range_map.insert(5..7, ());
1526 let outer_range = 4..4;
1529 let mut gaps = range_map.gaps(&outer_range);
1530 assert_eq!(gaps.next(), None);
1532 assert_eq!(gaps.next(), None);
1534 }
1535
1536 #[test]
1537 fn empty_outer_range_with_items_touching_both_sides() {
1538 let mut range_map: RangeMap<u32, ()> = RangeMap::new();
1539 range_map.insert(2..4, ());
1542 range_map.insert(4..6, ());
1545 let outer_range = 4..4;
1548 let mut gaps = range_map.gaps(&outer_range);
1549 assert_eq!(gaps.next(), None);
1551 assert_eq!(gaps.next(), None);
1553 assert_eq!(gaps.next(), None);
1554 }
1555
1556 #[test]
1557 fn empty_outer_range_with_item_straddling() {
1558 let mut range_map: RangeMap<u32, ()> = RangeMap::new();
1559 range_map.insert(2..5, ());
1562 let outer_range = 4..4;
1565 let mut gaps = range_map.gaps(&outer_range);
1566 assert_eq!(gaps.next(), None);
1568 assert_eq!(gaps.next(), None);
1570 assert_eq!(gaps.next(), None);
1571 }
1572
1573 #[test]
1574 fn no_empty_gaps() {
1575 let mut range_map: RangeMap<u32, bool> = RangeMap::new();
1578 range_map.insert(4..5, true);
1581 range_map.insert(3..4, false);
1584 let outer_range = 1..8;
1587 let mut gaps = range_map.gaps(&outer_range);
1588 assert_eq!(gaps.next(), Some(1..3));
1591 assert_eq!(gaps.next(), Some(5..8));
1592 assert_eq!(gaps.next(), None);
1593 assert_eq!(gaps.next(), None);
1595 assert_eq!(gaps.next(), None);
1596 }
1597
1598 #[test]
1599 fn adjacent_small_items() {
1600 let mut range_map: RangeMap<u8, bool> = RangeMap::new();
1602 range_map.insert(0..1, false);
1603 range_map.insert(1..2, true);
1604 range_map.insert(253..254, false);
1605 range_map.insert(254..255, true);
1606
1607 let outer_range = 0..255;
1608 let mut gaps = range_map.gaps(&outer_range);
1609 assert_eq!(gaps.next(), Some(2..253));
1611 assert_eq!(gaps.next(), None);
1613 assert_eq!(gaps.next(), None);
1614 }
1615
1616 #[test]
1618 fn outer_range_lies_within_first_of_two_stored_ranges() {
1619 let mut range_map: RangeMap<u64, ()> = RangeMap::new();
1620 range_map.insert(0..5, ());
1623 range_map.insert(6..8, ());
1626 let outer_range: Range<u64> = 1..3;
1629 let mut gaps = range_map.gaps(&outer_range);
1630 assert_eq!(gaps.next(), None);
1631 }
1632
1633 #[test]
1636 fn overlapping_with_empty_map() {
1637 let range_map: RangeMap<u32, ()> = RangeMap::new();
1640 let query_range = 1..8;
1643 let mut overlapping = range_map.overlapping(&query_range);
1644 assert_eq!(overlapping.next(), None);
1646 assert_eq!(overlapping.next(), None);
1648 }
1649
1650 #[test]
1651 fn overlapping_partial_edges_complete_middle() {
1652 let mut range_map: RangeMap<u32, ()> = RangeMap::new();
1653
1654 range_map.insert(0..2, ());
1657 range_map.insert(3..4, ());
1660 range_map.insert(5..7, ());
1663
1664 let query_range = 1..6;
1667
1668 let mut overlapping = range_map.overlapping(&query_range);
1669
1670 assert_eq!(overlapping.next(), Some((&(0..2), &())));
1672 assert_eq!(overlapping.next(), Some((&(3..4), &())));
1674 assert_eq!(overlapping.next(), Some((&(5..7), &())));
1676 assert_eq!(overlapping.next(), None);
1678 assert_eq!(overlapping.next(), None);
1679 }
1680
1681 #[test]
1682 fn overlapping_non_overlapping_edges_complete_middle() {
1683 let mut range_map: RangeMap<u32, ()> = RangeMap::new();
1684
1685 range_map.insert(0..2, ());
1688 range_map.insert(3..4, ());
1691 range_map.insert(5..7, ());
1694
1695 let query_range = 2..5;
1698
1699 let mut overlapping = range_map.overlapping(&query_range);
1700
1701 assert_eq!(overlapping.next(), Some((&(3..4), &())));
1704 assert_eq!(overlapping.next(), None);
1706 assert_eq!(overlapping.next(), None);
1707 }
1708
1709 #[test]
1714 fn map_debug_repr_looks_right() {
1715 let mut map: RangeMap<u32, ()> = RangeMap::new();
1716
1717 assert_eq!(format!("{:?}", map), "{}");
1719
1720 map.insert(2..5, ());
1722 assert_eq!(format!("{:?}", map), "{2..5: ()}");
1723
1724 map.insert(6..7, ());
1726 map.insert(8..9, ());
1727 assert_eq!(format!("{:?}", map), "{2..5: (), 6..7: (), 8..9: ()}");
1728 }
1729
1730 #[test]
1733 fn always_default() {
1734 struct NoDefault;
1735 RangeMap::<NoDefault, NoDefault>::default();
1736 }
1737
1738 #[test]
1741 fn into_iter_matches_iter() {
1742 let mut range_map: RangeMap<u32, bool> = RangeMap::new();
1744 range_map.insert(1..3, false);
1745 range_map.insert(3..5, true);
1746
1747 let cloned = range_map.to_vec();
1748 let consumed = range_map.into_iter().collect::<Vec<_>>();
1749
1750 assert_eq!(cloned, vec![(1..3, false), (3..5, true)]);
1752
1753 assert_eq!(cloned, consumed);
1755 }
1756
1757 #[test]
1759 fn eq() {
1760 let mut a: RangeMap<u32, bool> = RangeMap::new();
1761 a.insert(1..3, false);
1762
1763 let mut b: RangeMap<u32, bool> = RangeMap::new();
1764 b.insert(1..4, false);
1765
1766 let mut c: RangeMap<u32, bool> = RangeMap::new();
1767 c.insert(1..3, false);
1768
1769 assert_ne!(a, b);
1770 assert_ne!(b, a);
1771
1772 assert_eq!(a, c);
1773 assert_eq!(c, a);
1774 assert_eq!(a, a);
1775 }
1776
1777 #[test]
1779 fn partial_ord() {
1780 let mut a: RangeMap<u32, bool> = RangeMap::new();
1781 a.insert(1..3, false);
1782
1783 let mut b: RangeMap<u32, bool> = RangeMap::new();
1784 b.insert(1..4, false);
1785
1786 assert_eq!(a.partial_cmp(&a), Some(Ordering::Equal));
1787
1788 assert_eq!(a.partial_cmp(&b), Some(Ordering::Less));
1789 assert_eq!(b.partial_cmp(&a), Some(Ordering::Greater));
1790 }
1791
1792 #[test]
1793 fn ord() {
1794 let mut a: RangeMap<u32, bool> = RangeMap::new();
1795 a.insert(1..3, false);
1796
1797 let mut b: RangeMap<u32, bool> = RangeMap::new();
1798 b.insert(1..4, false);
1799
1800 assert_eq!(a.cmp(&a), Ordering::Equal);
1801
1802 assert_eq!(a.cmp(&b), Ordering::Less);
1803 assert_eq!(b.cmp(&a), Ordering::Greater);
1804 }
1805
1806 #[cfg(feature = "serde1")]
1809 #[test]
1810 fn serialization() {
1811 let mut range_map: RangeMap<u32, bool> = RangeMap::new();
1812 range_map.insert(1..3, false);
1815 range_map.insert(5..7, true);
1818 let output = serde_json::to_string(&range_map).expect("Failed to serialize");
1819 assert_eq!(output, "[[[1,3],false],[[5,7],true]]");
1820 }
1821
1822 #[cfg(feature = "serde1")]
1825 #[test]
1826 fn deserialization() {
1827 let input = "[[[1,3],false],[[5,7],true]]";
1828 let range_map: RangeMap<u32, bool> =
1829 serde_json::from_str(input).expect("Failed to deserialize");
1830 let reserialized = serde_json::to_string(&range_map).expect("Failed to re-serialize");
1831 assert_eq!(reserialized, input);
1832 }
1833
1834 #[cfg(feature = "const_fn")]
1837 const _MAP: RangeMap<u32, bool> = RangeMap::new();
1838
1839 #[cfg(feature = "quickcheck")]
1840 quickcheck::quickcheck! {
1841 fn prop(xs: RangeMap<usize, usize>) -> bool {
1842 xs == xs
1843 }
1844 }
1845}