lzip_parallel/
deflate_scan.rs1use linflate::deflate_scan::find_next_flush;
8
9pub use linflate::deflate_scan::{FlushBoundary, find_all_flushes};
10
11pub fn split_boundaries_parallel(buf: &[u8], n_splits: usize) -> Vec<FlushBoundary> {
17 if n_splits <= 1 || buf.len() < 8 {
18 return Vec::new();
19 }
20
21 let mut found: Vec<Option<FlushBoundary>> =
23 gatling::gatling_forkjoin::gatling_for_each(n_splits - 1, 0, |k| {
24 let i = k + 1;
25 let nominal = buf.len() * i / n_splits;
26 find_next_flush(buf, nominal)
27 });
28
29 let mut result: Vec<FlushBoundary> = found.drain(..).flatten().collect();
30 result.sort_by_key(|b| b.start);
31 result.dedup_by_key(|b| b.start);
32 result
33}
34
35#[cfg(test)]
36mod tests {
37 use super::*;
38
39 fn make_flush_marker() -> Vec<u8> {
40 vec![0x00, 0x00, 0x00, 0xFF, 0xFF]
41 }
42
43 #[test]
44 fn split_finds_markers() {
45 let mut buf = Vec::new();
46 buf.extend_from_slice(&[0xAA; 32]);
47 buf.extend_from_slice(&make_flush_marker());
48 buf.extend_from_slice(&[0xBB; 32]);
49 let all = find_all_flushes(&buf);
51 assert_eq!(all.len(), 1);
52 assert_eq!(all[0].start, 37);
53 }
54}