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}