use super::mask::{MaskScheme, MaskState};
use super::o200k_family;
use crate::pretokenize::Pretoken;
pub(crate) struct O200kScheme;
impl MaskScheme for O200kScheme {
#[inline(always)]
fn advance(bytes: &[u8], pos: usize) -> usize {
o200k_family::advance_pos::<true, true, true, false>(bytes, pos)
}
#[cfg(target_arch = "aarch64")]
#[inline(always)]
fn batch_masks(bytes: &[u8], scan: usize) -> (u64, u64) {
o200k_family::batch_masks::<true, true, true, false>(bytes, scan)
}
#[cfg(target_arch = "x86_64")]
#[inline(always)]
unsafe fn batch_masks_x86<const AVX512: bool>(bytes: &[u8], scan: usize) -> (u64, u64) {
unsafe { o200k_family::batch_masks_x86::<AVX512, true, true, true, false>(bytes, scan) }
}
}
pub struct FastO200kPretokenizer<'a> {
bytes: &'a [u8],
state: MaskState,
}
impl<'a> FastO200kPretokenizer<'a> {
#[inline]
pub fn new(bytes: &'a [u8]) -> Self {
Self::with_pos(bytes, 0)
}
#[inline]
pub fn with_pos(bytes: &'a [u8], pos: usize) -> Self {
Self {
bytes,
state: MaskState::new(pos),
}
}
#[inline]
pub fn pos(&self) -> usize {
self.state.pos
}
}
impl<'a> Iterator for FastO200kPretokenizer<'a> {
type Item = Pretoken<'a>;
#[inline]
fn next(&mut self) -> Option<Pretoken<'a>> {
let (start, end) = self.state.next_span::<O200kScheme>(self.bytes)?;
Some(Pretoken(&self.bytes[start..end]))
}
}
super::impl_mask_pretoken_spans!(FastO200kPretokenizer, O200kScheme);