use {
::memchr::memchr_iter,
::tyfling::{debug, display},
};
#[derive(Hash, PartialEq, Eq)]
#[debug("[ {self} ]")]
#[display("{line}:{col}")]
pub struct LineCol {
pub line: u32,
pub col: u32,
}
#[allow(clippy::cast_possible_truncation, reason = "documented")]
#[must_use]
pub fn calc_line_beginnings(src: &str) -> Vec<u32> {
let mut lb = Vec::with_capacity(8);
lb.push(0);
lb.extend(memchr_iter(b'\n', src.as_bytes()).map(|i| i as u32 + 1));
lb
}
#[allow(clippy::cast_possible_truncation, reason = "documented")]
#[must_use]
pub fn find_line(lb: &[u32], pos: u32) -> u32 {
(match lb.binary_search(&pos) {
Ok(i) => i,
Err(i) => i - 1,
}) as u32
}
#[allow(clippy::cast_possible_truncation, reason = "documented")]
#[must_use]
pub fn find_line_col(lb: &[u32], pos: u32) -> LineCol {
let line = find_line(lb, pos);
LineCol {
line,
col: pos - lb[line as usize],
}
}