libsais-sys 0.2.0

Raw bindings to the C library libsais for suffix array construction
Documentation
use libsais_sys::libsais;

fn is_suffix_array(text: &[u8], maybe_suffix_array: &[i32]) -> bool {
    if text.is_empty() && maybe_suffix_array.is_empty() {
        return true;
    }

    for indices in maybe_suffix_array.windows(2) {
        let previous = indices[0] as usize;
        let current = indices[1] as usize;

        if text[previous..] > text[current..] {
            return false;
        }
    }

    true
}

#[test]
fn libsais_basic() {
    let text = b"abababcabba";
    let mut suffix_array = [0; 11];
    let res = unsafe {
        libsais::libsais(
            text.as_ptr(),
            suffix_array.as_mut_ptr(),
            text.len() as i32,
            0,
            std::ptr::null_mut(),
        )
    };

    assert_eq!(res, 0);
    assert!(is_suffix_array(text, &suffix_array))
}

#[cfg(feature = "openmp")]
#[test]
fn libsais_omp() {
    let text = b"abababcabba";
    let mut suffix_array = [0; 11];
    let res = unsafe {
        libsais::libsais_omp(
            text.as_ptr(),
            suffix_array.as_mut_ptr(),
            text.len() as i32,
            0,
            std::ptr::null_mut(),
            2,
        )
    };

    assert_eq!(res, 0);
    assert!(is_suffix_array(text, &suffix_array))
}