1pub mod global_index;
11pub mod kmer;
12pub mod read;
13pub mod write;
14
15pub 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}