| use std::ops::{Bound, Range, RangeBounds}; |
| |
| /// Normalize arbitrary `RangeBounds` to a `Range` |
| pub(super) fn simplify_range(range: impl RangeBounds<usize>, len: usize) -> Range<usize> { |
| let start = match range.start_bound() { |
| Bound::Unbounded => 0, |
| Bound::Included(&i) if i <= len => i, |
| Bound::Excluded(&i) if i < len => i + 1, |
| bound => panic!("range start {bound:?} should be <= length {len}"), |
| }; |
| let end = match range.end_bound() { |
| Bound::Unbounded => len, |
| Bound::Excluded(&i) if i <= len => i, |
| Bound::Included(&i) if i < len => i + 1, |
| bound => panic!("range end {bound:?} should be <= length {len}"), |
| }; |
| if start > end { |
| panic!( |
| "range start {:?} should be <= range end {:?}", |
| range.start_bound(), |
| range.end_bound() |
| ); |
| } |
| start..end |
| } |