pub mod depth;
pub mod memmem;
pub mod quotes;
pub mod structural;
use crate::{
debug,
input::{error::InputError, InputBlockIterator},
};
use quotes::{QuoteClassifiedBlock, QuoteClassifiedIterator};
pub struct ResumeClassifierState<'i, I, Q, const N: usize>
where
I: InputBlockIterator<'i, N>,
{
pub iter: Q,
pub block: Option<ResumeClassifierBlockState<'i, I, N>>,
pub are_commas_on: bool,
pub are_colons_on: bool,
}
pub struct ResumeClassifierBlockState<'i, I, const N: usize>
where
I: InputBlockIterator<'i, N>,
{
pub block: QuoteClassifiedBlock<I::Block, N>,
pub idx: usize,
}
impl<'i, I, Q, const N: usize> ResumeClassifierState<'i, I, Q, N>
where
I: InputBlockIterator<'i, N>,
Q: QuoteClassifiedIterator<'i, I, N>,
{
#[inline(always)]
pub fn get_idx(&self) -> usize {
debug!(
"iter offset: {}, block idx: {:?}",
self.iter.get_offset(),
self.block.as_ref().map(|b| b.idx)
);
self.iter.get_offset() + self.block.as_ref().map_or(0, |b| b.idx)
}
#[inline]
#[allow(clippy::panic_in_result_fn)]
pub fn offset_bytes(&mut self, count: isize) -> Result<(), InputError> {
assert!(count > 0);
let count = count as usize;
let remaining_in_block = self.block.as_ref().map_or(0, |b| b.block.len() - b.idx);
match self.block.as_mut() {
Some(b) if b.block.len() - b.idx > count => {
b.idx += count;
}
_ => {
let blocks_to_advance = (count - remaining_in_block) / N;
let remainder = (self.block.as_ref().map_or(0, |b| b.idx) + count - blocks_to_advance * N) % N;
self.iter.offset(blocks_to_advance as isize);
let next_block = self.iter.next()?;
self.block = next_block.map(|b| ResumeClassifierBlockState {
block: b,
idx: remainder,
});
}
}
debug!("offset_bytes({count}) results in idx moved to {}", self.get_idx());
Ok(())
}
}