use std::ops::Range;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub(crate) struct IndexRange {
start: u32,
end: u32,
}
impl IndexRange {
pub(crate) fn start(self) -> usize {
widen(self.start)
}
pub(crate) fn end(self) -> usize {
widen(self.end)
}
pub(crate) fn range(self) -> Range<usize> {
self.start()..self.end()
}
}
impl From<Range<usize>> for IndexRange {
fn from(range: Range<usize>) -> Self {
Self {
start: narrow(range.start),
end: narrow(range.end),
}
}
}
pub(crate) fn narrow(at: usize) -> u32 {
u32::try_from(at).unwrap_or(u32::MAX)
}
pub(crate) fn widen(at: u32) -> usize {
usize::try_from(at).unwrap_or(usize::MAX)
}