Skip to main content

suffix_array/
saca.rs

1use std::slice::from_raw_parts_mut;
2
3use cdivsufsort::sort_in_place as dss;
4
5/// Maximum length of the input string.
6pub const MAX_LENGTH: usize = std::i32::MAX as usize;
7
8/// Wrapper of the underlying suffix array construction algorithm.
9pub fn saca(s: &[u8], sa: &mut [u32]) {
10    assert!(s.len() <= MAX_LENGTH);
11    assert_eq!(s.len() + 1, sa.len());
12
13    sa[0] = s.len() as u32;
14    dss(s, as_signed_integer_slice(&mut sa[1..]));
15}
16
17fn as_signed_integer_slice(sa: &mut [u32]) -> &mut [i32] {
18    unsafe {
19        let len = sa.len();
20        let data = sa.as_mut_ptr() as *mut i32;
21        from_raw_parts_mut(data, len)
22    }
23}