haar_lib/misc/
range.rs

1use std::ops::RangeBounds;
2
3/// [`RangeBounds<usize>`]を実装した`r`を半開区間`start..end`内に含まれる半開区間として返す。
4pub fn range_bounds_to_range<R: RangeBounds<usize>>(
5    r: R,
6    start: usize,
7    end: usize,
8) -> (usize, usize) {
9    use std::ops::Bound::*;
10
11    let l = match r.start_bound() {
12        Included(&l) => l,
13        Excluded(&l) => l + 1,
14        Unbounded => start,
15    }
16    .max(start);
17
18    let r = match r.end_bound() {
19        Included(&r) => r + 1,
20        Excluded(&r) => r,
21        Unbounded => end,
22    }
23    .min(end);
24
25    (l, r)
26}