Based on https://github.com/facebook/zstd/blob/1518570c62b95136b6a69714012957cae5487a9a/lib/compress/hist.c#L66
(bytes: &[u8])
| 27 | |
| 28 | // Based on https://github.com/facebook/zstd/blob/1518570c62b95136b6a69714012957cae5487a9a/lib/compress/hist.c#L66 |
| 29 | fn histogram_parallel_u32(bytes: &[u8]) -> [u32; 256] { |
| 30 | let mut histograms = [[0; 256]; 4]; |
| 31 | |
| 32 | let (chunks, remainder) = bytes.split_at(bytes.len() / 16 * 16); |
| 33 | let chunks16: &[[[u8; 4]; 4]] = bytemuck::cast_slice(chunks); |
| 34 | for chunk16 in chunks16 { |
| 35 | for chunk4 in chunk16 { |
| 36 | let c = u32::from_ne_bytes(*chunk4); |
| 37 | histograms[0][c as u8 as usize] += 1; |
| 38 | histograms[1][(c >> 8) as u8 as usize] += 1; |
| 39 | histograms[2][(c >> 16) as u8 as usize] += 1; |
| 40 | histograms[3][(c >> 24) as usize] += 1; |
| 41 | } |
| 42 | } |
| 43 | for &v in remainder { |
| 44 | histograms[0][v as usize] += 1; |
| 45 | } |
| 46 | |
| 47 | let (dst, src) = histograms.split_at_mut(1); |
| 48 | let dst = &mut dst[0]; |
| 49 | for i in 0..256 { |
| 50 | for src in src.iter() { |
| 51 | dst[i] += src[i]; |
| 52 | } |
| 53 | } |
| 54 | *dst |
| 55 | } |
| 56 | |
| 57 | #[cfg(test)] |
| 58 | mod tests { |
no test coverage detected