rangemap/
set.rs

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
17/// Intersection iterator over two [`RangeSet`].
18pub type Intersection<'a, T> = crate::operations::Intersection<'a, Range<T>, Iter<'a, T>>;
19
20/// Union iterator over two [`RangeSet`].
21pub type Union<'a, T> = crate::operations::Union<'a, Range<T>, Iter<'a, T>>;
22
23#[derive(Clone, Hash, Eq, PartialEq, PartialOrd, Ord)]
24/// A set whose items are stored as (half-open) ranges bounded
25/// inclusively below and exclusively above `(start..end)`.
26///
27/// See [`RangeMap`]'s documentation for more details.
28///
29/// [`RangeMap`]: struct.RangeMap.html
30pub 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    /// Makes a new empty `RangeSet`.
47    #[cfg(feature = "const_fn")]
48    pub const fn new() -> Self {
49        RangeSet {
50            rm: RangeMap::new(),
51        }
52    }
53
54    /// Makes a new empty `RangeSet`.
55    #[cfg(not(feature = "const_fn"))]
56    pub fn new() -> Self {
57        RangeSet {
58            rm: RangeMap::new(),
59        }
60    }
61
62    /// Returns a reference to the range covering the given key, if any.
63    pub fn get(&self, value: &T) -> Option<&Range<T>> {
64        self.rm.get_key_value(value).map(|(range, _)| range)
65    }
66
67    /// Returns `true` if any range in the set covers the specified value.
68    pub fn contains(&self, value: &T) -> bool {
69        self.rm.contains_key(value)
70    }
71
72    /// Gets an ordered iterator over all ranges,
73    /// ordered by range.
74    pub fn iter(&self) -> Iter<'_, T> {
75        Iter {
76            inner: self.rm.iter(),
77        }
78    }
79
80    /// Clears the set, removing all elements.
81    pub fn clear(&mut self) {
82        self.rm.clear();
83    }
84
85    /// Returns the number of elements in the set.
86    pub fn len(&self) -> usize {
87        self.rm.len()
88    }
89
90    /// Returns true if the set contains no elements.
91    pub fn is_empty(&self) -> bool {
92        self.rm.is_empty()
93    }
94
95    /// Return an iterator over the intersection of two range sets.
96    pub fn intersection<'a>(&'a self, other: &'a Self) -> Intersection<'a, T> {
97        Intersection::new(self.iter(), other.iter())
98    }
99
100    /// Return an iterator over the union of two range sets.
101    pub fn union<'a>(&'a self, other: &'a Self) -> Union<'a, T> {
102        Union::new(self.iter(), other.iter())
103    }
104
105    /// Insert a range into the set.
106    ///
107    /// If the inserted range either overlaps or is immediately adjacent
108    /// any existing range, then the ranges will be coalesced into
109    /// a single contiguous range.
110    ///
111    /// # Panics
112    ///
113    /// Panics if range `start >= end`.
114    pub fn insert(&mut self, range: Range<T>) {
115        self.rm.insert(range, ());
116    }
117
118    /// Removes a range from the set, if all or any of it was present.
119    ///
120    /// If the range to be removed _partially_ overlaps any ranges
121    /// in the set, then those ranges will be contracted to no
122    /// longer cover the removed range.
123    ///
124    /// # Panics
125    ///
126    /// Panics if range `start >= end`.
127    pub fn remove(&mut self, range: Range<T>) {
128        self.rm.remove(range);
129    }
130
131    /// Gets an iterator over all the maximally-sized ranges
132    /// contained in `outer_range` that are not covered by
133    /// any range stored in the set.
134    ///
135    /// If the start and end of the outer range are the same
136    /// and it does not overlap any stored range, then a single
137    /// empty gap will be returned.
138    ///
139    /// The iterator element type is `Range<T>`.
140    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    /// Gets an iterator over all the stored ranges that are
147    /// either partially or completely overlapped by the given range.
148    ///
149    /// The iterator element type is `&Range<T>`.
150    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    /// Returns `true` if any range in the set completely or partially
157    /// overlaps the given range.
158    pub fn overlaps(&self, range: &Range<T>) -> bool {
159        self.overlapping(range).next().is_some()
160    }
161
162    /// Returns the first range in the set, if one exists. The range is the minimum range in this
163    /// set.
164    pub fn first(&self) -> Option<&Range<T>> {
165        self.rm.first_range_value().map(|(range, _)| range)
166    }
167
168    /// Returns the last range in the set, if one exists. The range is the maximum range in this
169    /// set.
170    pub fn last(&self) -> Option<&Range<T>> {
171        self.rm.last_range_value().map(|(range, _)| range)
172    }
173}
174
175/// An iterator over the ranges of a `RangeSet`.
176///
177/// This `struct` is created by the [`iter`] method on [`RangeSet`]. See its
178/// documentation for more.
179///
180/// [`iter`]: RangeSet::iter
181pub 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
206/// An owning iterator over the ranges of a `RangeSet`.
207///
208/// This `struct` is created by the [`into_iter`] method on [`RangeSet`]
209/// (provided by the `IntoIterator` trait). See its documentation for more.
210///
211/// [`into_iter`]: IntoIterator::into_iter
212pub 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
242// We can't just derive this automatically, because that would
243// expose irrelevant (and private) implementation details.
244// Instead implement it in the same way that the underlying BTreeSet does.
245impl<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
344/// An iterator over all ranges not covered by a `RangeSet`.
345///
346/// This `struct` is created by the [`gaps`] method on [`RangeSet`]. See its
347/// documentation for more.
348///
349/// [`gaps`]: RangeSet::gaps
350pub struct Gaps<'a, T> {
351    inner: crate::map::Gaps<'a, T, ()>,
352}
353
354// `Gaps` is always fused. (See definition of `next` below.)
355impl<'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
368/// An iterator over all stored ranges partially or completely
369/// overlapped by a given range.
370///
371/// This `struct` is created by the [`overlapping`] method on [`RangeSet`]. See its
372/// documentation for more.
373///
374/// [`overlapping`]: RangeSet::overlapping
375pub struct Overlapping<'a, T, R: Borrow<Range<T>> = &'a Range<T>> {
376    inner: crate::map::Overlapping<'a, T, (), R>,
377}
378
379// `Overlapping` is always fused. (See definition of `next` below.)
380impl<'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/// Create a [`RangeSet`] from a list of ranges.
432///
433/// # Example
434///
435/// ```rust
436/// # use rangemap::range_set;
437/// let set = range_set![0..100, 200..300, 400..500];
438/// ```
439#[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    // neccessary due to assertion on empty ranges
519    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 the hashes are equal the values might not be the same (collision)
561        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            // there should not be any overlaps in the ranges returned by the union
605            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        // value should be in the union if and only if it is in either set
615        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        // value should be in the intersection if and only if it is in both sets
628        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            // there should not be any overlaps in the ranges returned by the
641            // intersection
642            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        // 0 1 2 3 4 5 6 7 8 9
685        // ◌ ◌ ◌ ◌ ◌ ●-◌ ◌ ◌ ◌
686        range_set.insert(5..6);
687        // 0 1 2 3 4 5 6 7 8 9
688        // ◌ ◌ ◌ ●-◌ ◌ ◌ ◌ ◌ ◌
689        range_set.insert(3..4);
690        // 0 1 2 3 4 5 6 7 8 9
691        // ◌ ◆-------------◇ ◌
692        let outer_range = 1..8;
693        let mut gaps = range_set.gaps(&outer_range);
694        // Should yield gaps at start, between items,
695        // and at end.
696        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        // Gaps iterator should be fused.
701        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        // 0 1 2 3 4 5 6 7 8 9
710        // ●---◌ ◌ ◌ ◌ ◌ ◌ ◌ ◌
711        range_map.insert(0..2);
712        // 0 1 2 3 4 5 6 7 8 9
713        // ◌ ◌ ◌ ●-◌ ◌ ◌ ◌ ◌ ◌
714        range_map.insert(3..4);
715        // 0 1 2 3 4 5 6 7 8 9
716        // ◌ ◌ ◌ ◌ ◌ ●---◌ ◌ ◌
717        range_map.insert(5..7);
718
719        // 0 1 2 3 4 5 6 7 8 9
720        // ◌ ◆---------◇ ◌ ◌ ◌
721        let query_range = 1..6;
722
723        let mut overlapping = range_map.overlapping(&query_range);
724
725        // Should yield partially overlapped range at start.
726        assert_eq!(overlapping.next(), Some(&(0..2)));
727        // Should yield completely overlapped range in middle.
728        assert_eq!(overlapping.next(), Some(&(3..4)));
729        // Should yield partially overlapped range at end.
730        assert_eq!(overlapping.next(), Some(&(5..7)));
731        // Gaps iterator should be fused.
732        assert_eq!(overlapping.next(), None);
733        assert_eq!(overlapping.next(), None);
734    }
735
736    ///
737    /// impl Debug
738    ///
739
740    #[test]
741    fn set_debug_repr_looks_right() {
742        let mut set: RangeSet<u32> = RangeSet::new();
743
744        // Empty
745        assert_eq!(format!("{:?}", set), "{}");
746
747        // One entry
748        set.insert(2..5);
749        assert_eq!(format!("{:?}", set), "{2..5}");
750
751        // Many entries
752        set.insert(7..8);
753        set.insert(10..11);
754        assert_eq!(format!("{:?}", set), "{2..5, 7..8, 10..11}");
755    }
756
757    // impl Default where T: ?Default
758
759    #[test]
760    fn always_default() {
761        struct NoDefault;
762        RangeSet::<NoDefault>::default();
763    }
764
765    // impl Serialize
766
767    #[cfg(feature = "serde1")]
768    #[test]
769    fn serialization() {
770        let mut range_set: RangeSet<u32> = RangeSet::new();
771        // 0 1 2 3 4 5 6 7 8 9
772        // ◌ ◆---◇ ◌ ◌ ◌ ◌ ◌ ◌
773        range_set.insert(1..3);
774        // 0 1 2 3 4 5 6 7 8 9
775        // ◌ ◌ ◌ ◌ ◌ ◆---◇ ◌ ◌
776        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    // impl Deserialize
782
783    #[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    // const fn
793
794    #[cfg(feature = "const_fn")]
795    const _SET: RangeSet<u32> = RangeSet::new();
796}