use std::ops::Range;
pub struct IdxMapper {
total_len: usize,
reverse: bool,
}
impl IdxMapper {
pub fn new(total_len: usize, reverse: bool) -> Self {
Self { total_len, reverse }
}
}
impl IdxMapper {
#[inline]
pub fn map_range(&self, range: Range<usize>) -> Range<usize> {
if self.reverse {
map_range::<true>(self.total_len, range)
} else {
range
}
}
}
#[inline]
pub fn map_range<const REVERSE: bool>(total_len: usize, range: Range<usize>) -> Range<usize> {
assert!(range.end <= total_len);
if REVERSE {
total_len - range.end..total_len - range.start
} else {
range
}
}
#[cfg(test)]
mod tests {
use super::IdxMapper;
#[test]
fn test_idx_map_roundtrip() {
let map = IdxMapper::new(100, true);
assert_eq!(map.map_range(map.map_range(5..77)), 5..77);
}
}