Skip to content

Touching ranges of RangeInclusive are not merged

I found two cases where touching ranges are not correctly merged:

case 1

#[test]
fn case1() {
    let mut ranges = Ranges::new();

    ranges.insert(1..10);
    ranges.insert(15..=20);
    ranges.insert(10..=14);

    dbg!(&ranges);

    let (start, end) = ranges
        .find_intersecting_ranges(&GenericRange::from(15..=15))
        .unwrap();

    assert_eq!(start, 0); // 1 is returned instead of 0
    assert_eq!(end, 0); // 1 is returned instead of 0
}
test case1 ... FAILED

failures:

---- case1 stdout ----
[src/main.rs:13:5] &ranges = Ranges {
    ranges: [
        GenericRange {
            start: Included(
                1,
            ),
            end: Included(
                14,
            ),
        },
        GenericRange {
            start: Included(
                15,
            ),
            end: Included(
                20,
            ),
        },
    ],
}
thread 'case1' panicked at src/main.rs:19:5:
assertion `left == right` failed
  left: 1
 right: 0

case 2

#[test]
fn case2() {
    let mut ranges = Ranges::new();

    ranges.insert(1..=9);
    ranges.insert(15..=20);
    ranges.insert(10..=14);

    dbg!(&ranges);

    let (start, end) = ranges
        .find_intersecting_ranges(&GenericRange::from(15..=15))
        .unwrap();

    assert_eq!(start, 0); // 2 is returned instead of 0
    assert_eq!(end, 0); // 2 is returned instead of 0
}
test case2 ... FAILED

failures:

---- case2 stdout ----
[src/main.rs:31:5] &ranges = Ranges {
    ranges: [
        GenericRange {
            start: Included(
                1,
            ),
            end: Included(
                9,
            ),
        },
        GenericRange {
            start: Included(
                10,
            ),
            end: Included(
                14,
            ),
        },
        GenericRange {
            start: Included(
                15,
            ),
            end: Included(
                20,
            ),
        },
    ],
}
thread 'case2' panicked at src/main.rs:37:5:
assertion `left == right` failed
  left: 2
 right: 0
Edited by oblique
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information