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
42#[cfg(feature = "quickcheck")]
43impl<K> quickcheck::Arbitrary for RangeSet<K>
44where
45 K: quickcheck::Arbitrary + Ord,
46{
47 fn arbitrary(g: &mut quickcheck::Gen) -> Self {
48 Self {
49 rm: RangeMap::arbitrary(g),
50 }
51 }
52}
53
54impl<T> RangeSet<T>
55where
56 T: Ord + Clone,
57{
58 #[cfg(feature = "const_fn")]
60 pub const fn new() -> Self {
61 RangeSet {
62 rm: RangeMap::new(),
63 }
64 }
65
66 #[cfg(not(feature = "const_fn"))]
68 pub fn new() -> Self {
69 RangeSet {
70 rm: RangeMap::new(),
71 }
72 }
73
74 pub fn get(&self, value: &T) -> Option<&Range<T>> {
76 self.rm.get_key_value(value).map(|(range, _)| range)
77 }
78
79 pub fn contains(&self, value: &T) -> bool {
81 self.rm.contains_key(value)
82 }
83
84 pub fn iter(&self) -> Iter<'_, T> {
87 Iter {
88 inner: self.rm.iter(),
89 }
90 }
91
92 pub fn clear(&mut self) {
94 self.rm.clear();
95 }
96
97 pub fn len(&self) -> usize {
99 self.rm.len()
100 }
101
102 pub fn is_empty(&self) -> bool {
104 self.rm.is_empty()
105 }
106
107 pub fn intersection<'a>(&'a self, other: &'a Self) -> Intersection<'a, T> {
109 Intersection::new(self.iter(), other.iter())
110 }
111
112 pub fn union<'a>(&'a self, other: &'a Self) -> Union<'a, T> {
114 Union::new(self.iter(), other.iter())
115 }
116
117 pub fn insert(&mut self, range: Range<T>) {
127 self.rm.insert(range, ());
128 }
129
130 pub fn remove(&mut self, range: Range<T>) {
140 self.rm.remove(range);
141 }
142
143 pub fn gaps<'a>(&'a self, outer_range: &'a Range<T>) -> Gaps<'a, T> {
153 Gaps {
154 inner: self.rm.gaps(outer_range),
155 }
156 }
157
158 pub fn overlapping<R: Borrow<Range<T>>>(&self, range: R) -> Overlapping<T, R> {
163 Overlapping {
164 inner: self.rm.overlapping(range),
165 }
166 }
167
168 pub fn overlaps(&self, range: &Range<T>) -> bool {
171 self.overlapping(range).next().is_some()
172 }
173
174 pub fn first(&self) -> Option<&Range<T>> {
177 self.rm.first_range_value().map(|(range, _)| range)
178 }
179
180 pub fn last(&self) -> Option<&Range<T>> {
183 self.rm.last_range_value().map(|(range, _)| range)
184 }
185}
186
187pub struct Iter<'a, T> {
194 inner: super::map::Iter<'a, T, ()>,
195}
196
197impl<'a, T> Iterator for Iter<'a, T> {
198 type Item = &'a Range<T>;
199
200 fn next(&mut self) -> Option<Self::Item> {
201 self.inner.next().map(|(range, _)| range)
202 }
203
204 fn size_hint(&self) -> (usize, Option<usize>) {
205 self.inner.size_hint()
206 }
207}
208
209impl<'a, K> DoubleEndedIterator for Iter<'a, K>
210where
211 K: 'a,
212{
213 fn next_back(&mut self) -> Option<Self::Item> {
214 self.inner.next_back().map(|(range, _)| range)
215 }
216}
217
218pub struct IntoIter<T> {
225 inner: super::map::IntoIter<T, ()>,
226}
227
228impl<T> IntoIterator for RangeSet<T> {
229 type Item = Range<T>;
230 type IntoIter = IntoIter<T>;
231 fn into_iter(self) -> Self::IntoIter {
232 IntoIter {
233 inner: self.rm.into_iter(),
234 }
235 }
236}
237
238impl<T> Iterator for IntoIter<T> {
239 type Item = Range<T>;
240 fn next(&mut self) -> Option<Range<T>> {
241 self.inner.next().map(|(range, _)| range)
242 }
243 fn size_hint(&self) -> (usize, Option<usize>) {
244 self.inner.size_hint()
245 }
246}
247
248impl<K> DoubleEndedIterator for IntoIter<K> {
249 fn next_back(&mut self) -> Option<Self::Item> {
250 self.inner.next_back().map(|(range, _)| range)
251 }
252}
253
254impl<T: Debug> Debug for RangeSet<T>
258where
259 T: Ord + Clone,
260{
261 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
262 f.debug_set().entries(self.iter()).finish()
263 }
264}
265
266impl<T> FromIterator<Range<T>> for RangeSet<T>
267where
268 T: Ord + Clone,
269{
270 fn from_iter<I: IntoIterator<Item = Range<T>>>(iter: I) -> Self {
271 let mut range_set = RangeSet::new();
272 range_set.extend(iter);
273 range_set
274 }
275}
276
277impl<T> Extend<Range<T>> for RangeSet<T>
278where
279 T: Ord + Clone,
280{
281 fn extend<I: IntoIterator<Item = Range<T>>>(&mut self, iter: I) {
282 iter.into_iter().for_each(move |range| {
283 self.insert(range);
284 })
285 }
286}
287
288#[cfg(feature = "serde1")]
289impl<T> Serialize for RangeSet<T>
290where
291 T: Ord + Clone + Serialize,
292{
293 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
294 where
295 S: Serializer,
296 {
297 use serde::ser::SerializeSeq;
298 let mut seq = serializer.serialize_seq(Some(self.rm.btm.len()))?;
299 for range in self.iter() {
300 seq.serialize_element(&(&range.start, &range.end))?;
301 }
302 seq.end()
303 }
304}
305
306#[cfg(feature = "serde1")]
307impl<'de, T> Deserialize<'de> for RangeSet<T>
308where
309 T: Ord + Clone + Deserialize<'de>,
310{
311 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
312 where
313 D: Deserializer<'de>,
314 {
315 deserializer.deserialize_seq(RangeSetVisitor::new())
316 }
317}
318
319#[cfg(feature = "serde1")]
320struct RangeSetVisitor<T> {
321 marker: PhantomData<fn() -> RangeSet<T>>,
322}
323
324#[cfg(feature = "serde1")]
325impl<T> RangeSetVisitor<T> {
326 fn new() -> Self {
327 RangeSetVisitor {
328 marker: PhantomData,
329 }
330 }
331}
332
333#[cfg(feature = "serde1")]
334impl<'de, T> Visitor<'de> for RangeSetVisitor<T>
335where
336 T: Ord + Clone + Deserialize<'de>,
337{
338 type Value = RangeSet<T>;
339
340 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
341 formatter.write_str("RangeSet")
342 }
343
344 fn visit_seq<A>(self, mut access: A) -> Result<Self::Value, A::Error>
345 where
346 A: SeqAccess<'de>,
347 {
348 let mut range_set = RangeSet::new();
349 while let Some((start, end)) = access.next_element()? {
350 range_set.insert(start..end);
351 }
352 Ok(range_set)
353 }
354}
355
356pub struct Gaps<'a, T> {
363 inner: crate::map::Gaps<'a, T, ()>,
364}
365
366impl<'a, T> core::iter::FusedIterator for Gaps<'a, T> where T: Ord + Clone {}
368
369impl<'a, T> Iterator for Gaps<'a, T>
370where
371 T: Ord + Clone,
372{
373 type Item = Range<T>;
374
375 fn next(&mut self) -> Option<Self::Item> {
376 self.inner.next()
377 }
378}
379
380pub struct Overlapping<'a, T, R: Borrow<Range<T>> = &'a Range<T>> {
388 inner: crate::map::Overlapping<'a, T, (), R>,
389}
390
391impl<'a, T, R: Borrow<Range<T>>> core::iter::FusedIterator for Overlapping<'a, T, R> where
393 T: Ord + Clone
394{
395}
396
397impl<'a, T, R: Borrow<Range<T>>> Iterator for Overlapping<'a, T, R>
398where
399 T: Ord + Clone,
400{
401 type Item = &'a Range<T>;
402
403 fn next(&mut self) -> Option<Self::Item> {
404 self.inner.next().map(|(k, _v)| k)
405 }
406}
407
408impl<'a, T, R: Borrow<Range<T>>> DoubleEndedIterator for Overlapping<'a, T, R>
409where
410 T: Ord + Clone,
411{
412 fn next_back(&mut self) -> Option<Self::Item> {
413 self.inner.next_back().map(|(k, _v)| k)
414 }
415}
416
417impl<T: Ord + Clone> BitAnd for &RangeSet<T> {
418 type Output = RangeSet<T>;
419
420 fn bitand(self, other: Self) -> Self::Output {
421 self.intersection(other).collect()
422 }
423}
424
425impl<T: Ord + Clone> BitOr for &RangeSet<T> {
426 type Output = RangeSet<T>;
427
428 fn bitor(self, other: Self) -> Self::Output {
429 self.union(other).collect()
430 }
431}
432
433impl<T: Ord + Clone, const N: usize> From<[Range<T>; N]> for RangeSet<T> {
434 fn from(value: [Range<T>; N]) -> Self {
435 let mut set = Self::new();
436 for value in IntoIterator::into_iter(value) {
437 set.insert(value);
438 }
439 set
440 }
441}
442
443#[macro_export]
452macro_rules! range_set {
453 ($($range:expr),* $(,)?) => {{
454 $crate::RangeSet::from([$($range),*])
455 }};
456}
457
458#[cfg(test)]
459mod tests {
460 use super::*;
461 use alloc as std;
462 use alloc::{format, vec, vec::Vec};
463 use proptest::prelude::*;
464 use test_strategy::proptest;
465
466 impl<T> Arbitrary for RangeSet<T>
467 where
468 T: Ord + Clone + Debug + Arbitrary + 'static,
469 {
470 type Parameters = ();
471 type Strategy = BoxedStrategy<Self>;
472
473 fn arbitrary_with(_parameters: Self::Parameters) -> Self::Strategy {
474 any::<Vec<Range<T>>>()
475 .prop_map(|ranges| {
476 ranges
477 .into_iter()
478 .filter(|range| range.start != range.end)
479 .collect::<RangeSet<T>>()
480 })
481 .boxed()
482 }
483 }
484
485 #[proptest]
486 fn test_first(set: RangeSet<u64>) {
487 assert_eq!(set.first(), set.iter().min_by_key(|range| range.start));
488 }
489
490 #[proptest]
491 #[allow(clippy::len_zero)]
492 fn test_len(mut map: RangeSet<u64>) {
493 assert_eq!(map.len(), map.iter().count());
494 assert_eq!(map.is_empty(), map.len() == 0);
495 map.clear();
496 assert_eq!(map.len(), 0);
497 assert!(map.is_empty());
498 assert_eq!(map.iter().count(), 0);
499 }
500
501 #[proptest]
502 fn test_last(set: RangeSet<u64>) {
503 assert_eq!(set.last(), set.iter().max_by_key(|range| range.end));
504 }
505
506 #[proptest]
507 fn test_iter_reversible(set: RangeSet<u64>) {
508 let forward: Vec<_> = set.iter().collect();
509 let mut backward: Vec<_> = set.iter().rev().collect();
510 backward.reverse();
511 assert_eq!(forward, backward);
512 }
513
514 #[proptest]
515 fn test_into_iter_reversible(set: RangeSet<u64>) {
516 let forward: Vec<_> = set.clone().into_iter().collect();
517 let mut backward: Vec<_> = set.into_iter().rev().collect();
518 backward.reverse();
519 assert_eq!(forward, backward);
520 }
521
522 #[proptest]
523 fn test_overlapping_reversible(set: RangeSet<u64>, range: Range<u64>) {
524 let forward: Vec<_> = set.overlapping(&range).collect();
525 let mut backward: Vec<_> = set.overlapping(&range).rev().collect();
526 backward.reverse();
527 assert_eq!(forward, backward);
528 }
529
530 fn filter_ranges<T: Ord>(ranges: Vec<Range<T>>) -> Vec<Range<T>> {
532 ranges
533 .into_iter()
534 .filter(|range| range.start != range.end)
535 .collect()
536 }
537
538 #[proptest]
539 fn test_arbitrary_set_u8(ranges: Vec<Range<u8>>) {
540 let ranges = filter_ranges(ranges);
541 let set = ranges.iter().fold(RangeSet::new(), |mut set, range| {
542 set.insert(range.clone());
543 set
544 });
545
546 for value in 0..u8::MAX {
547 assert_eq!(
548 set.contains(&value),
549 ranges.iter().any(|range| range.contains(&value))
550 );
551 }
552 }
553
554 #[proptest]
555 #[allow(deprecated)]
556 fn test_hash(left: RangeSet<u64>, right: RangeSet<u64>) {
557 use core::hash::{Hash, Hasher, SipHasher};
558
559 let hash = |set: &RangeSet<_>| {
560 let mut hasher = SipHasher::new();
561 set.hash(&mut hasher);
562 hasher.finish()
563 };
564
565 if left == right {
566 assert!(
567 hash(&left) == hash(&right),
568 "if two values are equal, their hash must be equal"
569 );
570 }
571
572 if hash(&left) != hash(&right) {
574 assert!(
575 left != right,
576 "if two value's hashes are not equal, they must not be equal"
577 );
578 }
579 }
580
581 #[proptest]
582 fn test_ord(left: RangeSet<u64>, right: RangeSet<u64>) {
583 assert_eq!(
584 left == right,
585 left.cmp(&right).is_eq(),
586 "ordering and equality must match"
587 );
588 assert_eq!(
589 left.cmp(&right),
590 left.partial_cmp(&right).unwrap(),
591 "ordering is total for ordered parameters"
592 );
593 }
594
595 #[test]
596 fn test_from_array() {
597 let mut set = RangeSet::new();
598 set.insert(0..100);
599 set.insert(200..300);
600 assert_eq!(set, RangeSet::from([0..100, 200..300]));
601 }
602
603 #[test]
604 fn test_macro() {
605 assert_eq!(range_set![], RangeSet::<i64>::new());
606 assert_eq!(
607 range_set![0..100, 200..300, 400..500],
608 [0..100, 200..300, 400..500].iter().cloned().collect(),
609 );
610 }
611
612 #[proptest]
613 fn test_union_overlaps_u8(left: RangeSet<u8>, right: RangeSet<u8>) {
614 let mut union = RangeSet::new();
615 for range in left.union(&right) {
616 assert!(union.overlapping(&range).next().is_none());
618 union.insert(range);
619 }
620 }
621
622 #[proptest]
623 fn test_union_contains_u8(left: RangeSet<u8>, right: RangeSet<u8>) {
624 let union = (&left) | (&right);
625
626 for value in 0..u8::MAX {
628 assert_eq!(
629 union.contains(&value),
630 left.contains(&value) || right.contains(&value)
631 );
632 }
633 }
634
635 #[proptest]
636 fn test_intersection_contains_u8(left: RangeSet<u8>, right: RangeSet<u8>) {
637 let intersection = (&left) & (&right);
638
639 for value in 0..u8::MAX {
641 assert_eq!(
642 intersection.contains(&value),
643 left.contains(&value) && right.contains(&value)
644 );
645 }
646 }
647
648 #[proptest]
649 fn test_intersection_overlaps_u8(left: RangeSet<u8>, right: RangeSet<u8>) {
650 let mut union = RangeSet::new();
651 for range in left.intersection(&right) {
652 assert!(union.overlapping(&range).next().is_none());
655 union.insert(range);
656 }
657 }
658
659 trait RangeSetExt<T> {
660 fn to_vec(&self) -> Vec<Range<T>>;
661 }
662
663 impl<T> RangeSetExt<T> for RangeSet<T>
664 where
665 T: Ord + Clone,
666 {
667 fn to_vec(&self) -> Vec<Range<T>> {
668 self.iter().cloned().collect()
669 }
670 }
671
672 #[test]
673 fn empty_set_is_empty() {
674 let range_set: RangeSet<u32> = RangeSet::new();
675 assert_eq!(range_set.to_vec(), vec![]);
676 }
677
678 #[test]
679 fn insert_into_empty_map() {
680 let mut range_set: RangeSet<u32> = RangeSet::new();
681 range_set.insert(0..50);
682 assert_eq!(range_set.to_vec(), vec![0..50]);
683 }
684
685 #[test]
686 fn remove_partially_overlapping() {
687 let mut range_set: RangeSet<u32> = RangeSet::new();
688 range_set.insert(0..50);
689 range_set.remove(25..75);
690 assert_eq!(range_set.to_vec(), vec![0..25]);
691 }
692
693 #[test]
694 fn gaps_between_items_floating_inside_outer_range() {
695 let mut range_set: RangeSet<u32> = RangeSet::new();
696 range_set.insert(5..6);
699 range_set.insert(3..4);
702 let outer_range = 1..8;
705 let mut gaps = range_set.gaps(&outer_range);
706 assert_eq!(gaps.next(), Some(1..3));
709 assert_eq!(gaps.next(), Some(4..5));
710 assert_eq!(gaps.next(), Some(6..8));
711 assert_eq!(gaps.next(), None);
712 assert_eq!(gaps.next(), None);
714 assert_eq!(gaps.next(), None);
715 }
716
717 #[test]
718 fn overlapping_partial_edges_complete_middle() {
719 let mut range_map: RangeSet<u32> = RangeSet::new();
720
721 range_map.insert(0..2);
724 range_map.insert(3..4);
727 range_map.insert(5..7);
730
731 let query_range = 1..6;
734
735 let mut overlapping = range_map.overlapping(&query_range);
736
737 assert_eq!(overlapping.next(), Some(&(0..2)));
739 assert_eq!(overlapping.next(), Some(&(3..4)));
741 assert_eq!(overlapping.next(), Some(&(5..7)));
743 assert_eq!(overlapping.next(), None);
745 assert_eq!(overlapping.next(), None);
746 }
747
748 #[test]
753 fn set_debug_repr_looks_right() {
754 let mut set: RangeSet<u32> = RangeSet::new();
755
756 assert_eq!(format!("{:?}", set), "{}");
758
759 set.insert(2..5);
761 assert_eq!(format!("{:?}", set), "{2..5}");
762
763 set.insert(7..8);
765 set.insert(10..11);
766 assert_eq!(format!("{:?}", set), "{2..5, 7..8, 10..11}");
767 }
768
769 #[test]
772 fn always_default() {
773 struct NoDefault;
774 RangeSet::<NoDefault>::default();
775 }
776
777 #[cfg(feature = "serde1")]
780 #[test]
781 fn serialization() {
782 let mut range_set: RangeSet<u32> = RangeSet::new();
783 range_set.insert(1..3);
786 range_set.insert(5..7);
789 let output = serde_json::to_string(&range_set).expect("Failed to serialize");
790 assert_eq!(output, "[[1,3],[5,7]]");
791 }
792
793 #[cfg(feature = "serde1")]
796 #[test]
797 fn deserialization() {
798 let input = "[[1,3],[5,7]]";
799 let range_set: RangeSet<u32> = serde_json::from_str(input).expect("Failed to deserialize");
800 let reserialized = serde_json::to_string(&range_set).expect("Failed to re-serialize");
801 assert_eq!(reserialized, input);
802 }
803
804 #[cfg(feature = "const_fn")]
807 const _SET: RangeSet<u32> = RangeSet::new();
808
809 #[cfg(feature = "quickcheck")]
810 quickcheck::quickcheck! {
811 fn prop(xs: RangeSet<usize>) -> bool {
812 xs == xs
813 }
814 }
815}