1use core::borrow::Borrow;
2use core::fmt::{self, Debug};
3use core::iter::FromIterator;
4use core::ops::{BitAnd, BitOr, Range};
5use core::prelude::v1::*;
6
7#[cfg(feature = "serde1")]
8use core::marker::PhantomData;
9#[cfg(feature = "serde1")]
10use serde::{
11 de::{Deserialize, Deserializer, SeqAccess, Visitor},
12 ser::{Serialize, Serializer},
13};
14
15use crate::RangeMap;
16
17pub type Intersection<'a, T> = crate::operations::Intersection<'a, Range<T>, Iter<'a, T>>;
19
20pub type Union<'a, T> = crate::operations::Union<'a, Range<T>, Iter<'a, T>>;
22
23#[derive(Clone, Hash, Eq, PartialEq, PartialOrd, Ord)]
24pub struct RangeSet<T> {
31 rm: RangeMap<T, ()>,
32}
33
34impl<T> Default for RangeSet<T> {
35 fn default() -> Self {
36 Self {
37 rm: RangeMap::default(),
38 }
39 }
40}
41
42impl<T> RangeSet<T>
43where
44 T: Ord + Clone,
45{
46 #[cfg(feature = "const_fn")]
48 pub const fn new() -> Self {
49 RangeSet {
50 rm: RangeMap::new(),
51 }
52 }
53
54 #[cfg(not(feature = "const_fn"))]
56 pub fn new() -> Self {
57 RangeSet {
58 rm: RangeMap::new(),
59 }
60 }
61
62 pub fn get(&self, value: &T) -> Option<&Range<T>> {
64 self.rm.get_key_value(value).map(|(range, _)| range)
65 }
66
67 pub fn contains(&self, value: &T) -> bool {
69 self.rm.contains_key(value)
70 }
71
72 pub fn iter(&self) -> Iter<'_, T> {
75 Iter {
76 inner: self.rm.iter(),
77 }
78 }
79
80 pub fn clear(&mut self) {
82 self.rm.clear();
83 }
84
85 pub fn len(&self) -> usize {
87 self.rm.len()
88 }
89
90 pub fn is_empty(&self) -> bool {
92 self.rm.is_empty()
93 }
94
95 pub fn intersection<'a>(&'a self, other: &'a Self) -> Intersection<'a, T> {
97 Intersection::new(self.iter(), other.iter())
98 }
99
100 pub fn union<'a>(&'a self, other: &'a Self) -> Union<'a, T> {
102 Union::new(self.iter(), other.iter())
103 }
104
105 pub fn insert(&mut self, range: Range<T>) {
115 self.rm.insert(range, ());
116 }
117
118 pub fn remove(&mut self, range: Range<T>) {
128 self.rm.remove(range);
129 }
130
131 pub fn gaps<'a>(&'a self, outer_range: &'a Range<T>) -> Gaps<'a, T> {
141 Gaps {
142 inner: self.rm.gaps(outer_range),
143 }
144 }
145
146 pub fn overlapping<R: Borrow<Range<T>>>(&self, range: R) -> Overlapping<T, R> {
151 Overlapping {
152 inner: self.rm.overlapping(range),
153 }
154 }
155
156 pub fn overlaps(&self, range: &Range<T>) -> bool {
159 self.overlapping(range).next().is_some()
160 }
161
162 pub fn first(&self) -> Option<&Range<T>> {
165 self.rm.first_range_value().map(|(range, _)| range)
166 }
167
168 pub fn last(&self) -> Option<&Range<T>> {
171 self.rm.last_range_value().map(|(range, _)| range)
172 }
173}
174
175pub struct Iter<'a, T> {
182 inner: super::map::Iter<'a, T, ()>,
183}
184
185impl<'a, T> Iterator for Iter<'a, T> {
186 type Item = &'a Range<T>;
187
188 fn next(&mut self) -> Option<Self::Item> {
189 self.inner.next().map(|(range, _)| range)
190 }
191
192 fn size_hint(&self) -> (usize, Option<usize>) {
193 self.inner.size_hint()
194 }
195}
196
197impl<'a, K> DoubleEndedIterator for Iter<'a, K>
198where
199 K: 'a,
200{
201 fn next_back(&mut self) -> Option<Self::Item> {
202 self.inner.next_back().map(|(range, _)| range)
203 }
204}
205
206pub struct IntoIter<T> {
213 inner: super::map::IntoIter<T, ()>,
214}
215
216impl<T> IntoIterator for RangeSet<T> {
217 type Item = Range<T>;
218 type IntoIter = IntoIter<T>;
219 fn into_iter(self) -> Self::IntoIter {
220 IntoIter {
221 inner: self.rm.into_iter(),
222 }
223 }
224}
225
226impl<T> Iterator for IntoIter<T> {
227 type Item = Range<T>;
228 fn next(&mut self) -> Option<Range<T>> {
229 self.inner.next().map(|(range, _)| range)
230 }
231 fn size_hint(&self) -> (usize, Option<usize>) {
232 self.inner.size_hint()
233 }
234}
235
236impl<K> DoubleEndedIterator for IntoIter<K> {
237 fn next_back(&mut self) -> Option<Self::Item> {
238 self.inner.next_back().map(|(range, _)| range)
239 }
240}
241
242impl<T: Debug> Debug for RangeSet<T>
246where
247 T: Ord + Clone,
248{
249 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
250 f.debug_set().entries(self.iter()).finish()
251 }
252}
253
254impl<T> FromIterator<Range<T>> for RangeSet<T>
255where
256 T: Ord + Clone,
257{
258 fn from_iter<I: IntoIterator<Item = Range<T>>>(iter: I) -> Self {
259 let mut range_set = RangeSet::new();
260 range_set.extend(iter);
261 range_set
262 }
263}
264
265impl<T> Extend<Range<T>> for RangeSet<T>
266where
267 T: Ord + Clone,
268{
269 fn extend<I: IntoIterator<Item = Range<T>>>(&mut self, iter: I) {
270 iter.into_iter().for_each(move |range| {
271 self.insert(range);
272 })
273 }
274}
275
276#[cfg(feature = "serde1")]
277impl<T> Serialize for RangeSet<T>
278where
279 T: Ord + Clone + Serialize,
280{
281 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
282 where
283 S: Serializer,
284 {
285 use serde::ser::SerializeSeq;
286 let mut seq = serializer.serialize_seq(Some(self.rm.btm.len()))?;
287 for range in self.iter() {
288 seq.serialize_element(&(&range.start, &range.end))?;
289 }
290 seq.end()
291 }
292}
293
294#[cfg(feature = "serde1")]
295impl<'de, T> Deserialize<'de> for RangeSet<T>
296where
297 T: Ord + Clone + Deserialize<'de>,
298{
299 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
300 where
301 D: Deserializer<'de>,
302 {
303 deserializer.deserialize_seq(RangeSetVisitor::new())
304 }
305}
306
307#[cfg(feature = "serde1")]
308struct RangeSetVisitor<T> {
309 marker: PhantomData<fn() -> RangeSet<T>>,
310}
311
312#[cfg(feature = "serde1")]
313impl<T> RangeSetVisitor<T> {
314 fn new() -> Self {
315 RangeSetVisitor {
316 marker: PhantomData,
317 }
318 }
319}
320
321#[cfg(feature = "serde1")]
322impl<'de, T> Visitor<'de> for RangeSetVisitor<T>
323where
324 T: Ord + Clone + Deserialize<'de>,
325{
326 type Value = RangeSet<T>;
327
328 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
329 formatter.write_str("RangeSet")
330 }
331
332 fn visit_seq<A>(self, mut access: A) -> Result<Self::Value, A::Error>
333 where
334 A: SeqAccess<'de>,
335 {
336 let mut range_set = RangeSet::new();
337 while let Some((start, end)) = access.next_element()? {
338 range_set.insert(start..end);
339 }
340 Ok(range_set)
341 }
342}
343
344pub struct Gaps<'a, T> {
351 inner: crate::map::Gaps<'a, T, ()>,
352}
353
354impl<'a, T> core::iter::FusedIterator for Gaps<'a, T> where T: Ord + Clone {}
356
357impl<'a, T> Iterator for Gaps<'a, T>
358where
359 T: Ord + Clone,
360{
361 type Item = Range<T>;
362
363 fn next(&mut self) -> Option<Self::Item> {
364 self.inner.next()
365 }
366}
367
368pub struct Overlapping<'a, T, R: Borrow<Range<T>> = &'a Range<T>> {
376 inner: crate::map::Overlapping<'a, T, (), R>,
377}
378
379impl<'a, T, R: Borrow<Range<T>>> core::iter::FusedIterator for Overlapping<'a, T, R> where
381 T: Ord + Clone
382{
383}
384
385impl<'a, T, R: Borrow<Range<T>>> Iterator for Overlapping<'a, T, R>
386where
387 T: Ord + Clone,
388{
389 type Item = &'a Range<T>;
390
391 fn next(&mut self) -> Option<Self::Item> {
392 self.inner.next().map(|(k, _v)| k)
393 }
394}
395
396impl<'a, T, R: Borrow<Range<T>>> DoubleEndedIterator for Overlapping<'a, T, R>
397where
398 T: Ord + Clone,
399{
400 fn next_back(&mut self) -> Option<Self::Item> {
401 self.inner.next_back().map(|(k, _v)| k)
402 }
403}
404
405impl<T: Ord + Clone> BitAnd for &RangeSet<T> {
406 type Output = RangeSet<T>;
407
408 fn bitand(self, other: Self) -> Self::Output {
409 self.intersection(other).collect()
410 }
411}
412
413impl<T: Ord + Clone> BitOr for &RangeSet<T> {
414 type Output = RangeSet<T>;
415
416 fn bitor(self, other: Self) -> Self::Output {
417 self.union(other).collect()
418 }
419}
420
421impl<T: Ord + Clone, const N: usize> From<[Range<T>; N]> for RangeSet<T> {
422 fn from(value: [Range<T>; N]) -> Self {
423 let mut set = Self::new();
424 for value in IntoIterator::into_iter(value) {
425 set.insert(value);
426 }
427 set
428 }
429}
430
431#[macro_export]
440macro_rules! range_set {
441 ($($range:expr),* $(,)?) => {{
442 $crate::RangeSet::from([$($range),*])
443 }};
444}
445
446#[cfg(test)]
447mod tests {
448 use super::*;
449 use alloc as std;
450 use alloc::{format, vec, vec::Vec};
451 use proptest::prelude::*;
452 use test_strategy::proptest;
453
454 impl<T> Arbitrary for RangeSet<T>
455 where
456 T: Ord + Clone + Debug + Arbitrary + 'static,
457 {
458 type Parameters = ();
459 type Strategy = BoxedStrategy<Self>;
460
461 fn arbitrary_with(_parameters: Self::Parameters) -> Self::Strategy {
462 any::<Vec<Range<T>>>()
463 .prop_map(|ranges| {
464 ranges
465 .into_iter()
466 .filter(|range| range.start != range.end)
467 .collect::<RangeSet<T>>()
468 })
469 .boxed()
470 }
471 }
472
473 #[proptest]
474 fn test_first(set: RangeSet<u64>) {
475 assert_eq!(set.first(), set.iter().min_by_key(|range| range.start));
476 }
477
478 #[proptest]
479 #[allow(clippy::len_zero)]
480 fn test_len(mut map: RangeSet<u64>) {
481 assert_eq!(map.len(), map.iter().count());
482 assert_eq!(map.is_empty(), map.len() == 0);
483 map.clear();
484 assert_eq!(map.len(), 0);
485 assert!(map.is_empty());
486 assert_eq!(map.iter().count(), 0);
487 }
488
489 #[proptest]
490 fn test_last(set: RangeSet<u64>) {
491 assert_eq!(set.last(), set.iter().max_by_key(|range| range.end));
492 }
493
494 #[proptest]
495 fn test_iter_reversible(set: RangeSet<u64>) {
496 let forward: Vec<_> = set.iter().collect();
497 let mut backward: Vec<_> = set.iter().rev().collect();
498 backward.reverse();
499 assert_eq!(forward, backward);
500 }
501
502 #[proptest]
503 fn test_into_iter_reversible(set: RangeSet<u64>) {
504 let forward: Vec<_> = set.clone().into_iter().collect();
505 let mut backward: Vec<_> = set.into_iter().rev().collect();
506 backward.reverse();
507 assert_eq!(forward, backward);
508 }
509
510 #[proptest]
511 fn test_overlapping_reversible(set: RangeSet<u64>, range: Range<u64>) {
512 let forward: Vec<_> = set.overlapping(&range).collect();
513 let mut backward: Vec<_> = set.overlapping(&range).rev().collect();
514 backward.reverse();
515 assert_eq!(forward, backward);
516 }
517
518 fn filter_ranges<T: Ord>(ranges: Vec<Range<T>>) -> Vec<Range<T>> {
520 ranges
521 .into_iter()
522 .filter(|range| range.start != range.end)
523 .collect()
524 }
525
526 #[proptest]
527 fn test_arbitrary_set_u8(ranges: Vec<Range<u8>>) {
528 let ranges = filter_ranges(ranges);
529 let set = ranges.iter().fold(RangeSet::new(), |mut set, range| {
530 set.insert(range.clone());
531 set
532 });
533
534 for value in 0..u8::MAX {
535 assert_eq!(
536 set.contains(&value),
537 ranges.iter().any(|range| range.contains(&value))
538 );
539 }
540 }
541
542 #[proptest]
543 #[allow(deprecated)]
544 fn test_hash(left: RangeSet<u64>, right: RangeSet<u64>) {
545 use core::hash::{Hash, Hasher, SipHasher};
546
547 let hash = |set: &RangeSet<_>| {
548 let mut hasher = SipHasher::new();
549 set.hash(&mut hasher);
550 hasher.finish()
551 };
552
553 if left == right {
554 assert!(
555 hash(&left) == hash(&right),
556 "if two values are equal, their hash must be equal"
557 );
558 }
559
560 if hash(&left) != hash(&right) {
562 assert!(
563 left != right,
564 "if two value's hashes are not equal, they must not be equal"
565 );
566 }
567 }
568
569 #[proptest]
570 fn test_ord(left: RangeSet<u64>, right: RangeSet<u64>) {
571 assert_eq!(
572 left == right,
573 left.cmp(&right).is_eq(),
574 "ordering and equality must match"
575 );
576 assert_eq!(
577 left.cmp(&right),
578 left.partial_cmp(&right).unwrap(),
579 "ordering is total for ordered parameters"
580 );
581 }
582
583 #[test]
584 fn test_from_array() {
585 let mut set = RangeSet::new();
586 set.insert(0..100);
587 set.insert(200..300);
588 assert_eq!(set, RangeSet::from([0..100, 200..300]));
589 }
590
591 #[test]
592 fn test_macro() {
593 assert_eq!(range_set![], RangeSet::<i64>::new());
594 assert_eq!(
595 range_set![0..100, 200..300, 400..500],
596 [0..100, 200..300, 400..500].iter().cloned().collect(),
597 );
598 }
599
600 #[proptest]
601 fn test_union_overlaps_u8(left: RangeSet<u8>, right: RangeSet<u8>) {
602 let mut union = RangeSet::new();
603 for range in left.union(&right) {
604 assert!(union.overlapping(&range).next().is_none());
606 union.insert(range);
607 }
608 }
609
610 #[proptest]
611 fn test_union_contains_u8(left: RangeSet<u8>, right: RangeSet<u8>) {
612 let union = (&left) | (&right);
613
614 for value in 0..u8::MAX {
616 assert_eq!(
617 union.contains(&value),
618 left.contains(&value) || right.contains(&value)
619 );
620 }
621 }
622
623 #[proptest]
624 fn test_intersection_contains_u8(left: RangeSet<u8>, right: RangeSet<u8>) {
625 let intersection = (&left) & (&right);
626
627 for value in 0..u8::MAX {
629 assert_eq!(
630 intersection.contains(&value),
631 left.contains(&value) && right.contains(&value)
632 );
633 }
634 }
635
636 #[proptest]
637 fn test_intersection_overlaps_u8(left: RangeSet<u8>, right: RangeSet<u8>) {
638 let mut union = RangeSet::new();
639 for range in left.intersection(&right) {
640 assert!(union.overlapping(&range).next().is_none());
643 union.insert(range);
644 }
645 }
646
647 trait RangeSetExt<T> {
648 fn to_vec(&self) -> Vec<Range<T>>;
649 }
650
651 impl<T> RangeSetExt<T> for RangeSet<T>
652 where
653 T: Ord + Clone,
654 {
655 fn to_vec(&self) -> Vec<Range<T>> {
656 self.iter().cloned().collect()
657 }
658 }
659
660 #[test]
661 fn empty_set_is_empty() {
662 let range_set: RangeSet<u32> = RangeSet::new();
663 assert_eq!(range_set.to_vec(), vec![]);
664 }
665
666 #[test]
667 fn insert_into_empty_map() {
668 let mut range_set: RangeSet<u32> = RangeSet::new();
669 range_set.insert(0..50);
670 assert_eq!(range_set.to_vec(), vec![0..50]);
671 }
672
673 #[test]
674 fn remove_partially_overlapping() {
675 let mut range_set: RangeSet<u32> = RangeSet::new();
676 range_set.insert(0..50);
677 range_set.remove(25..75);
678 assert_eq!(range_set.to_vec(), vec![0..25]);
679 }
680
681 #[test]
682 fn gaps_between_items_floating_inside_outer_range() {
683 let mut range_set: RangeSet<u32> = RangeSet::new();
684 range_set.insert(5..6);
687 range_set.insert(3..4);
690 let outer_range = 1..8;
693 let mut gaps = range_set.gaps(&outer_range);
694 assert_eq!(gaps.next(), Some(1..3));
697 assert_eq!(gaps.next(), Some(4..5));
698 assert_eq!(gaps.next(), Some(6..8));
699 assert_eq!(gaps.next(), None);
700 assert_eq!(gaps.next(), None);
702 assert_eq!(gaps.next(), None);
703 }
704
705 #[test]
706 fn overlapping_partial_edges_complete_middle() {
707 let mut range_map: RangeSet<u32> = RangeSet::new();
708
709 range_map.insert(0..2);
712 range_map.insert(3..4);
715 range_map.insert(5..7);
718
719 let query_range = 1..6;
722
723 let mut overlapping = range_map.overlapping(&query_range);
724
725 assert_eq!(overlapping.next(), Some(&(0..2)));
727 assert_eq!(overlapping.next(), Some(&(3..4)));
729 assert_eq!(overlapping.next(), Some(&(5..7)));
731 assert_eq!(overlapping.next(), None);
733 assert_eq!(overlapping.next(), None);
734 }
735
736 #[test]
741 fn set_debug_repr_looks_right() {
742 let mut set: RangeSet<u32> = RangeSet::new();
743
744 assert_eq!(format!("{:?}", set), "{}");
746
747 set.insert(2..5);
749 assert_eq!(format!("{:?}", set), "{2..5}");
750
751 set.insert(7..8);
753 set.insert(10..11);
754 assert_eq!(format!("{:?}", set), "{2..5, 7..8, 10..11}");
755 }
756
757 #[test]
760 fn always_default() {
761 struct NoDefault;
762 RangeSet::<NoDefault>::default();
763 }
764
765 #[cfg(feature = "serde1")]
768 #[test]
769 fn serialization() {
770 let mut range_set: RangeSet<u32> = RangeSet::new();
771 range_set.insert(1..3);
774 range_set.insert(5..7);
777 let output = serde_json::to_string(&range_set).expect("Failed to serialize");
778 assert_eq!(output, "[[1,3],[5,7]]");
779 }
780
781 #[cfg(feature = "serde1")]
784 #[test]
785 fn deserialization() {
786 let input = "[[1,3],[5,7]]";
787 let range_set: RangeSet<u32> = serde_json::from_str(input).expect("Failed to deserialize");
788 let reserialized = serde_json::to_string(&range_set).expect("Failed to re-serialize");
789 assert_eq!(reserialized, input);
790 }
791
792 #[cfg(feature = "const_fn")]
795 const _SET: RangeSet<u32> = RangeSet::new();
796}