Skip to main content

hanfei_fa/
chunking.rs

1/// Default chunk size: 16 KB.
2pub const DEFAULT_CHUNK_SIZE: usize = 16384;
3
4/// Split bytes into fixed-size chunks.
5pub fn chunk_bytes(data: &[u8], chunk_size: usize) -> Vec<&[u8]> {
6    data.chunks(chunk_size).collect()
7}
8
9/// Iterator version for memory efficiency.
10pub fn chunk_bytes_iter(data: &[u8], chunk_size: usize) -> impl Iterator<Item = &[u8]> {
11    data.chunks(chunk_size)
12}
13
14/// Estimate number of chunks for a given data size.
15pub fn estimate_chunk_count(data_size: usize, chunk_size: usize) -> usize {
16    (data_size + chunk_size - 1) / chunk_size
17}
18
19#[cfg(test)]
20mod tests {
21    use super::*;
22
23    #[test]
24    fn test_exact_multiple() {
25        let data = vec![0u8; 64];
26        let chunks = chunk_bytes(&data, 16);
27        assert_eq!(chunks.len(), 4);
28        assert!(chunks.iter().all(|c| c.len() == 16));
29    }
30
31    #[test]
32    fn test_non_exact() {
33        let data = vec![0u8; 50];
34        let chunks = chunk_bytes(&data, 16);
35        assert_eq!(chunks.len(), 4);
36        assert_eq!(chunks[3].len(), 2);
37    }
38
39    #[test]
40    fn test_smaller_than_chunk() {
41        let data = vec![0u8; 5];
42        let chunks = chunk_bytes(&data, 16);
43        assert_eq!(chunks.len(), 1);
44    }
45
46    #[test]
47    fn test_estimate() {
48        assert_eq!(estimate_chunk_count(100, 16), 7);
49        assert_eq!(estimate_chunk_count(64, 16), 4);
50        assert_eq!(estimate_chunk_count(0, 16), 0);
51    }
52}