static BIN_OFFSETS: &[i32] = &[512 + 64 + 8 + 1, 64 + 8 + 1, 8 + 1, 1, 0];
const BIN_FIRST_SHIFT: i32 = 17;
const BIN_NEXT_SHIFT: i32 = 3;
pub fn bin_from_range(begin: i32, end: i32) -> Result<i32, crate::errors::SeqvarsError> {
let mut begin_bin = begin >> BIN_FIRST_SHIFT;
let mut end_bin = std::cmp::max(begin, end - 1) >> BIN_FIRST_SHIFT;
for offset in BIN_OFFSETS {
if begin_bin == end_bin {
return Ok(offset + begin_bin);
}
begin_bin >>= BIN_NEXT_SHIFT;
end_bin >>= BIN_NEXT_SHIFT;
}
Err(crate::errors::SeqvarsError::InvalidCoordinates(begin, end))
}