use crate::BlockAlignment;
use aligners::{alignment::Twice, AlignedBlock, AlignedSlice};
use cfg_if::cfg_if;
pub struct QuoteClassifiedBlock<'a> {
pub block: &'a AlignedBlock<Twice<BlockAlignment>>,
pub within_quotes_mask: u64,
}
impl<'a> QuoteClassifiedBlock<'a> {
#[must_use]
#[inline(always)]
pub fn len(&self) -> usize {
self.block.len()
}
#[must_use]
#[inline(always)]
pub fn is_empty(&self) -> bool {
self.block.is_empty()
}
}
pub trait QuoteClassifiedIterator<'a>: Iterator<Item = QuoteClassifiedBlock<'a>> + 'a {
fn block_size() -> usize;
fn is_empty(&self) -> bool;
fn get_offset(&self) -> usize;
fn offset(&mut self, count: isize);
fn flip_quotes_bit(&mut self);
}
cfg_if! {
if #[cfg(any(doc, not(feature = "simd")))] {
mod nosimd;
use nosimd::SequentialQuoteClassifier;
use aligners::alignment;
#[must_use]
#[inline(always)]
pub fn classify_quoted_sequences(
bytes: &AlignedSlice<alignment::Twice<BlockAlignment>>,
) -> impl QuoteClassifiedIterator {
assert_eq!(bytes.len() % SequentialQuoteClassifier::block_size(), 0, "bytes len have to be divisible by block size");
SequentialQuoteClassifier::new(bytes)
}
}
else if #[cfg(simd = "avx2")] {
mod avx2;
use avx2::Avx2QuoteClassifier;
use aligners::alignment;
#[must_use]
#[inline(always)]
pub fn classify_quoted_sequences(
bytes: &AlignedSlice<alignment::Twice<BlockAlignment>>,
) -> impl QuoteClassifiedIterator {
assert_eq!(bytes.len() % Avx2QuoteClassifier::block_size(), 0, "bytes len have to be divisible by block size");
Avx2QuoteClassifier::new(bytes)
}
}
else {
compile_error!("Target architecture is not supported by SIMD features of this crate. Disable the default `simd` feature.");
}
}