Coverage Report

Created: 2025-12-08 06:31

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/fdeflate-0.3.7/src/compress.rs
Line
Count
Source
1
use simd_adler32::Adler32;
2
use std::io::{self, Seek, SeekFrom, Write};
3
4
use crate::tables::{
5
    BITMASKS, HUFFMAN_CODES, HUFFMAN_LENGTHS, LENGTH_TO_LEN_EXTRA, LENGTH_TO_SYMBOL,
6
};
7
8
/// Compressor that produces fdeflate compressed streams.
9
pub struct Compressor<W: Write> {
10
    checksum: Adler32,
11
    buffer: u64,
12
    nbits: u8,
13
    writer: W,
14
}
15
impl<W: Write> Compressor<W> {
16
13.5M
    fn write_bits(&mut self, bits: u64, nbits: u8) -> io::Result<()> {
17
13.5M
        debug_assert!(nbits <= 64);
18
19
13.5M
        self.buffer |= bits << self.nbits;
20
13.5M
        self.nbits += nbits;
21
22
13.5M
        if self.nbits >= 64 {
23
2.53M
            self.writer.write_all(&self.buffer.to_le_bytes())?;
24
2.53M
            self.nbits -= 64;
25
2.53M
            self.buffer = bits.checked_shr((nbits - self.nbits) as u32).unwrap_or(0);
26
10.9M
        }
27
13.5M
        debug_assert!(self.nbits < 64);
28
13.5M
        Ok(())
29
13.5M
    }
<fdeflate::compress::Compressor<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>::write_bits
Line
Count
Source
16
13.5M
    fn write_bits(&mut self, bits: u64, nbits: u8) -> io::Result<()> {
17
13.5M
        debug_assert!(nbits <= 64);
18
19
13.5M
        self.buffer |= bits << self.nbits;
20
13.5M
        self.nbits += nbits;
21
22
13.5M
        if self.nbits >= 64 {
23
2.53M
            self.writer.write_all(&self.buffer.to_le_bytes())?;
24
2.53M
            self.nbits -= 64;
25
2.53M
            self.buffer = bits.checked_shr((nbits - self.nbits) as u32).unwrap_or(0);
26
10.9M
        }
27
13.5M
        debug_assert!(self.nbits < 64);
28
13.5M
        Ok(())
29
13.5M
    }
Unexecuted instantiation: <fdeflate::compress::Compressor<alloc::vec::Vec<u8>>>::write_bits
30
31
617
    fn flush(&mut self) -> io::Result<()> {
32
617
        if self.nbits % 8 != 0 {
33
531
            self.write_bits(0, 8 - self.nbits % 8)?;
34
86
        }
35
617
        if self.nbits > 0 {
36
546
            self.writer
37
546
                .write_all(&self.buffer.to_le_bytes()[..self.nbits as usize / 8])
38
546
                .unwrap();
39
546
            self.buffer = 0;
40
546
            self.nbits = 0;
41
546
        }
42
617
        Ok(())
43
617
    }
<fdeflate::compress::Compressor<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>::flush
Line
Count
Source
31
617
    fn flush(&mut self) -> io::Result<()> {
32
617
        if self.nbits % 8 != 0 {
33
531
            self.write_bits(0, 8 - self.nbits % 8)?;
34
86
        }
35
617
        if self.nbits > 0 {
36
546
            self.writer
37
546
                .write_all(&self.buffer.to_le_bytes()[..self.nbits as usize / 8])
38
546
                .unwrap();
39
546
            self.buffer = 0;
40
546
            self.nbits = 0;
41
546
        }
42
617
        Ok(())
43
617
    }
Unexecuted instantiation: <fdeflate::compress::Compressor<alloc::vec::Vec<u8>>>::flush
44
45
344k
    fn write_run(&mut self, mut run: u32) -> io::Result<()> {
46
344k
        self.write_bits(HUFFMAN_CODES[0] as u64, HUFFMAN_LENGTHS[0])?;
47
344k
        run -= 1;
48
49
347k
        while run >= 258 {
50
2.74k
            self.write_bits(HUFFMAN_CODES[285] as u64, HUFFMAN_LENGTHS[285] + 1)?;
51
2.74k
            run -= 258;
52
        }
53
54
344k
        if run > 4 {
55
176k
            let sym = LENGTH_TO_SYMBOL[run as usize - 3] as usize;
56
176k
            self.write_bits(HUFFMAN_CODES[sym] as u64, HUFFMAN_LENGTHS[sym])?;
57
58
176k
            let len_extra = LENGTH_TO_LEN_EXTRA[run as usize - 3];
59
176k
            let extra = ((run - 3) & BITMASKS[len_extra as usize]) as u64;
60
176k
            self.write_bits(extra, len_extra + 1)?;
61
        } else {
62
168k
            debug_assert_eq!(HUFFMAN_CODES[0], 0);
63
168k
            self.write_bits(0, run as u8 * HUFFMAN_LENGTHS[0])?;
64
        }
65
66
344k
        Ok(())
67
344k
    }
<fdeflate::compress::Compressor<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>::write_run
Line
Count
Source
45
344k
    fn write_run(&mut self, mut run: u32) -> io::Result<()> {
46
344k
        self.write_bits(HUFFMAN_CODES[0] as u64, HUFFMAN_LENGTHS[0])?;
47
344k
        run -= 1;
48
49
347k
        while run >= 258 {
50
2.74k
            self.write_bits(HUFFMAN_CODES[285] as u64, HUFFMAN_LENGTHS[285] + 1)?;
51
2.74k
            run -= 258;
52
        }
53
54
344k
        if run > 4 {
55
176k
            let sym = LENGTH_TO_SYMBOL[run as usize - 3] as usize;
56
176k
            self.write_bits(HUFFMAN_CODES[sym] as u64, HUFFMAN_LENGTHS[sym])?;
57
58
176k
            let len_extra = LENGTH_TO_LEN_EXTRA[run as usize - 3];
59
176k
            let extra = ((run - 3) & BITMASKS[len_extra as usize]) as u64;
60
176k
            self.write_bits(extra, len_extra + 1)?;
61
        } else {
62
168k
            debug_assert_eq!(HUFFMAN_CODES[0], 0);
63
168k
            self.write_bits(0, run as u8 * HUFFMAN_LENGTHS[0])?;
64
        }
65
66
344k
        Ok(())
67
344k
    }
Unexecuted instantiation: <fdeflate::compress::Compressor<alloc::vec::Vec<u8>>>::write_run
68
69
    /// Create a new Compressor.
70
617
    pub fn new(writer: W) -> io::Result<Self> {
71
617
        let mut compressor = Self {
72
617
            checksum: Adler32::new(),
73
617
            buffer: 0,
74
617
            nbits: 0,
75
617
            writer,
76
617
        };
77
617
        compressor.write_headers()?;
78
617
        Ok(compressor)
79
617
    }
<fdeflate::compress::Compressor<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>::new
Line
Count
Source
70
617
    pub fn new(writer: W) -> io::Result<Self> {
71
617
        let mut compressor = Self {
72
617
            checksum: Adler32::new(),
73
617
            buffer: 0,
74
617
            nbits: 0,
75
617
            writer,
76
617
        };
77
617
        compressor.write_headers()?;
78
617
        Ok(compressor)
79
617
    }
Unexecuted instantiation: <fdeflate::compress::Compressor<alloc::vec::Vec<u8>>>::new
80
81
617
    fn write_headers(&mut self) -> io::Result<()> {
82
        const HEADER: [u8; 54] = [
83
            120, 1, 237, 192, 3, 160, 36, 89, 150, 198, 241, 255, 119, 238, 141, 200, 204, 167,
84
            114, 75, 99, 174, 109, 219, 182, 109, 219, 182, 109, 219, 182, 109, 105, 140, 158, 150,
85
            74, 175, 158, 50, 51, 34, 238, 249, 118, 183, 106, 122, 166, 135, 59, 107, 213, 15,
86
        ];
87
617
        self.writer.write_all(&HEADER[..53]).unwrap();
88
617
        self.write_bits(HEADER[53] as u64, 5)?;
89
90
617
        Ok(())
91
617
    }
<fdeflate::compress::Compressor<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>::write_headers
Line
Count
Source
81
617
    fn write_headers(&mut self) -> io::Result<()> {
82
        const HEADER: [u8; 54] = [
83
            120, 1, 237, 192, 3, 160, 36, 89, 150, 198, 241, 255, 119, 238, 141, 200, 204, 167,
84
            114, 75, 99, 174, 109, 219, 182, 109, 219, 182, 109, 219, 182, 109, 105, 140, 158, 150,
85
            74, 175, 158, 50, 51, 34, 238, 249, 118, 183, 106, 122, 166, 135, 59, 107, 213, 15,
86
        ];
87
617
        self.writer.write_all(&HEADER[..53]).unwrap();
88
617
        self.write_bits(HEADER[53] as u64, 5)?;
89
90
617
        Ok(())
91
617
    }
Unexecuted instantiation: <fdeflate::compress::Compressor<alloc::vec::Vec<u8>>>::write_headers
92
93
    /// Write data to the compressor.
94
4.83M
    pub fn write_data(&mut self, data: &[u8]) -> io::Result<()> {
95
4.83M
        self.checksum.write(data);
96
97
4.83M
        let mut run = 0;
98
4.83M
        let mut chunks = data.chunks_exact(8);
99
6.32M
        for chunk in &mut chunks {
100
1.49M
            let ichunk = u64::from_le_bytes(chunk.try_into().unwrap());
101
102
1.49M
            if ichunk == 0 {
103
173k
                run += 8;
104
173k
                continue;
105
1.31M
            } else if run > 0 {
106
148k
                let run_extra = ichunk.trailing_zeros() / 8;
107
148k
                self.write_run(run + run_extra)?;
108
148k
                run = 0;
109
110
148k
                if run_extra > 0 {
111
33.8k
                    run = ichunk.leading_zeros() / 8;
112
124k
                    for &b in &chunk[run_extra as usize..8 - run as usize] {
113
124k
                        self.write_bits(
114
124k
                            HUFFMAN_CODES[b as usize] as u64,
115
124k
                            HUFFMAN_LENGTHS[b as usize],
116
0
                        )?;
117
                    }
118
33.8k
                    continue;
119
114k
                }
120
1.16M
            }
121
122
1.28M
            let run_start = ichunk.leading_zeros() / 8;
123
1.28M
            if run_start > 0 {
124
1.28M
                for &b in &chunk[..8 - run_start as usize] {
125
1.28M
                    self.write_bits(
126
1.28M
                        HUFFMAN_CODES[b as usize] as u64,
127
1.28M
                        HUFFMAN_LENGTHS[b as usize],
128
0
                    )?;
129
                }
130
325k
                run = run_start;
131
325k
                continue;
132
958k
            }
133
134
958k
            let n0 = HUFFMAN_LENGTHS[chunk[0] as usize];
135
958k
            let n1 = HUFFMAN_LENGTHS[chunk[1] as usize];
136
958k
            let n2 = HUFFMAN_LENGTHS[chunk[2] as usize];
137
958k
            let n3 = HUFFMAN_LENGTHS[chunk[3] as usize];
138
958k
            let bits = HUFFMAN_CODES[chunk[0] as usize] as u64
139
958k
                | ((HUFFMAN_CODES[chunk[1] as usize] as u64) << n0)
140
958k
                | ((HUFFMAN_CODES[chunk[2] as usize] as u64) << (n0 + n1))
141
958k
                | ((HUFFMAN_CODES[chunk[3] as usize] as u64) << (n0 + n1 + n2));
142
958k
            self.write_bits(bits, n0 + n1 + n2 + n3)?;
143
144
958k
            let n4 = HUFFMAN_LENGTHS[chunk[4] as usize];
145
958k
            let n5 = HUFFMAN_LENGTHS[chunk[5] as usize];
146
958k
            let n6 = HUFFMAN_LENGTHS[chunk[6] as usize];
147
958k
            let n7 = HUFFMAN_LENGTHS[chunk[7] as usize];
148
958k
            let bits2 = HUFFMAN_CODES[chunk[4] as usize] as u64
149
958k
                | ((HUFFMAN_CODES[chunk[5] as usize] as u64) << n4)
150
958k
                | ((HUFFMAN_CODES[chunk[6] as usize] as u64) << (n4 + n5))
151
958k
                | ((HUFFMAN_CODES[chunk[7] as usize] as u64) << (n4 + n5 + n6));
152
958k
            self.write_bits(bits2, n4 + n5 + n6 + n7)?;
153
        }
154
155
4.83M
        if run > 0 {
156
195k
            self.write_run(run)?;
157
4.63M
        }
158
159
9.33M
        for &b in chunks.remainder() {
160
9.33M
            self.write_bits(
161
9.33M
                HUFFMAN_CODES[b as usize] as u64,
162
9.33M
                HUFFMAN_LENGTHS[b as usize],
163
0
            )?;
164
        }
165
166
4.83M
        Ok(())
167
4.83M
    }
<fdeflate::compress::Compressor<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>::write_data
Line
Count
Source
94
4.83M
    pub fn write_data(&mut self, data: &[u8]) -> io::Result<()> {
95
4.83M
        self.checksum.write(data);
96
97
4.83M
        let mut run = 0;
98
4.83M
        let mut chunks = data.chunks_exact(8);
99
6.32M
        for chunk in &mut chunks {
100
1.49M
            let ichunk = u64::from_le_bytes(chunk.try_into().unwrap());
101
102
1.49M
            if ichunk == 0 {
103
173k
                run += 8;
104
173k
                continue;
105
1.31M
            } else if run > 0 {
106
148k
                let run_extra = ichunk.trailing_zeros() / 8;
107
148k
                self.write_run(run + run_extra)?;
108
148k
                run = 0;
109
110
148k
                if run_extra > 0 {
111
33.8k
                    run = ichunk.leading_zeros() / 8;
112
124k
                    for &b in &chunk[run_extra as usize..8 - run as usize] {
113
124k
                        self.write_bits(
114
124k
                            HUFFMAN_CODES[b as usize] as u64,
115
124k
                            HUFFMAN_LENGTHS[b as usize],
116
0
                        )?;
117
                    }
118
33.8k
                    continue;
119
114k
                }
120
1.16M
            }
121
122
1.28M
            let run_start = ichunk.leading_zeros() / 8;
123
1.28M
            if run_start > 0 {
124
1.28M
                for &b in &chunk[..8 - run_start as usize] {
125
1.28M
                    self.write_bits(
126
1.28M
                        HUFFMAN_CODES[b as usize] as u64,
127
1.28M
                        HUFFMAN_LENGTHS[b as usize],
128
0
                    )?;
129
                }
130
325k
                run = run_start;
131
325k
                continue;
132
958k
            }
133
134
958k
            let n0 = HUFFMAN_LENGTHS[chunk[0] as usize];
135
958k
            let n1 = HUFFMAN_LENGTHS[chunk[1] as usize];
136
958k
            let n2 = HUFFMAN_LENGTHS[chunk[2] as usize];
137
958k
            let n3 = HUFFMAN_LENGTHS[chunk[3] as usize];
138
958k
            let bits = HUFFMAN_CODES[chunk[0] as usize] as u64
139
958k
                | ((HUFFMAN_CODES[chunk[1] as usize] as u64) << n0)
140
958k
                | ((HUFFMAN_CODES[chunk[2] as usize] as u64) << (n0 + n1))
141
958k
                | ((HUFFMAN_CODES[chunk[3] as usize] as u64) << (n0 + n1 + n2));
142
958k
            self.write_bits(bits, n0 + n1 + n2 + n3)?;
143
144
958k
            let n4 = HUFFMAN_LENGTHS[chunk[4] as usize];
145
958k
            let n5 = HUFFMAN_LENGTHS[chunk[5] as usize];
146
958k
            let n6 = HUFFMAN_LENGTHS[chunk[6] as usize];
147
958k
            let n7 = HUFFMAN_LENGTHS[chunk[7] as usize];
148
958k
            let bits2 = HUFFMAN_CODES[chunk[4] as usize] as u64
149
958k
                | ((HUFFMAN_CODES[chunk[5] as usize] as u64) << n4)
150
958k
                | ((HUFFMAN_CODES[chunk[6] as usize] as u64) << (n4 + n5))
151
958k
                | ((HUFFMAN_CODES[chunk[7] as usize] as u64) << (n4 + n5 + n6));
152
958k
            self.write_bits(bits2, n4 + n5 + n6 + n7)?;
153
        }
154
155
4.83M
        if run > 0 {
156
195k
            self.write_run(run)?;
157
4.63M
        }
158
159
9.33M
        for &b in chunks.remainder() {
160
9.33M
            self.write_bits(
161
9.33M
                HUFFMAN_CODES[b as usize] as u64,
162
9.33M
                HUFFMAN_LENGTHS[b as usize],
163
0
            )?;
164
        }
165
166
4.83M
        Ok(())
167
4.83M
    }
Unexecuted instantiation: <fdeflate::compress::Compressor<alloc::vec::Vec<u8>>>::write_data
168
169
    /// Write the remainder of the stream and return the inner writer.
170
617
    pub fn finish(mut self) -> io::Result<W> {
171
        // Write end of block
172
617
        self.write_bits(HUFFMAN_CODES[256] as u64, HUFFMAN_LENGTHS[256])?;
173
617
        self.flush()?;
174
175
        // Write Adler32 checksum
176
617
        let checksum: u32 = self.checksum.finish();
177
617
        self.writer
178
617
            .write_all(checksum.to_be_bytes().as_ref())
179
617
            .unwrap();
180
617
        Ok(self.writer)
181
617
    }
<fdeflate::compress::Compressor<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>::finish
Line
Count
Source
170
617
    pub fn finish(mut self) -> io::Result<W> {
171
        // Write end of block
172
617
        self.write_bits(HUFFMAN_CODES[256] as u64, HUFFMAN_LENGTHS[256])?;
173
617
        self.flush()?;
174
175
        // Write Adler32 checksum
176
617
        let checksum: u32 = self.checksum.finish();
177
617
        self.writer
178
617
            .write_all(checksum.to_be_bytes().as_ref())
179
617
            .unwrap();
180
617
        Ok(self.writer)
181
617
    }
Unexecuted instantiation: <fdeflate::compress::Compressor<alloc::vec::Vec<u8>>>::finish
182
}
183
184
/// Compressor that only writes the stored blocks.
185
///
186
/// This is useful for writing files that are not compressed, but still need to be wrapped in a
187
/// zlib stream.
188
pub struct StoredOnlyCompressor<W> {
189
    writer: W,
190
    checksum: Adler32,
191
    block_bytes: u16,
192
}
193
impl<W: Write + Seek> StoredOnlyCompressor<W> {
194
    /// Creates a new `StoredOnlyCompressor` that writes to the given writer.
195
476
    pub fn new(mut writer: W) -> io::Result<Self> {
196
476
        writer.write_all(&[0x78, 0x01])?; // zlib header
197
476
        writer.write_all(&[0; 5])?; // placeholder stored block header
198
199
476
        Ok(Self {
200
476
            writer,
201
476
            checksum: Adler32::new(),
202
476
            block_bytes: 0,
203
476
        })
204
476
    }
<fdeflate::compress::StoredOnlyCompressor<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>::new
Line
Count
Source
195
476
    pub fn new(mut writer: W) -> io::Result<Self> {
196
476
        writer.write_all(&[0x78, 0x01])?; // zlib header
197
476
        writer.write_all(&[0; 5])?; // placeholder stored block header
198
199
476
        Ok(Self {
200
476
            writer,
201
476
            checksum: Adler32::new(),
202
476
            block_bytes: 0,
203
476
        })
204
476
    }
Unexecuted instantiation: <fdeflate::compress::StoredOnlyCompressor<_>>::new
205
206
809
    fn set_block_header(&mut self, size: u16, last: bool) -> io::Result<()> {
207
809
        self.writer.seek(SeekFrom::Current(-(size as i64 + 5)))?;
208
809
        self.writer.write_all(&[
209
809
            last as u8,
210
809
            (size & 0xFF) as u8,
211
809
            ((size >> 8) & 0xFF) as u8,
212
809
            (!size & 0xFF) as u8,
213
809
            ((!size >> 8) & 0xFF) as u8,
214
809
        ])?;
215
809
        self.writer.seek(SeekFrom::Current(size as i64))?;
216
217
809
        Ok(())
218
809
    }
<fdeflate::compress::StoredOnlyCompressor<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>::set_block_header
Line
Count
Source
206
809
    fn set_block_header(&mut self, size: u16, last: bool) -> io::Result<()> {
207
809
        self.writer.seek(SeekFrom::Current(-(size as i64 + 5)))?;
208
809
        self.writer.write_all(&[
209
809
            last as u8,
210
809
            (size & 0xFF) as u8,
211
809
            ((size >> 8) & 0xFF) as u8,
212
809
            (!size & 0xFF) as u8,
213
809
            ((!size >> 8) & 0xFF) as u8,
214
809
        ])?;
215
809
        self.writer.seek(SeekFrom::Current(size as i64))?;
216
217
809
        Ok(())
218
809
    }
Unexecuted instantiation: <fdeflate::compress::StoredOnlyCompressor<_>>::set_block_header
219
220
    /// Writes the given data to the underlying writer.
221
14.3M
    pub fn write_data(&mut self, mut data: &[u8]) -> io::Result<()> {
222
14.3M
        self.checksum.write(data);
223
28.6M
        while !data.is_empty() {
224
14.3M
            if self.block_bytes == u16::MAX {
225
333
                self.set_block_header(u16::MAX, false)?;
226
333
                self.writer.write_all(&[0; 5])?; // placeholder stored block header
227
333
                self.block_bytes = 0;
228
14.3M
            }
229
230
14.3M
            let prefix_bytes = data.len().min((u16::MAX - self.block_bytes) as usize);
231
14.3M
            self.writer.write_all(&data[..prefix_bytes])?;
232
14.3M
            self.block_bytes += prefix_bytes as u16;
233
14.3M
            data = &data[prefix_bytes..];
234
        }
235
236
14.3M
        Ok(())
237
14.3M
    }
<fdeflate::compress::StoredOnlyCompressor<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>::write_data
Line
Count
Source
221
14.3M
    pub fn write_data(&mut self, mut data: &[u8]) -> io::Result<()> {
222
14.3M
        self.checksum.write(data);
223
28.6M
        while !data.is_empty() {
224
14.3M
            if self.block_bytes == u16::MAX {
225
333
                self.set_block_header(u16::MAX, false)?;
226
333
                self.writer.write_all(&[0; 5])?; // placeholder stored block header
227
333
                self.block_bytes = 0;
228
14.3M
            }
229
230
14.3M
            let prefix_bytes = data.len().min((u16::MAX - self.block_bytes) as usize);
231
14.3M
            self.writer.write_all(&data[..prefix_bytes])?;
232
14.3M
            self.block_bytes += prefix_bytes as u16;
233
14.3M
            data = &data[prefix_bytes..];
234
        }
235
236
14.3M
        Ok(())
237
14.3M
    }
Unexecuted instantiation: <fdeflate::compress::StoredOnlyCompressor<_>>::write_data
238
239
    /// Finish writing the final block and return the underlying writer.
240
476
    pub fn finish(mut self) -> io::Result<W> {
241
476
        self.set_block_header(self.block_bytes, true)?;
242
243
        // Write Adler32 checksum
244
476
        let checksum: u32 = self.checksum.finish();
245
476
        self.writer
246
476
            .write_all(checksum.to_be_bytes().as_ref())
247
476
            .unwrap();
248
249
476
        Ok(self.writer)
250
476
    }
<fdeflate::compress::StoredOnlyCompressor<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>::finish
Line
Count
Source
240
476
    pub fn finish(mut self) -> io::Result<W> {
241
476
        self.set_block_header(self.block_bytes, true)?;
242
243
        // Write Adler32 checksum
244
476
        let checksum: u32 = self.checksum.finish();
245
476
        self.writer
246
476
            .write_all(checksum.to_be_bytes().as_ref())
247
476
            .unwrap();
248
249
476
        Ok(self.writer)
250
476
    }
Unexecuted instantiation: <fdeflate::compress::StoredOnlyCompressor<_>>::finish
251
}
252
impl<W> StoredOnlyCompressor<W> {
253
    /// Return the number of bytes that will be written to the output stream
254
    /// for the given input size. Because this compressor only writes stored blocks,
255
    /// the output size is always slightly *larger* than the input size.
256
617
    pub fn compressed_size(raw_size: usize) -> usize {
257
617
        (raw_size.saturating_sub(1) / u16::MAX as usize) * (u16::MAX as usize + 5)
258
617
            + (raw_size % u16::MAX as usize + 5)
259
617
            + 6
260
617
    }
<fdeflate::compress::StoredOnlyCompressor<()>>::compressed_size
Line
Count
Source
256
617
    pub fn compressed_size(raw_size: usize) -> usize {
257
617
        (raw_size.saturating_sub(1) / u16::MAX as usize) * (u16::MAX as usize + 5)
258
617
            + (raw_size % u16::MAX as usize + 5)
259
617
            + 6
260
617
    }
Unexecuted instantiation: <fdeflate::compress::StoredOnlyCompressor<_>>::compressed_size
261
}
262
263
/// Compresses the given data.
264
0
pub fn compress_to_vec(input: &[u8]) -> Vec<u8> {
265
0
    let mut compressor = Compressor::new(Vec::with_capacity(input.len() / 4)).unwrap();
266
0
    compressor.write_data(input).unwrap();
267
0
    compressor.finish().unwrap()
268
0
}
269
270
#[cfg(test)]
271
mod tests {
272
    use super::*;
273
    use rand::Rng;
274
275
    fn roundtrip(data: &[u8]) {
276
        let compressed = compress_to_vec(data);
277
        let decompressed = miniz_oxide::inflate::decompress_to_vec_zlib(&compressed).unwrap();
278
        assert_eq!(&decompressed, data);
279
    }
280
281
    #[test]
282
    fn it_works() {
283
        roundtrip(b"Hello world!");
284
    }
285
286
    #[test]
287
    fn constant() {
288
        roundtrip(&vec![0; 2048]);
289
        roundtrip(&vec![5; 2048]);
290
        roundtrip(&vec![128; 2048]);
291
        roundtrip(&vec![254; 2048]);
292
    }
293
294
    #[test]
295
    fn random() {
296
        let mut rng = rand::thread_rng();
297
        let mut data = vec![0; 2048];
298
        for _ in 0..10 {
299
            for byte in &mut data {
300
                *byte = rng.gen();
301
            }
302
            roundtrip(&data);
303
        }
304
    }
305
}