1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#[cfg(feature = "crosscheck")]
use once_cell::sync::Lazy;

use crate::common::{ABucket, BMixBucket, Idx, SuffixArray, ALPHABET_SIZE};
use std::{
    fs::File,
    io::{BufWriter, Write},
    sync::Mutex,
};

#[cfg(feature = "crosscheck")]
pub static CROSSCHECK_FILE: Lazy<Mutex<BufWriter<File>>> = Lazy::new(|| {
    std::fs::create_dir_all("crosscheck").unwrap();
    Mutex::new(BufWriter::new(File::create("crosscheck/rust").unwrap()))
});

#[macro_export]
macro_rules! crosscheck {
    ($($arg: expr),*) => {
        #[cfg(feature = "crosscheck")]
        {
            use std::io::Write;
            let mut f = crate::crosscheck::CROSSCHECK_FILE.lock().unwrap();
            writeln!(f, $($arg),*).unwrap();
        }
    };
}

pub fn flush() {
    #[cfg(feature = "crosscheck")]
    {
        let mut f = crate::crosscheck::CROSSCHECK_FILE.lock().unwrap();
        f.flush().unwrap();
    }
}

#[macro_export]
macro_rules! SA_dump {
    ($SA: expr, $label: expr) => {
        #[cfg(feature = "crosscheck")]
        {
            use std::io::Write;
            let mut f = crate::crosscheck::CROSSCHECK_FILE.lock().unwrap();

            writeln!(f, ":: {}", $label).unwrap();
            for i in 0..$SA.0.len() {
                write!(f, "{} ", $SA.0[i]).unwrap();
                if (i + 1) % 25 == 0 {
                    writeln!(f).unwrap();
                }
            }
            writeln!(f).unwrap();
        }
    };
}

#[macro_export]
macro_rules! A_dump {
    ($A: expr, $label: expr) => {
        #[cfg(feature = "crosscheck")]
        {
            crosscheck!(":: {}", $label);
            crosscheck!("A = {:?}", $A.0);
        }
    };
}

#[macro_export]
macro_rules! BSTAR_dump {
    ($B: expr, $label: expr) => {
        #[cfg(feature = "crosscheck")]
        {
            use std::io::Write;
            let mut f = crate::crosscheck::CROSSCHECK_FILE.lock().unwrap();

            writeln!(f, "{} B* dump:", $label).unwrap();
            for ii in 0..(ALPHABET_SIZE as Idx) {
                for jj in 0..(ALPHABET_SIZE as Idx) {
                    writeln!(f, "{} B*[{},{}]={}", $label, ii, jj, $B.bstar()[(ii, jj)]).unwrap();
                }
            }
        }
    };
}