pzip_bwt/
lib.rs

1#![allow(dead_code)]
2mod divsufsort;
3
4pub fn apply_bwt(data: &mut Vec<u8>) -> i32 {
5    let mut sa = Vec::with_capacity(data.len());
6    sa.resize(data.len(), 0);
7    let pidx: i32;
8    unsafe {
9        pidx = divsufsort::divbwt(data.as_ptr(), data.as_mut_ptr(), sa.as_mut_ptr(), data.len() as i32);
10    }
11    pidx
12}
13
14pub fn reverse_bwt(data: &mut Vec<u8>, pidx: i32) {
15    let mut sa = Vec::with_capacity(data.len());
16    sa.resize(data.len(), 0);
17    unsafe {
18        divsufsort::inverse_bw_transform(data.as_ptr(), data.as_mut_ptr(), sa.as_mut_ptr(), data.len() as i32, pidx);
19    }
20}
21
22#[cfg(test)]
23mod tests {
24    use super::*;
25    use std::fs::File;
26    use std::io::prelude::*;
27
28    #[test]
29    #[ignore]
30    fn test_with_bwt_cli() {
31        let path = std::env::current_dir().unwrap();
32        let test = path.join("data/test.s31");
33        let mut f = File::open(test).unwrap();
34        let mut data : Vec<u8> = Vec::new();
35        f.read_to_end(&mut data).unwrap();
36        let expected_d = data.clone();
37        let test = path.join("data/test.s31.bwt");
38        let mut g = File::open(test).unwrap();
39        let mut expected :Vec<u8> = Vec::new();
40        g.read_to_end(&mut expected).unwrap();
41
42        let pidx = apply_bwt(&mut data);
43        assert_eq!(data, expected.iter().skip(8).map(|&x| x).collect::<Vec<u8>>());
44
45        reverse_bwt(&mut data, pidx);
46        assert_eq!(data, expected_d);
47    }
48
49    #[test]
50    fn test_bwt() {
51        let mut data : Vec<u8> = vec![154,67,101,83,2,2,2,2,2,2,89,99,3,168,234,24,12,34];
52        let expected = data.clone();
53        let pidx = apply_bwt(&mut data);
54        reverse_bwt(&mut data, pidx);
55        assert_eq!(data, expected);
56    }
57}