kff/
utils.rs

1//! Utils function for KFF
2
3/* std use */
4
5/* crate use */
6
7/* project use */
8
9/* mod declaration */
10pub mod global_index;
11pub mod kmer;
12pub mod read;
13pub mod write;
14
15/* pub use */
16pub use global_index::GlobalIndex;
17pub use kmer::{Data, Kmer, Seq2Bit};
18pub use read::KffRead;
19pub use write::KffWrite;
20
21#[inline]
22pub(crate) fn ceil_to_8(n: u64) -> u64 {
23    (n + 7) & !(7)
24}
25
26#[inline]
27pub(crate) fn bits2store_k(k: u64) -> u64 {
28    k * 2
29}
30
31#[inline]
32pub(crate) fn bytes2store_k(k: u64) -> u64 {
33    ceil_to_8(bits2store_k(k)) / 8
34}
35
36#[cfg(test)]
37mod tests {
38    use super::*;
39
40    use crate::error;
41    use rand::distributions::Distribution;
42
43    #[test]
44    fn ceil_to_8_() -> error::Result<()> {
45        assert_eq!(ceil_to_8(1), 8);
46        assert_eq!(ceil_to_8(7), 8);
47
48        assert_eq!(ceil_to_8(8), 8);
49
50        assert_eq!(ceil_to_8(9), 16);
51        assert_eq!(ceil_to_8(15), 16);
52
53        Ok(())
54    }
55
56    #[test]
57    fn bits2store_k_() -> error::Result<()> {
58        let range = rand::distributions::Uniform::from(0..100);
59        let mut rng = rand::thread_rng();
60
61        for _ in 0..100 {
62            let value = range.sample(&mut rng);
63
64            assert_eq!(bits2store_k(value), value * 2);
65        }
66
67        Ok(())
68    }
69
70    #[test]
71    fn bytes2store_k_() -> error::Result<()> {
72        assert_eq!(bytes2store_k(1), 1);
73        assert_eq!(bytes2store_k(4), 1);
74        assert_eq!(bytes2store_k(5), 2);
75        assert_eq!(bytes2store_k(16), 4);
76        assert_eq!(bytes2store_k(17), 5);
77
78        Ok(())
79    }
80}