1use num_traits;
8#[cfg(feature = "derive_serdes")]
9use serde;
10use smallvec;
11
12pub mod range_compare;
13
14pub use range_compare::{
15 RangeCompare, RangeDisjoint, RangeIntersect, range_compare, intersection
16};
17
18use std::ops::RangeInclusive;
19use num_traits::PrimInt;
20use smallvec::SmallVec;
21
22#[derive(Clone, Debug, Eq)]
59pub struct RangeSet <A> where
60 A : smallvec::Array + Eq + std::fmt::Debug,
61 A::Item : Clone + Eq + std::fmt::Debug
62{
63 ranges : SmallVec <A>
64}
65
66pub struct Iter <'a, A, T> where
68 A : smallvec::Array <Item=RangeInclusive <T>> + Eq + std::fmt::Debug,
69 T : 'a + PrimInt + std::fmt::Debug
70{
71 range_set : &'a RangeSet <A>,
72 range_index : usize,
73 range : RangeInclusive <T>
74}
75
76pub fn valid_range_slice <T, V> (ranges : V) -> bool where
102 T : PartialOrd + PrimInt,
103 V : AsRef <[RangeInclusive <T>]>
104{
105 let ranges = ranges.as_ref();
106 if !ranges.is_empty() {
107 for i in 0..ranges.len()-1 { let this = &ranges[i];
109 let next = &ranges[i+1]; if this.is_empty() || next.is_empty() {
111 return false
112 }
113 if *next.start() <= this.end().saturating_add (T::one()) {
114 return false
115 }
116 }
117 }
118 true
119}
120
121pub fn report_sizes() {
123 use std::mem::size_of;
124 println!("RangeSet report sizes...");
125
126 println!(" size of RangeSet <[RangeInclusive <u32>; 1]>: {}",
127 size_of::<RangeSet <[RangeInclusive <u32>; 1]>>());
128 println!(" size of RangeSet <[RangeInclusive <u16>; 1]>: {}",
129 size_of::<RangeSet <[RangeInclusive <u16>; 1]>>());
130 println!(" size of RangeSet <[RangeInclusive <u32>; 1]>: {}",
131 size_of::<RangeSet <[RangeInclusive <u32>; 1]>>());
132 println!(" size of RangeSet <[RangeInclusive <u64>; 1]>: {}",
133 size_of::<RangeSet <[RangeInclusive <u64>; 1]>>());
134 println!(" size of RangeSet <[RangeInclusive <usize>; 1]>: {}",
135 size_of::<RangeSet <[RangeInclusive <usize>; 1]>>());
136
137 println!(" size of RangeSet <[RangeInclusive <u32>; 2]>: {}",
138 size_of::<RangeSet <[RangeInclusive <u32>; 2]>>());
139 println!(" size of RangeSet <[RangeInclusive <u16>; 2]>: {}",
140 size_of::<RangeSet <[RangeInclusive <u16>; 2]>>());
141 println!(" size of RangeSet <[RangeInclusive <u32>; 2]>: {}",
142 size_of::<RangeSet <[RangeInclusive <u32>; 2]>>());
143 println!(" size of RangeSet <[RangeInclusive <u64>; 2]>: {}",
144 size_of::<RangeSet <[RangeInclusive <u64>; 2]>>());
145 println!(" size of RangeSet <[RangeInclusive <usize>; 2]>: {}",
146 size_of::<RangeSet <[RangeInclusive <usize>; 2]>>());
147
148 println!(" size of RangeSet <[RangeInclusive <u32>; 4]>: {}",
149 size_of::<RangeSet <[RangeInclusive <u32>; 4]>>());
150 println!(" size of RangeSet <[RangeInclusive <u16>; 4]>: {}",
151 size_of::<RangeSet <[RangeInclusive <u16>; 4]>>());
152 println!(" size of RangeSet <[RangeInclusive <u32>; 4]>: {}",
153 size_of::<RangeSet <[RangeInclusive <u32>; 4]>>());
154 println!(" size of RangeSet <[RangeInclusive <u64>; 4]>: {}",
155 size_of::<RangeSet <[RangeInclusive <u64>; 4]>>());
156 println!(" size of RangeSet <[RangeInclusive <usize>; 4]>: {}",
157 size_of::<RangeSet <[RangeInclusive <usize>; 4]>>());
158
159 println!(" size of RangeSet <[RangeInclusive <u32>; 8]>: {}",
160 size_of::<RangeSet <[RangeInclusive <u32>; 8]>>());
161 println!(" size of RangeSet <[RangeInclusive <u16>; 8]>: {}",
162 size_of::<RangeSet <[RangeInclusive <u16>; 8]>>());
163 println!(" size of RangeSet <[RangeInclusive <u32>; 8]>: {}",
164 size_of::<RangeSet <[RangeInclusive <u32>; 8]>>());
165 println!(" size of RangeSet <[RangeInclusive <u64>; 8]>: {}",
166 size_of::<RangeSet <[RangeInclusive <u64>; 8]>>());
167 println!(" size of RangeSet <[RangeInclusive <usize>; 8]>: {}",
168 size_of::<RangeSet <[RangeInclusive <usize>; 8]>>());
169
170 println!(" size of RangeSet <[RangeInclusive <u32>; 16]>: {}",
171 size_of::<RangeSet <[RangeInclusive <u32>; 16]>>());
172 println!(" size of RangeSet <[RangeInclusive <u16>; 16]>: {}",
173 size_of::<RangeSet <[RangeInclusive <u16>; 16]>>());
174 println!(" size of RangeSet <[RangeInclusive <u32>; 16]>: {}",
175 size_of::<RangeSet <[RangeInclusive <u32>; 16]>>());
176 println!(" size of RangeSet <[RangeInclusive <u64>; 16]>: {}",
177 size_of::<RangeSet <[RangeInclusive <u64>; 16]>>());
178 println!(" size of RangeSet <[RangeInclusive <usize>; 16]>: {}",
179 size_of::<RangeSet <[RangeInclusive <usize>; 16]>>());
180
181 println!("...RangeSet report sizes");
182}
183
184impl<A, T> Default for RangeSet <A> where
194 A : smallvec::Array <Item=RangeInclusive <T>> + Eq + std::fmt::Debug,
195 T : PrimInt + std::fmt::Debug
196{
197 fn default() -> Self {
198 RangeSet::new()
199 }
200}
201
202impl <A, T> RangeSet <A> where
203 A : smallvec::Array <Item=RangeInclusive <T>> + Eq + std::fmt::Debug,
204 T : PrimInt + std::fmt::Debug
205{
206 #[inline]
208 pub fn new() -> Self {
209 RangeSet { ranges: SmallVec::new() }
210 }
211
212 #[inline]
215 pub fn with_capacity (capacity : usize) -> Self {
216 RangeSet { ranges: SmallVec::with_capacity (capacity) }
217 }
218
219 pub fn from_smallvec (ranges : SmallVec <A>) -> Option <Self> {
222 if valid_range_slice (ranges.as_slice()) {
223 Some (RangeSet { ranges })
224 } else {
225 None
226 }
227 }
228
229 pub unsafe fn from_raw_parts (ranges : SmallVec <A>) -> Self {
235 debug_assert!(valid_range_slice (ranges.as_slice()));
236 RangeSet { ranges }
237 }
238
239 pub fn from_valid_ranges <V : AsRef <[RangeInclusive <T>]>> (ranges : V)
242 -> Option <Self>
243 {
244 if valid_range_slice (&ranges) {
245 let ranges = SmallVec::from (ranges.as_ref());
246 Some (RangeSet { ranges })
247 } else {
248 None
249 }
250 }
251
252 pub fn from_ranges <V : AsRef <[RangeInclusive <T>]>> (ranges : V) -> Self {
257 let mut ret = RangeSet::new();
258 for range in ranges.as_ref() {
259 ret.insert_range_optimistic(range.clone());
260 }
261 ret
262 }
263
264 pub fn from_elements <V : AsRef <[T]>> (elements : V) -> Self {
285 let mut current_range : Option<(T, T)> = None;
286 let mut set = RangeSet::new();
287
288 for &element in elements.as_ref() {
289 current_range = if let Some((start, end)) = current_range {
291 if element == end.saturating_add (T::one()) {
292 Some((start, element))
293 } else {
294 set.insert_range_optimistic(start..=end);
295 Some((element, element))
296 }
297 } else {
298 Some((element, element))
299 };
300 }
301
302 if let Some((start, end)) = current_range {
303 set.insert_range_optimistic(start..=end);
304 }
305
306 set
307 }
308
309 #[inline]
311 pub fn is_empty (&self) -> bool {
312 self.ranges.is_empty()
313 }
314
315 #[inline]
323 pub fn len (&self) -> usize where T : num_traits::AsPrimitive <usize> {
324 self.ranges.iter().map (|r| r.end().as_() - r.start().as_() + 1).sum()
325 }
326
327 #[inline]
329 pub fn clear (&mut self) {
330 self.ranges.clear()
331 }
332
333 #[inline]
335 pub fn into_smallvec (self) -> SmallVec <A> {
336 self.ranges
337 }
338
339 pub fn contains (&self, element : T) -> bool {
362 self.contains_range(element..=element)
363 }
364
365 pub fn contains_range (&self, range : A::Item) -> bool {
389 self.contains_range_ref(&range)
390 }
391
392 pub fn is_superset (&self, other : &Self) -> bool {
407 other.is_subset(self)
408 }
409
410 pub fn is_subset (&self, other : &Self) -> bool {
425 self.ranges.iter().all(|range| other.contains_range_ref (range))
426 }
427
428 pub fn max (&self) -> Option <T> {
430 self.ranges.last().map(|r| *r.end())
431 }
432
433 pub fn min (&self) -> Option <T> {
435 self.ranges.first().map(|r| *r.start())
436 }
437
438 pub fn insert (&mut self, element : T) -> bool {
458 self.insert_range (element..=element).is_none()
459 }
460
461 pub fn remove (&mut self, element : T) -> bool {
485 self.remove_range (element..=element).is_some()
486 }
487
488 pub fn insert_range (&mut self, range : A::Item) -> Option <Self> {
499 if range.is_empty () { return None
501 }
502 if self.ranges.is_empty() { self.ranges.push (range);
504 return None
505 }
506 let before = Self::binary_search_before_proper (self, &range);
507 let after = Self::binary_search_after_proper (self, &range);
508 match (before, after) {
509 (None, None) => {
515 let isect = self.range_intersection (&range, 0..self.ranges.len());
516 let new_range =
517 std::cmp::min (*range.start(), *self.ranges[0].start())..=
518 std::cmp::max (*range.end(), *self.ranges[self.ranges.len()-1].end());
519 self.ranges.clear();
520 self.ranges.push (new_range);
521 if !isect.is_empty() {
522 Some (isect)
523 } else {
524 None
525 }
526 }
527 (Some (before), None) => {
529 if before+1 == self.ranges.len() { self.ranges.push (range);
531 None
532 } else { let isect = self.range_intersection (&range, before+1..self.ranges.len());
534 self.ranges[before+1] =
535 std::cmp::min (*range.start(), *self.ranges[before+1].start())..=
536 std::cmp::max (*range.end(), *self.ranges[self.ranges.len()-1].end());
537 self.ranges.truncate (before+2);
538 if !isect.is_empty() {
539 Some (isect)
540 } else {
541 None
542 }
543 }
544 }
545 (None, Some (after)) => {
547 if after == 0 { self.ranges.insert (0, range);
549 None
550 } else { let isect = self.range_intersection (&range, 0..after);
552 self.ranges[0] =
553 std::cmp::min (*range.start(), *self.ranges[0].start())..=
554 std::cmp::max (*range.end(), *self.ranges[after - 1].end());
555 self.ranges.as_mut_slice()[1..].rotate_left(after - 1);
556 let new_len = self.ranges.len() - after + 1;
557 self.ranges.truncate (new_len);
558 if !isect.is_empty() {
559 Some (isect)
560 } else {
561 None
562 }
563 }
564 }
565 (Some (before), Some (after)) => {
568 if before+1 == after { self.ranges.insert (before+1, range);
570 None
571 } else { let isect = self.range_intersection (&range, before+1..after);
573 self.ranges[before+1] =
574 std::cmp::min (*range.start(), *self.ranges[before+1].start())..=
575 std::cmp::max (*range.end(), *self.ranges[after-1].end());
576 if 1 < after - before - 1 {
578 self.ranges.as_mut_slice()[(before + 2)..].rotate_left (after - before - 2);
579 let new_len = self.ranges.len() - (after - before - 2);
580 self.ranges.truncate (new_len);
581 }
582 if !isect.is_empty() {
583 Some (isect)
584 } else {
585 None
586 }
587 }
588 }
589 }
590 } fn insert_range_optimistic (&mut self, range : A::Item) {
595 if let Some(last) = self.ranges.last() {
596 if last.end().saturating_add (T::one()) < *range.start() {
597 self.ranges.push(range);
598 } else {
599 self.insert_range(range);
601 }
602 } else {
603 self.ranges.push(range);
605 }
606 }
607
608 pub fn remove_range (&mut self, range : A::Item) -> Option <Self> {
621 if self.ranges.is_empty() || range.is_empty() { return None
623 }
624 let before = Self::binary_search_before (self, &range);
625 let after = Self::binary_search_after (self, &range);
626 let (isect_first, isect_last) = match (before, after) {
628 (None, None) => (0, self.ranges.len()),
629 (Some (before), None) => (before+1, self.ranges.len()),
630 (None, Some (after)) => (0, after),
631 (Some (before), Some (after)) => (before+1, after)
632 };
633 let isect = self.range_intersection (&range, isect_first..isect_last);
634 if isect.is_empty() {
635 return None
636 }
637
638 if isect_last - isect_first == 1 {
640 let single_range = self.ranges[isect_first].clone();
641 if single_range.start() < range.start() && range.end() < single_range.end() {
642 let left = *single_range.start()..=*range.start() - T::one();
643 let right = *range.end() + T::one()..=*single_range.end();
644 self.ranges[isect_first] = right;
645 self.ranges.insert (isect_first, left);
646 return Some (isect)
647 }
648 }
649
650 let first = self.ranges[isect_first].clone();
653 let last = self.ranges[isect_last-1].clone();
654
655 let (remove_first, remove_last) = if
656 range.start() <= first.start() && last.end() <= range.end()
658 {
659 (isect_first, isect_last)
660 } else if first.start() < range.start() && last.end() <= range.end() {
662 self.ranges[isect_first] =
663 *self.ranges[isect_first].start()..=*range.start() - T::one();
664 (isect_first+1, isect_last)
665 } else if range.start() <= first.start() && range.end() < last.end() {
667 self.ranges[isect_last-1] =
668 *range.end() + T::one()..=*self.ranges[isect_last-1].end();
669 (isect_first, isect_last-1)
670 } else {
672 debug_assert!(first.start() < range.start() && range.end() < last.end());
673 self.ranges[isect_first] =
674 *self.ranges[isect_first].start()..=*range.start() - T::one();
675 self.ranges[isect_last-1] =
676 *range.end() + T::one()..=*self.ranges[isect_last-1].end();
677 (isect_first+1, isect_last-1)
678 };
679 for (i, index) in (remove_last..self.ranges.len()).enumerate() {
681 self.ranges[remove_first+i] = self.ranges[index].clone();
682 }
683 let new_len = self.ranges.len() - (remove_last - remove_first);
684 self.ranges.truncate (new_len);
685
686 debug_assert!(self.is_valid());
687 Some (isect)
688 }
689
690 pub fn union (&self, other : &Self) -> Self where A : Clone {
704 let mut new = (*self).clone();
705 other.ranges.iter().cloned().for_each (|r| { new.insert_range (r); });
706 new
707 }
708
709 #[expect(mismatched_lifetime_syntaxes)]
713 pub fn iter (&self) -> Iter <A, T> {
714 Iter {
715 range_set: self,
716 range_index: 0,
717 range: T::one()..=T::zero()
718 }
719 }
720
721 #[inline]
723 pub fn spilled (&self) -> bool {
724 self.ranges.spilled()
725 }
726
727 #[inline]
729 pub fn shrink_to_fit (&mut self) {
730 self.ranges.shrink_to_fit()
731 }
732
733 fn binary_search_before (&self, range : &A::Item) -> Option <usize> {
736 let mut before = 0;
737 let mut after = self.ranges.len();
738 let mut found = false;
739 while before != after {
740 let i = before + (after - before) / 2;
741 let last = before;
742 if self.ranges[i].end() < range.start() {
743 found = true;
744 before = i;
745 if before == last {
746 break
747 }
748 } else {
749 after = i
750 }
751 }
752 if found {
753 Some (before)
754 } else {
755 None
756 }
757 }
758
759 fn binary_search_after (&self, range : &A::Item) -> Option <usize> {
762 let mut before = 0;
763 let mut after = self.ranges.len();
764 let mut found = false;
765 while before != after {
766 let i = before + (after - before) / 2;
767 let last = before;
768 if range.end() < self.ranges[i].start() {
769 found = true;
770 after = i;
771 } else {
772 before = i;
773 if before == last {
774 break
775 }
776 }
777 }
778 if found {
779 Some (after)
780 } else {
781 None
782 }
783 }
784
785 fn binary_search_before_proper (&self, range : &A::Item) -> Option <usize> {
788 let mut before = 0;
789 let mut after = self.ranges.len();
790 let mut found = false;
791 while before != after {
792 let i = before + (after - before) / 2;
793 let last = before;
794 if self.ranges[i].end().saturating_add (T::one()) < *range.start() {
795 found = true;
796 before = i;
797 if before == last {
798 break
799 }
800 } else {
801 after = i
802 }
803 }
804 if found {
805 Some (before)
806 } else {
807 None
808 }
809 }
810
811 fn binary_search_after_proper (&self, range : &A::Item) -> Option <usize> {
814 let mut before = 0;
815 let mut after = self.ranges.len();
816 let mut found = false;
817 while before != after {
818 let i = before + (after - before) / 2;
819 let last = before;
820 if range.end().saturating_add (T::one()) < *self.ranges[i].start() {
821 found = true;
822 after = i;
823 } else {
824 before = i;
825 if before == last {
826 break
827 }
828 }
829 }
830 if found {
831 Some (after)
832 } else {
833 None
834 }
835 }
836
837 fn contains_range_ref (&self, range : &A::Item) -> bool {
840 if range.is_empty() {
841 return true
842 }
843 if self.ranges.is_empty() {
844 return false
845 }
846 let test_range = if let Some(before) = self.binary_search_before(range) {
848 if let Some(next) = self.ranges.get(before + 1) {
851 next
852 } else {
853 return false
855 }
856 } else {
857 &self.ranges[0]
861 };
862 test_range.contains(range.start()) && test_range.contains(range.end())
864 }
865
866 fn range_intersection (&self, range : &A::Item, range_range : std::ops::Range <usize>)
868 -> Self
869 {
870 let mut isect = RangeSet::new();
871 for i in range_range {
872 let r = &self.ranges[i];
873 let rsect = intersection (range, r);
874 if !rsect.is_empty() {
875 isect.ranges.push (rsect);
876 }
877 }
878 debug_assert!(isect.is_valid());
879 isect
880 }
881
882 #[inline]
888 fn is_valid (&self) -> bool {
889 valid_range_slice (&self.ranges)
890 }
891}
892
893impl <A, T> From <RangeInclusive <T>> for RangeSet <A> where
894 A : smallvec::Array <Item=RangeInclusive <T>> + Eq + std::fmt::Debug,
895 T : PrimInt + std::fmt::Debug
896{
897 fn from (range : RangeInclusive <T>) -> Self {
898 let ranges = {
899 let mut v = SmallVec::new();
900 v.push (range);
901 v
902 };
903 RangeSet { ranges }
904 }
905}
906
907impl <A, T> AsRef <SmallVec <A>> for RangeSet <A> where
908 A : smallvec::Array <Item=RangeInclusive <T>> + Eq + std::fmt::Debug,
909 T : PrimInt + std::fmt::Debug
910{
911 fn as_ref (&self) -> &SmallVec <A> {
912 &self.ranges
913 }
914}
915
916impl<A, B> PartialEq<RangeSet<B>> for RangeSet<A> where
920 A : smallvec::Array + Eq + std::fmt::Debug,
921 A::Item : Clone + Eq + std::fmt::Debug,
922 B : smallvec::Array<Item = A::Item> + Eq + std::fmt::Debug
923{
924 fn eq(&self, other : &RangeSet<B>) -> bool {
925 self.ranges.eq(&other.ranges)
926 }
927}
928
929impl <A, T> Iterator for Iter <'_, A, T> where
930 A : smallvec::Array <Item=RangeInclusive <T>> + Eq + std::fmt::Debug,
931 T : PrimInt + std::fmt::Debug,
932 RangeInclusive <T> : Clone + Iterator <Item=T>
933{
934 type Item = T;
935 fn next (&mut self) -> Option <Self::Item> {
936 if let Some (t) = self.range.next() {
937 Some (t)
938 } else if self.range_index < self.range_set.ranges.len() {
939 self.range = self.range_set.ranges[self.range_index].clone();
940 debug_assert!(!self.range.is_empty());
941 self.range_index += 1;
942 self.range.next()
943 } else {
944 None
945 }
946 }
947}
948
949#[cfg(feature = "derive_serdes")]
950impl<A, T> serde::Serialize for RangeSet<A> where
951 A : smallvec::Array <Item=RangeInclusive <T>> + Eq + std::fmt::Debug,
952 T : PrimInt + std::fmt::Debug + serde::Serialize,
953{
954 fn serialize <S: serde::Serializer> (&self, serializer: S) -> Result<S::Ok, S::Error> {
955 self.ranges.serialize(serializer)
956 }
957}
958
959#[cfg(feature = "derive_serdes")]
960impl<'de, A, T> serde::Deserialize<'de> for RangeSet<A> where
961 A : smallvec::Array <Item=RangeInclusive <T>> + Eq + std::fmt::Debug,
962 T : PrimInt + std::fmt::Debug + serde::Deserialize<'de>,
963{
964 fn deserialize <D: serde::Deserializer<'de>> (deserializer: D)
965 -> Result<Self, D::Error>
966 {
967 let ranges = SmallVec::deserialize(deserializer)?;
968
969 Ok(RangeSet { ranges })
970 }
971}
972
973pub const DEFAULT_RANGE_COUNT: usize = 4;
979
980#[macro_export]
1029macro_rules! range_set {
1030 () => {
1032 $crate::RangeSet::<[core::ops::RangeInclusive<_>; $crate::DEFAULT_RANGE_COUNT]>::new()
1033 };
1034 ( ; $len:expr ) => {
1035 $crate::RangeSet::<[core::ops::RangeInclusive<_>; $len]>::new()
1036 };
1037
1038 ( $( $num:tt ),+ ) => {
1040 $crate::range_set![ $( $num ),+ ; $crate::DEFAULT_RANGE_COUNT ]
1041 };
1042 ( $( $num:tt ),+ ; $len:expr ) => {
1043 $crate::RangeSet::<[core::ops::RangeInclusive<_>; $len]>::from_elements([ $( $num ),+ ])
1044 };
1045
1046 ( $( $start:tt $( ..= $end:tt )? $( as $range_keyword:tt )? ),+ ) => {
1048 $crate::range_set![ $( $start $(..= $end )? ),+ ; $crate::DEFAULT_RANGE_COUNT ]
1049 };
1050 ( $( $start:tt $( ..= $end:tt )? $( as $range_keyword:tt )? ),+ ; $len:expr ) => {
1051 $crate::RangeSet::<[core::ops::RangeInclusive<_>; $len]>::from_ranges([ $( $crate::__range_set_helper!($start $( ..= $end )? $( as $range_keyword )? ) ),+ ])
1052 };
1053}
1054
1055#[macro_export]
1057#[doc(hidden)]
1058macro_rules! __range_set_helper {
1059 ( $num:tt ) => { { let val = $num; val ..= val } };
1060 ( $start:tt ..= $end:tt ) => ( $start ..= $end );
1061 ( $range_expr:tt as range) => ( $range_expr );
1062}
1063
1064#[cfg(test)]
1065mod tests {
1066 use std::ops::RangeInclusive;
1067 use crate::RangeSet;
1068
1069 #[test]
1070 fn merge_multiple() {
1071 let mut range_set: RangeSet<[RangeInclusive<u32>; 2]> = RangeSet::new();
1072 range_set.insert_range(3..=3);
1073 range_set.insert_range(5..=5);
1074 range_set.insert_range(7..=7);
1075 assert_eq!(
1076 range_set.insert_range(1..=9),
1077 {
1078 let mut r = RangeSet::from(3..=3);
1079 r.insert_range(5..=5);
1080 r.insert_range(7..=7);
1081 Some(r)
1082 }
1083 );
1084
1085 assert_eq!(range_set.ranges.into_vec(), vec![1..=9]);
1086 }
1087
1088 #[test]
1089 fn merge_multiple_then_gap() {
1090 let mut range_set: RangeSet<[RangeInclusive<u32>; 2]> = RangeSet::new();
1091 range_set.insert_range(3..=3);
1092 range_set.insert_range(5..=5);
1093 range_set.insert_range(9..=9);
1094 assert_eq!(
1095 range_set.insert_range(1..=7),
1096 {
1097 let mut r = RangeSet::from(3..=3);
1098 r.insert_range(5..=5);
1099 Some(r)
1100 }
1101 );
1102
1103 assert_eq!(range_set.ranges.into_vec(), vec![1..=7, 9..=9]);
1104 }
1105
1106 #[test]
1107 fn gap_then_merge_multiple() {
1108 let mut range_set: RangeSet<[RangeInclusive<u32>; 2]> = RangeSet::new();
1109 range_set.insert_range(1..=1);
1110 range_set.insert_range(5..=5);
1111 range_set.insert_range(7..=7);
1112 assert_eq!(
1113 range_set.insert_range(3..=9),
1114 {
1115 let mut r = RangeSet::from(5..=5);
1116 r.insert_range(7..=7);
1117 Some(r)
1118 }
1119 );
1120
1121 assert_eq!(range_set.ranges.into_vec(), vec![1..=1, 3..=9]);
1122 }
1123
1124 #[test]
1125 fn gap_then_merge_multiple_then_gap() {
1126 let mut range_set: RangeSet<[RangeInclusive<u32>; 2]> = RangeSet::new();
1127 range_set.insert_range(1..=1);
1128 range_set.insert_range(3..=3);
1129 range_set.insert_range(5..=5);
1130 range_set.insert_range(7..=7);
1131 range_set.insert_range(9..=9);
1132 assert_eq!(
1133 range_set.insert_range(3..=7),
1134 {
1135 let mut r = RangeSet::from(3..=3);
1136 r.insert_range(5..=5);
1137 r.insert_range(7..=7);
1138 Some(r)
1139 }
1140 );
1141
1142 assert_eq!(range_set.ranges.into_vec(), vec![1..=1, 3..=7, 9..=9]);
1143 }
1144
1145 #[test]
1146 fn range_set_macro_empty() {
1147 assert_eq!(range_set![; 3], RangeSet::<[RangeInclusive<u8>; 3]>::new());
1148 assert_eq!(range_set![], RangeSet::<[RangeInclusive<u8>; 4]>::new());
1149 }
1150
1151 #[test]
1152 fn range_set_macro_nums() {
1153 let case1 = RangeSet::<[RangeInclusive<u8>; 3]>::from_valid_ranges (
1154 [0..=0, 2..=5]
1155 ).unwrap();
1156 let case2 = RangeSet::<[RangeInclusive<u8>; 4]>::from_valid_ranges (
1157 [1..=3, 6..=6, 8..=10]
1158 ).unwrap();
1159 const SOME_CONST: u8 = 5;
1160 let not_token_tree = |x: u8| x;
1161
1162 assert_eq!(range_set![0, 2, 3, 4, 5; 3], case1);
1164 assert_eq!(range_set![0, 2, (1 + 2), 4, SOME_CONST; 3], case1);
1165 assert_eq!(range_set![0, 2, (not_token_tree(3)), 4, 5; 3], case1);
1166
1167 assert_eq!(range_set![1, 2, 3, 6, 8, 9, 10; 4], case2);
1168 assert_eq!(range_set![1, 2, 3, (3 * 2), 8, 9, 10], case2);
1169
1170 let mut counter = 0;
1171 let mut call_only_once = |x: u8| { counter += 1; x };
1172 assert_eq!(range_set![0, 2, (call_only_once(3)), 4, 5; 3], case1);
1173 assert_eq!(counter, 1);
1174 }
1175
1176 #[expect(unused_parens)]
1179 #[test]
1180 fn range_set_macro_mixed() {
1181 let case1 = RangeSet::<[RangeInclusive<u8>; 3]>::from_valid_ranges ([0..=0, 2..=5])
1182 .unwrap();
1183 let case2 = RangeSet::<[RangeInclusive<u8>; 4]>::from_valid_ranges (
1184 [1..=3, 6..=15, 40..=40, 42..=50]
1185 ).unwrap();
1186 const SOME_CONST: u8 = 40;
1187 let not_token_tree = |x: u8| x;
1188
1189 assert_eq!(range_set![0, 2..=5; 3], case1);
1190 assert_eq!(range_set![0, (not_token_tree(2))..=5; 3], case1);
1191
1192 assert_eq!(range_set![1..=3, 6..=15, 40, 42..=50; 4], case2);
1193 assert_eq!(range_set![1, 2, 3, 6..=15, 40, 42..=50], case2);
1194 assert_eq!(range_set![1..=3, (3+3)..=15, SOME_CONST, 42..=50; 4], case2);
1195 assert_eq!(range_set![1..=3, 6..=15, 40..=40, (not_token_tree(42))..=50; 4], case2);
1196
1197 let mut counter = 0;
1198 let mut call_only_once = |x: u8| { counter += 1; x };
1199 assert_eq!(range_set![1..=3, 6..=15, (call_only_once(40)), 42..=50; 4], case2);
1200 assert_eq!(counter, 1);
1201
1202 assert_eq!(range_set![0, 2, 3, 5; 8],
1203 RangeSet::<[RangeInclusive<u8>; 8]>::from_valid_ranges ([0..=0, 2..=3, 5..=5])
1204 .unwrap());
1205 assert_eq!(range_set![0..=0, 2..=2, (not_token_tree(4) + 1)..=5],
1206 RangeSet::<[RangeInclusive<u8>; 4]>::from_valid_ranges ([0..=0, 2..=2, 5..=5])
1207 .unwrap());
1208 }
1209
1210 #[test]
1211 fn max() {
1212 let mut set = RangeSet::<[RangeInclusive <u32>; 2]>::new();
1213 assert_eq!(set.max(), None);
1214
1215 set.insert_range(4..=5);
1216 assert_eq!(set.max(), Some(5));
1217
1218 set.insert(21);
1219 assert_eq!(set.max(), Some(21));
1220
1221 set.insert_range(6..=13);
1222 assert_eq!(set.max(), Some(21));
1223
1224 set.remove(21);
1225 assert_eq!(set.max(), Some(13));
1226 }
1227
1228 #[test]
1229 fn min() {
1230 let mut set = RangeSet::<[RangeInclusive <u32>; 2]>::new();
1231 assert_eq!(set.min(), None);
1232
1233 set.insert_range(4..=5);
1234 assert_eq!(set.min(), Some(4));
1235
1236 set.insert(2);
1237 assert_eq!(set.min(), Some(2));
1238
1239 set.insert_range(6..=13);
1240 assert_eq!(set.min(), Some(2));
1241
1242 set.remove_range(2..=4);
1243 assert_eq!(set.min(), Some(5));
1244 }
1245
1246 #[test]
1247 fn random() {
1248 use rand::{RngExt, SeedableRng};
1249 let mut rng = rand_xorshift::XorShiftRng::seed_from_u64 (0);
1250 let mut s = RangeSet::<[RangeInclusive <u8>; 4]>::new();
1251 for _ in 0..10000 {
1252 s.insert_range (rng.random()..=rng.random());
1253 s.insert (rng.random());
1254 s.remove_range (rng.random()..=rng.random());
1255 s.remove (rng.random());
1256 }
1257 println!("s: {s:?}");
1258 }
1259}