1extern crate num_traits;
9#[cfg(feature = "derive_serdes")]
10extern crate serde;
11extern crate smallvec;
12
13pub mod range_compare;
14
15pub use range_compare::{
16 RangeCompare, RangeDisjoint, RangeIntersect, range_compare, intersection
17};
18
19use std::ops::RangeInclusive;
20use num_traits::PrimInt;
21use smallvec::SmallVec;
22
23#[derive(Clone, Debug, Eq)]
60pub struct RangeSet <A> where
61 A : smallvec::Array + Eq + std::fmt::Debug,
62 A::Item : Clone + Eq + std::fmt::Debug
63{
64 ranges : SmallVec <A>
65}
66
67pub struct Iter <'a, A, T> where
69 A : 'a + smallvec::Array <Item=RangeInclusive <T>> + Eq + std::fmt::Debug,
70 T : 'a + PrimInt + std::fmt::Debug
71{
72 range_set : &'a RangeSet <A>,
73 range_index : usize,
74 range : RangeInclusive <T>
75}
76
77pub fn valid_range_slice <T, V> (ranges : V) -> bool where
103 T : PartialOrd + PrimInt,
104 V : AsRef <[RangeInclusive <T>]>
105{
106 let ranges = ranges.as_ref();
107 if !ranges.is_empty() {
108 for i in 0..ranges.len()-1 { let this = &ranges[i];
110 let next = &ranges[i+1]; if this.is_empty() || next.is_empty() {
112 return false
113 }
114 if *next.start() <= this.end().saturating_add (T::one()) {
115 return false
116 }
117 }
118 }
119 true
120}
121
122pub fn report_sizes() {
124 use std::mem::size_of;
125 println!("RangeSet report sizes...");
126
127 println!(" size of RangeSet <[RangeInclusive <u32>; 1]>: {}",
128 size_of::<RangeSet <[RangeInclusive <u32>; 1]>>());
129 println!(" size of RangeSet <[RangeInclusive <u16>; 1]>: {}",
130 size_of::<RangeSet <[RangeInclusive <u16>; 1]>>());
131 println!(" size of RangeSet <[RangeInclusive <u32>; 1]>: {}",
132 size_of::<RangeSet <[RangeInclusive <u32>; 1]>>());
133 println!(" size of RangeSet <[RangeInclusive <u64>; 1]>: {}",
134 size_of::<RangeSet <[RangeInclusive <u64>; 1]>>());
135 println!(" size of RangeSet <[RangeInclusive <usize>; 1]>: {}",
136 size_of::<RangeSet <[RangeInclusive <usize>; 1]>>());
137
138 println!(" size of RangeSet <[RangeInclusive <u32>; 2]>: {}",
139 size_of::<RangeSet <[RangeInclusive <u32>; 2]>>());
140 println!(" size of RangeSet <[RangeInclusive <u16>; 2]>: {}",
141 size_of::<RangeSet <[RangeInclusive <u16>; 2]>>());
142 println!(" size of RangeSet <[RangeInclusive <u32>; 2]>: {}",
143 size_of::<RangeSet <[RangeInclusive <u32>; 2]>>());
144 println!(" size of RangeSet <[RangeInclusive <u64>; 2]>: {}",
145 size_of::<RangeSet <[RangeInclusive <u64>; 2]>>());
146 println!(" size of RangeSet <[RangeInclusive <usize>; 2]>: {}",
147 size_of::<RangeSet <[RangeInclusive <usize>; 2]>>());
148
149 println!(" size of RangeSet <[RangeInclusive <u32>; 4]>: {}",
150 size_of::<RangeSet <[RangeInclusive <u32>; 4]>>());
151 println!(" size of RangeSet <[RangeInclusive <u16>; 4]>: {}",
152 size_of::<RangeSet <[RangeInclusive <u16>; 4]>>());
153 println!(" size of RangeSet <[RangeInclusive <u32>; 4]>: {}",
154 size_of::<RangeSet <[RangeInclusive <u32>; 4]>>());
155 println!(" size of RangeSet <[RangeInclusive <u64>; 4]>: {}",
156 size_of::<RangeSet <[RangeInclusive <u64>; 4]>>());
157 println!(" size of RangeSet <[RangeInclusive <usize>; 4]>: {}",
158 size_of::<RangeSet <[RangeInclusive <usize>; 4]>>());
159
160 println!(" size of RangeSet <[RangeInclusive <u32>; 8]>: {}",
161 size_of::<RangeSet <[RangeInclusive <u32>; 8]>>());
162 println!(" size of RangeSet <[RangeInclusive <u16>; 8]>: {}",
163 size_of::<RangeSet <[RangeInclusive <u16>; 8]>>());
164 println!(" size of RangeSet <[RangeInclusive <u32>; 8]>: {}",
165 size_of::<RangeSet <[RangeInclusive <u32>; 8]>>());
166 println!(" size of RangeSet <[RangeInclusive <u64>; 8]>: {}",
167 size_of::<RangeSet <[RangeInclusive <u64>; 8]>>());
168 println!(" size of RangeSet <[RangeInclusive <usize>; 8]>: {}",
169 size_of::<RangeSet <[RangeInclusive <usize>; 8]>>());
170
171 println!(" size of RangeSet <[RangeInclusive <u32>; 16]>: {}",
172 size_of::<RangeSet <[RangeInclusive <u32>; 16]>>());
173 println!(" size of RangeSet <[RangeInclusive <u16>; 16]>: {}",
174 size_of::<RangeSet <[RangeInclusive <u16>; 16]>>());
175 println!(" size of RangeSet <[RangeInclusive <u32>; 16]>: {}",
176 size_of::<RangeSet <[RangeInclusive <u32>; 16]>>());
177 println!(" size of RangeSet <[RangeInclusive <u64>; 16]>: {}",
178 size_of::<RangeSet <[RangeInclusive <u64>; 16]>>());
179 println!(" size of RangeSet <[RangeInclusive <usize>; 16]>: {}",
180 size_of::<RangeSet <[RangeInclusive <usize>; 16]>>());
181
182 println!("...RangeSet report sizes");
183}
184
185impl<A, T> Default for RangeSet <A>
195where
196 A : smallvec::Array <Item=RangeInclusive <T>> + Eq + std::fmt::Debug,
197 T : PrimInt + std::fmt::Debug
198 {
199 fn default() -> Self {
200 Self::new()
201 }
202}
203
204impl <A, T> RangeSet <A> where
205 A : smallvec::Array <Item=RangeInclusive <T>> + Eq + std::fmt::Debug,
206 T : PrimInt + std::fmt::Debug
207{
208 #[inline]
210 pub fn new() -> Self {
211 RangeSet {
212 ranges: SmallVec::new()
213 }
214 }
215
216 #[inline]
219 pub fn with_capacity (capacity : usize) -> Self {
220 RangeSet {
221 ranges: SmallVec::with_capacity (capacity)
222 }
223 }
224
225 pub fn from_smallvec (ranges : SmallVec <A>) -> Option <Self> {
228 if valid_range_slice (ranges.as_slice()) {
229 Some (RangeSet { ranges })
230 } else {
231 None
232 }
233 }
234
235 pub unsafe fn from_raw_parts (ranges : SmallVec <A>) -> Self {
241 debug_assert!(valid_range_slice (ranges.as_slice()));
242 RangeSet { ranges }
243 }
244
245 pub fn from_valid_ranges <V : AsRef <[RangeInclusive <T>]>> (ranges : V)
248 -> Option <Self>
249 {
250 if valid_range_slice (&ranges) {
251 let ranges = SmallVec::from (ranges.as_ref());
252 Some (RangeSet { ranges })
253 } else {
254 None
255 }
256 }
257
258 pub fn from_ranges <V : AsRef <[RangeInclusive <T>]>> (ranges : V) -> Self {
263 let mut ret = Self::new();
264 for range in ranges.as_ref() {
265 ret.insert_range_optimistic(range.clone());
266 }
267 ret
268 }
269
270 pub fn from_elements <V : AsRef <[T]>> (elements : V) -> Self {
291 let mut current_range : Option<(T, T)> = None;
292 let mut set = Self::new();
293
294 for &element in elements.as_ref() {
295 current_range = if let Some((start, end)) = current_range {
297 if element == end.saturating_add (T::one()) {
298 Some((start, element))
299 } else {
300 set.insert_range_optimistic(start..=end);
301 Some((element, element))
302 }
303 } else {
304 Some((element, element))
305 };
306 }
307
308 if let Some((start, end)) = current_range {
309 set.insert_range_optimistic(start..=end);
310 }
311
312 set
313 }
314
315 #[inline]
317 pub fn is_empty (&self) -> bool {
318 self.ranges.is_empty()
319 }
320
321 #[inline]
329 pub fn len (&self) -> usize where T : num_traits::AsPrimitive <usize> {
330 self.ranges.iter().map (|r| r.end().as_() - r.start().as_() + 1).sum()
331 }
332
333 #[inline]
335 pub fn clear (&mut self) {
336 self.ranges.clear()
337 }
338
339 #[inline]
341 pub fn into_smallvec (self) -> SmallVec <A> {
342 self.ranges
343 }
344
345 pub fn contains (&self, element : T) -> bool {
368 self.contains_range(element..=element)
369 }
370
371 pub fn contains_range (&self, range : A::Item) -> bool {
395 self.contains_range_ref(&range)
396 }
397
398 pub fn is_superset (&self, other : &Self) -> bool {
413 other.is_subset(self)
414 }
415
416 pub fn is_subset (&self, other : &Self) -> bool {
431 self.ranges.iter().all(|range| other.contains_range_ref (range))
432 }
433
434 pub fn max (&self) -> Option <T> {
436 self.ranges.last().map(|r| *r.end())
437 }
438
439 pub fn min (&self) -> Option <T> {
441 self.ranges.first().map(|r| *r.start())
442 }
443
444 pub fn insert (&mut self, element : T) -> bool {
464 self.insert_range (element..=element).is_none()
465 }
466
467 pub fn remove (&mut self, element : T) -> bool {
491 self.remove_range (element..=element).is_some()
492 }
493
494 pub fn insert_range (&mut self, range : A::Item) -> Option <Self> {
505 if range.is_empty () { return None
507 }
508 if self.ranges.is_empty() { self.ranges.push (range);
510 return None
511 }
512 let before = Self::binary_search_before_proper (self, &range);
513 let after = Self::binary_search_after_proper (self, &range);
514 match (before, after) {
515 (None, None) => {
521 let isect = self.range_intersection (&range, 0..self.ranges.len());
522 let new_range =
523 std::cmp::min (*range.start(), *self.ranges[0].start())..=
524 std::cmp::max (*range.end(), *self.ranges[self.ranges.len()-1].end());
525 self.ranges.clear();
526 self.ranges.push (new_range);
527 if !isect.is_empty() {
528 Some (isect)
529 } else {
530 None
531 }
532 }
533 (Some (before), None) => {
535 if before+1 == self.ranges.len() { self.ranges.push (range);
537 None
538 } else { let isect
540 = self.range_intersection (&range, before+1..self.ranges.len());
541 self.ranges[before+1] =
542 std::cmp::min (*range.start(), *self.ranges[before+1].start())..=
543 std::cmp::max (*range.end(), *self.ranges[self.ranges.len()-1].end());
544 self.ranges.truncate (before+2);
545 if !isect.is_empty() {
546 Some (isect)
547 } else {
548 None
549 }
550 }
551 }
552 (None, Some (after)) => {
554 if after == 0 { self.ranges.insert (0, range);
556 None
557 } else { let isect = self.range_intersection (&range, 0..after);
559 self.ranges[0] =
560 std::cmp::min (*range.start(), *self.ranges[0].start())..=
561 std::cmp::max (*range.end(), *self.ranges[after - 1].end());
562 self.ranges.as_mut_slice()[1..].rotate_left(after - 1);
563 let new_len = self.ranges.len() - after + 1;
564 self.ranges.truncate (new_len);
565 if !isect.is_empty() {
566 Some (isect)
567 } else {
568 None
569 }
570 }
571 }
572 (Some (before), Some (after)) => {
575 if before+1 == after { self.ranges.insert (before+1, range);
577 None
578 } else { let isect = self.range_intersection (&range, before+1..after);
580 self.ranges[before+1] =
581 std::cmp::min (*range.start(), *self.ranges[before+1].start())..=
582 std::cmp::max (*range.end(), *self.ranges[after-1].end());
583 if 1 < after - before - 1 {
585 self.ranges.as_mut_slice()[(before + 2)..]
586 .rotate_left (after - before - 2);
587 let new_len = self.ranges.len() - (after - before - 2);
588 self.ranges.truncate (new_len);
589 }
590 if !isect.is_empty() {
591 Some (isect)
592 } else {
593 None
594 }
595 }
596 }
597 }
598 } fn insert_range_optimistic (&mut self, range : A::Item) {
603 if let Some(last) = self.ranges.last() {
604 if last.end().saturating_add (T::one()) < *range.start() {
605 self.ranges.push(range);
606 } else {
607 self.insert_range(range);
609 }
610 } else {
611 self.ranges.push(range);
613 }
614 }
615
616 pub fn remove_range (&mut self, range : A::Item) -> Option <Self> {
629 if self.ranges.is_empty() || range.is_empty() { return None
631 }
632 let before = Self::binary_search_before (self, &range);
633 let after = Self::binary_search_after (self, &range);
634 let (isect_first, isect_last) = match (before, after) {
636 (None, None) => (0, self.ranges.len()),
637 (Some (before), None) => (before+1, self.ranges.len()),
638 (None, Some (after)) => (0, after),
639 (Some (before), Some (after)) => (before+1, after)
640 };
641 let isect = self.range_intersection (&range, isect_first..isect_last);
642 if isect.is_empty() {
643 return None
644 }
645
646 if isect_last - isect_first == 1 {
648 let single_range = self.ranges[isect_first].clone();
649 if single_range.start() < range.start() &&
650 range.end() < single_range.end()
651 {
652 let left = *single_range.start()..=*range.start() - T::one();
653 let right = *range.end() + T::one()..=*single_range.end();
654 self.ranges[isect_first] = right;
655 self.ranges.insert (isect_first, left);
656 return Some (isect)
657 }
658 }
659
660 let first = self.ranges[isect_first].clone();
663 let last = self.ranges[isect_last-1].clone();
664
665 let (remove_first, remove_last) = if
666 range.start() <= first.start() && last.end() <= range.end()
668 {
669 (isect_first, isect_last)
670 } else if first.start() < range.start() && last.end() <= range.end() {
672 self.ranges[isect_first] =
673 *self.ranges[isect_first].start()..=*range.start() - T::one();
674 (isect_first+1, isect_last)
675 } else if range.start() <= first.start() && range.end() < last.end() {
677 self.ranges[isect_last-1] =
678 *range.end() + T::one()..=*self.ranges[isect_last-1].end();
679 (isect_first, isect_last-1)
680 } else {
682 debug_assert!(first.start() < range.start() && range.end() < last.end());
683 self.ranges[isect_first] =
684 *self.ranges[isect_first].start()..=*range.start() - T::one();
685 self.ranges[isect_last-1] =
686 *range.end() + T::one()..=*self.ranges[isect_last-1].end();
687 (isect_first+1, isect_last-1)
688 };
689 for (i, index) in (remove_last..self.ranges.len()).enumerate() {
691 self.ranges[remove_first+i] = self.ranges[index].clone();
692 }
693 let new_len = self.ranges.len() - (remove_last - remove_first);
694 self.ranges.truncate (new_len);
695
696 debug_assert!(self.is_valid());
697 Some (isect)
698 }
699
700 pub fn union (&self, other : &Self) -> Self where A : Clone {
714 let mut new = (*self).clone();
715 other.ranges.iter().cloned().for_each (|r| { new.insert_range (r); });
716 new
717 }
718
719 #[allow(mismatched_lifetime_syntaxes)]
724 pub fn iter (&self) -> Iter <A, T> {
725 Iter {
726 range_set: self,
727 range_index: 0,
728 range: T::one()..=T::zero()
729 }
730 }
731
732 #[inline]
734 pub fn spilled (&self) -> bool {
735 self.ranges.spilled()
736 }
737
738 #[inline]
740 pub fn shrink_to_fit (&mut self) {
741 self.ranges.shrink_to_fit()
742 }
743
744 fn binary_search_before (&self, range : &A::Item) -> Option <usize> {
747 let mut before = 0;
748 let mut after = self.ranges.len();
749 let mut found = false;
750 while before != after {
751 let i = before + (after - before) / 2;
752 let last = before;
753 if self.ranges[i].end() < range.start() {
754 found = true;
755 before = i;
756 if before == last {
757 break
758 }
759 } else {
760 after = i
761 }
762 }
763 if found {
764 Some (before)
765 } else {
766 None
767 }
768 }
769
770 fn binary_search_after (&self, range : &A::Item) -> Option <usize> {
774 let mut before = 0;
775 let mut after = self.ranges.len();
776 let mut found = false;
777 while before != after {
778 let i = before + (after - before) / 2;
779 let last = before;
780 if range.end() < self.ranges[i].start() {
781 found = true;
782 after = i;
783 } else {
784 before = i;
785 if before == last {
786 break
787 }
788 }
789 }
790 if found {
791 Some (after)
792 } else {
793 None
794 }
795 }
796
797 fn binary_search_before_proper (&self, range : &A::Item) -> Option <usize> {
800 let mut before = 0;
801 let mut after = self.ranges.len();
802 let mut found = false;
803 while before != after {
804 let i = before + (after - before) / 2;
805 let last = before;
806 if self.ranges[i].end().saturating_add (T::one()) < *range.start() {
807 found = true;
808 before = i;
809 if before == last {
810 break
811 }
812 } else {
813 after = i
814 }
815 }
816 if found {
817 Some (before)
818 } else {
819 None
820 }
821 }
822
823 fn binary_search_after_proper (&self, range : &A::Item) -> Option <usize> {
826 let mut before = 0;
827 let mut after = self.ranges.len();
828 let mut found = false;
829 while before != after {
830 let i = before + (after - before) / 2;
831 let last = before;
832 if range.end().saturating_add (T::one()) < *self.ranges[i].start() {
833 found = true;
834 after = i;
835 } else {
836 before = i;
837 if before == last {
838 break
839 }
840 }
841 }
842 if found {
843 Some (after)
844 } else {
845 None
846 }
847 }
848
849 fn contains_range_ref (&self, range : &A::Item) -> bool {
852 if range.is_empty() {
853 return true;
854 }
855 if self.ranges.is_empty() {
856 return false;
857 }
858 let test_range = if let Some(before) = self.binary_search_before(range) {
860 if let Some(next) = self.ranges.get(before + 1) {
863 next
864 } else {
865 return false;
867 }
868 } else {
869 &self.ranges[0]
873 };
874 test_range.contains(range.start()) && test_range.contains(range.end())
876 }
877
878 fn range_intersection (&self,
881 range : &A::Item, range_range : std::ops::Range <usize>
882 ) -> Self {
883 let mut isect = RangeSet::new();
884 for i in range_range {
885 let r = &self.ranges[i];
886 let rsect = intersection (range, r);
887 if !rsect.is_empty() {
888 isect.ranges.push (rsect);
889 }
890 }
891 debug_assert!(isect.is_valid());
892 isect
893 }
894
895 #[inline]
901 fn is_valid (&self) -> bool {
902 valid_range_slice (&self.ranges)
903 }
904}
905
906impl <A, T> From <RangeInclusive <T>> for RangeSet <A> where
907 A : smallvec::Array <Item=RangeInclusive <T>>
908 + Eq + std::fmt::Debug,
909 T : PrimInt + std::fmt::Debug
910{
911 fn from (range : RangeInclusive <T>) -> Self {
912 let ranges = {
913 let mut v = SmallVec::new();
914 v.push (range);
915 v
916 };
917 RangeSet { ranges }
918 }
919}
920
921impl <A, T> AsRef <SmallVec <A>> for RangeSet <A> where
922 A : smallvec::Array <Item=RangeInclusive <T>>
923 + Eq + std::fmt::Debug,
924 T : PrimInt + std::fmt::Debug
925{
926 fn as_ref (&self) -> &SmallVec <A> {
927 &self.ranges
928 }
929}
930
931impl<A, B> PartialEq<RangeSet<B>> for RangeSet<A> where
936 A : smallvec::Array + Eq + std::fmt::Debug,
937 A::Item : Clone + Eq + std::fmt::Debug,
938 B : smallvec::Array<Item = A::Item> + Eq + std::fmt::Debug
939{
940 fn eq(&self, other : &RangeSet<B>) -> bool {
941 self.ranges.eq(&other.ranges)
942 }
943}
944
945impl <'a, A, T> Iterator for Iter <'a, A, T> where
946 A : smallvec::Array <Item=RangeInclusive <T>>
947 + Eq + std::fmt::Debug,
948 T : PrimInt + std::fmt::Debug,
949 RangeInclusive <T> : Clone + Iterator <Item=T>
950{
951 type Item = T;
952 fn next (&mut self) -> Option <Self::Item> {
953 if let Some (t) = self.range.next() {
954 Some (t)
955 } else if self.range_index < self.range_set.ranges.len() {
956 self.range = self.range_set.ranges[self.range_index].clone();
957 debug_assert!(!self.range.is_empty());
958 self.range_index += 1;
959 self.range.next()
960 } else {
961 None
962 }
963 }
964}
965
966#[cfg(feature = "derive_serdes")]
967impl<A, T> serde::Serialize for RangeSet<A> where
968 A : smallvec::Array <Item=RangeInclusive <T>>
969 + Eq + std::fmt::Debug,
970 T : PrimInt + std::fmt::Debug + serde::Serialize,
971{
972 fn serialize<S: serde::Serializer>(&self, serializer: S)
973 -> Result<S::Ok, S::Error>
974 {
975 self.ranges.serialize(serializer)
976 }
977}
978
979#[cfg(feature = "derive_serdes")]
980impl<'de, A, T> serde::Deserialize<'de> for RangeSet<A> where
981 A : smallvec::Array <Item=RangeInclusive <T>>
982 + Eq + std::fmt::Debug,
983 T : PrimInt + std::fmt::Debug + serde::Deserialize<'de>,
984{
985 fn deserialize<D: serde::Deserializer<'de>>(deserializer: D)
986 -> Result<Self, D::Error>
987 {
988 let ranges = SmallVec::deserialize(deserializer)?;
989
990 Ok(Self {
991 ranges
992 })
993 }
994}
995
996pub const DEFAULT_RANGE_COUNT: usize = 4;
1002
1003#[macro_export]
1053macro_rules! range_set {
1054 () => {
1056 $crate::RangeSet::<[core::ops::RangeInclusive<_>; $crate::DEFAULT_RANGE_COUNT]>::new()
1057 };
1058 ( ; $len:expr ) => {
1059 $crate::RangeSet::<[core::ops::RangeInclusive<_>; $len]>::new()
1060 };
1061
1062 ( $( $num:tt ),+ ) => {
1064 $crate::range_set![ $( $num ),+ ; $crate::DEFAULT_RANGE_COUNT ]
1065 };
1066 ( $( $num:tt ),+ ; $len:expr ) => {
1067 $crate::RangeSet::<[core::ops::RangeInclusive<_>; $len]>::from_elements([ $( $num ),+ ])
1068 };
1069
1070 ( $( $start:tt $( ..= $end:tt )? $( as $range_keyword:tt )? ),+ ) => {
1072 $crate::range_set![ $( $start $(..= $end )? ),+ ; $crate::DEFAULT_RANGE_COUNT ]
1073 };
1074 ( $( $start:tt $( ..= $end:tt )? $( as $range_keyword:tt )? ),+ ; $len:expr ) => {
1075 $crate::RangeSet::<[core::ops::RangeInclusive<_>; $len]>::from_ranges([ $( $crate::__range_set_helper!($start $( ..= $end )? $( as $range_keyword )? ) ),+ ])
1076 };
1077}
1078
1079#[macro_export]
1082#[doc(hidden)]
1083macro_rules! __range_set_helper {
1084 ( $num:tt ) => { { let val = $num; val ..= val } };
1085 ( $start:tt ..= $end:tt ) => ( $start ..= $end );
1086 ( $range_expr:tt as range) => ( $range_expr );
1087}
1088
1089#[cfg(test)]
1090mod tests {
1091 use std::ops::RangeInclusive;
1092 use crate::RangeSet;
1093
1094 #[test]
1095 fn merge_multiple() {
1096 let mut range_set: RangeSet<[RangeInclusive<u32>; 2]> = RangeSet::new();
1097 range_set.insert_range(3..=3);
1098 range_set.insert_range(5..=5);
1099 range_set.insert_range(7..=7);
1100 assert_eq!(
1101 range_set.insert_range(1..=9),
1102 {
1103 let mut r = RangeSet::from(3..=3);
1104 r.insert_range(5..=5);
1105 r.insert_range(7..=7);
1106 Some(r)
1107 }
1108 );
1109
1110 assert_eq!(range_set.ranges.into_vec(), vec!(1..=9));
1111 }
1112
1113 #[test]
1114 fn merge_multiple_then_gap() {
1115 let mut range_set: RangeSet<[RangeInclusive<u32>; 2]> = RangeSet::new();
1116 range_set.insert_range(3..=3);
1117 range_set.insert_range(5..=5);
1118 range_set.insert_range(9..=9);
1119 assert_eq!(
1120 range_set.insert_range(1..=7),
1121 {
1122 let mut r = RangeSet::from(3..=3);
1123 r.insert_range(5..=5);
1124 Some(r)
1125 }
1126 );
1127
1128 assert_eq!(range_set.ranges.into_vec(), vec!(1..=7, 9..=9));
1129 }
1130
1131 #[test]
1132 fn gap_then_merge_multiple() {
1133 let mut range_set: RangeSet<[RangeInclusive<u32>; 2]> = RangeSet::new();
1134 range_set.insert_range(1..=1);
1135 range_set.insert_range(5..=5);
1136 range_set.insert_range(7..=7);
1137 assert_eq!(
1138 range_set.insert_range(3..=9),
1139 {
1140 let mut r = RangeSet::from(5..=5);
1141 r.insert_range(7..=7);
1142 Some(r)
1143 }
1144 );
1145
1146 assert_eq!(range_set.ranges.into_vec(), vec!(1..=1, 3..=9));
1147 }
1148
1149 #[test]
1150 fn gap_then_merge_multiple_then_gap() {
1151 let mut range_set: RangeSet<[RangeInclusive<u32>; 2]> = RangeSet::new();
1152 range_set.insert_range(1..=1);
1153 range_set.insert_range(3..=3);
1154 range_set.insert_range(5..=5);
1155 range_set.insert_range(7..=7);
1156 range_set.insert_range(9..=9);
1157 assert_eq!(
1158 range_set.insert_range(3..=7),
1159 {
1160 let mut r = RangeSet::from(3..=3);
1161 r.insert_range(5..=5);
1162 r.insert_range(7..=7);
1163 Some(r)
1164 }
1165 );
1166
1167 assert_eq!(range_set.ranges.into_vec(), vec!(1..=1, 3..=7, 9..=9));
1168 }
1169
1170 #[test]
1171 fn test_range_set_macro_empty() {
1172 assert_eq!(range_set![; 3], RangeSet::<[RangeInclusive<u8>; 3]>::new());
1173 assert_eq!(range_set![], RangeSet::<[RangeInclusive<u8>; 4]>::new());
1174 }
1175
1176 #[allow(unused_parens)]
1178 #[test]
1179 fn test_range_set_macro_nums() {
1180 let case1 = RangeSet::<[RangeInclusive<u8>; 3]>::from_valid_ranges (
1181 [0..=0, 2..=5]
1182 ).unwrap();
1183 let case2 = RangeSet::<[RangeInclusive<u8>; 4]>::from_valid_ranges (
1184 [1..=3, 6..=6, 8..=10]
1185 ).unwrap();
1186 const SOME_CONST: u8 = 5;
1187 let not_token_tree = |x: u8| x;
1188
1189 assert_eq!(range_set![0, 2, 3, 4, 5; 3], case1);
1191 assert_eq!(range_set![0, 2, (1 + 2), 4, SOME_CONST; 3], case1);
1192 assert_eq!(range_set![0, 2, (not_token_tree(3)), 4, 5; 3], case1);
1193
1194 assert_eq!(range_set![1, 2, 3, 6, 8, 9, 10; 4], case2);
1195 assert_eq!(range_set![1, 2, 3, (3 * 2), 8, 9, 10], case2);
1196
1197 let mut counter = 0;
1198 let mut call_only_once = |x: u8| { counter += 1; x };
1199 assert_eq!(range_set![0, 2, (call_only_once(3)), 4, 5; 3], case1);
1200 assert_eq!(counter, 1);
1201 }
1202
1203 #[allow(unused_parens)]
1205 #[test]
1206 fn test_range_set_macro_mixed() {
1207 let case1 = RangeSet::<[RangeInclusive<u8>; 3]>::from_valid_ranges (
1208 [0..=0, 2..=5]
1209 ).unwrap();
1210 let case2 = RangeSet::<[RangeInclusive<u8>; 4]>::from_valid_ranges (
1211 [1..=3, 6..=15, 40..=40, 42..=50]
1212 ).unwrap();
1213 const SOME_CONST: u8 = 40;
1214 let not_token_tree = |x: u8| x;
1215
1216 assert_eq!(range_set![0, 2..=5; 3], case1);
1217 assert_eq!(range_set![0, (not_token_tree(2))..=5; 3], case1);
1218
1219 assert_eq!(range_set![1..=3, 6..=15, 40, 42..=50; 4], case2);
1220 assert_eq!(range_set![1, 2, 3, 6..=15, 40, 42..=50], case2);
1221 assert_eq!(range_set![1..=3, (3+3)..=15, SOME_CONST, 42..=50; 4], case2);
1222 assert_eq!(range_set![1..=3, 6..=15, 40..=40, (not_token_tree(42))..=50; 4], case2);
1223
1224 let mut counter = 0;
1225 let mut call_only_once = |x: u8| { counter += 1; x };
1226 assert_eq!(range_set![1..=3, 6..=15, (call_only_once(40)), 42..=50; 4], case2);
1227 assert_eq!(counter, 1);
1228
1229 assert_eq!(range_set![0, 2, 3, 5; 8],
1230 RangeSet::<[RangeInclusive<u8>; 8]>::from_valid_ranges (
1231 [0..=0, 2..=3, 5..=5]
1232 ).unwrap());
1233 assert_eq!(range_set![0..=0, 2..=2, (not_token_tree(4) + 1)..=5],
1234 RangeSet::<[RangeInclusive<u8>; 4]>::from_valid_ranges (
1235 [0..=0, 2..=2, 5..=5]
1236 ).unwrap());
1237 }
1238
1239 #[test]
1240 fn test_max() {
1241 let mut set = RangeSet::<[RangeInclusive <u32>; 2]>::new();
1242 assert_eq!(set.max(), None);
1243
1244 set.insert_range(4..=5);
1245 assert_eq!(set.max(), Some(5));
1246
1247 set.insert(21);
1248 assert_eq!(set.max(), Some(21));
1249
1250 set.insert_range(6..=13);
1251 assert_eq!(set.max(), Some(21));
1252
1253 set.remove(21);
1254 assert_eq!(set.max(), Some(13));
1255 }
1256
1257 #[test]
1258 fn test_min() {
1259 let mut set = RangeSet::<[RangeInclusive <u32>; 2]>::new();
1260 assert_eq!(set.min(), None);
1261
1262 set.insert_range(4..=5);
1263 assert_eq!(set.min(), Some(4));
1264
1265 set.insert(2);
1266 assert_eq!(set.min(), Some(2));
1267
1268 set.insert_range(6..=13);
1269 assert_eq!(set.min(), Some(2));
1270
1271 set.remove_range(2..=4);
1272 assert_eq!(set.min(), Some(5));
1273 }
1274
1275 #[test]
1276 fn test_random() {
1277 use rand::{Rng, SeedableRng};
1278 let mut rng = rand_xorshift::XorShiftRng::seed_from_u64 (0);
1279 let mut s = RangeSet::<[RangeInclusive <u8>; 4]>::new();
1280 for _ in 0..10000 {
1281 s.insert_range (rng.random()..=rng.random());
1282 s.insert (rng.random());
1283 s.remove_range (rng.random()..=rng.random());
1284 s.remove (rng.random());
1285 }
1286 println!("s: {:?}", s);
1287 }
1288}