swift-check 0.2.1

High-performance, robust, and expressive searching and validation (uses SIMD on x86_64, aarch64, and WASM)
Documentation
use super::Vector;

macro_rules! scan_all {
    (
        $data:ident, $idx:ident,
        |$chunk:ident| => $do:expr,
        |$partial:ident| => $handle_partial:expr; or $or:expr
    ) => {{
        while $idx <= $data.len() - super::WIDTH {
            let $chunk = &$data[$idx..$idx + super::WIDTH];
            $do;
            $idx += super::WIDTH;
        }
        match $data.len() - $idx {
            0 => $or,
            offset => {
                $idx -= super::WIDTH - offset;
                let $partial = &$data[$idx..$idx + super::WIDTH];
                $handle_partial
            }
        }
    }};
}

#[inline(always)]
pub unsafe fn for_all_ensure_ct(data: &[u8], cond: impl Fn(Vector) -> Vector, res: &mut bool) {
    let mut idx = 0;
    scan_all!(
        data, idx,
        |chunk| => *res &= crate::ensure!(super::load_unchecked(chunk), cond),
        |partial| => *res &= crate::ensure!(super::load_unchecked(partial), cond); or {}
    );
}

#[inline(always)]
pub unsafe fn for_all_ensure(data: &[u8], cond: impl Fn(Vector) -> Vector) -> bool {
    let mut idx = 0;
    scan_all!(
        data, idx,
        |chunk| => if !crate::ensure!(super::load_unchecked(chunk), cond) { return false },
        |partial| => crate::ensure!(super::load_unchecked(partial), cond); or true
    )
}

#[inline(always)]
pub unsafe fn search(data: &[u8], cond: impl Fn(Vector) -> Vector) -> Option<usize> {
    let mut idx = 0;
    scan_all!(
        data, idx,
        |chunk| => if let Some(position) = crate::find!(super::load_unchecked(chunk), cond) {
            return Some(position as usize + idx)
        },
        |partial| => crate::find!(super::load_unchecked(partial), cond)
            .map(|pos| pos as usize + idx); or None
    )
}

#[cfg(feature = "require")]
#[inline(always)]
pub unsafe fn ensure_requirements<R: crate::require::Requirement>(data: &[u8], mut req: R) -> R {
    let mut idx = 0;
    scan_all!(
        data, idx,
        |chunk| => req.check(super::load_unchecked(chunk)),
        |partial| => req.check(super::load_unchecked(partial)); or {}
    );
    req
}