1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
use std::io::Write;
use std::{io, mem, cmp};
use lz77::LZ77State;
use output_writer::DynamicWriter;
use encoder_state::EncoderState;
use input_buffer::InputBuffer;
use compression_options::{CompressionOptions, MAX_HASH_CHECKS};
use huffman_table::HuffmanTable;
use compress::Flush;
pub use huffman_table::MAX_MATCH;
pub struct DeflateState<W: Write> {
pub lz77_state: LZ77State,
pub input_buffer: InputBuffer,
pub compression_options: CompressionOptions,
pub encoder_state: EncoderState,
pub lz77_writer: DynamicWriter,
pub bytes_written: u64,
pub inner: Option<W>,
pub output_buf_pos: usize,
pub flush_mode: Flush,
pub bytes_written_control: u64,
}
impl<W: Write> DeflateState<W> {
pub fn new(compression_options: CompressionOptions, writer: W) -> DeflateState<W> {
DeflateState {
input_buffer: InputBuffer::empty(),
lz77_state: LZ77State::new(
compression_options.max_hash_checks,
cmp::min(compression_options.lazy_if_less_than, MAX_HASH_CHECKS),
compression_options.matching_type,
),
encoder_state: EncoderState::new(HuffmanTable::empty(), Vec::with_capacity(1024 * 32)),
lz77_writer: DynamicWriter::new(),
compression_options: compression_options,
bytes_written: 0,
inner: Some(writer),
output_buf_pos: 0,
flush_mode: Flush::None,
bytes_written_control: 0,
}
}
pub fn output_buf(&mut self) -> &mut Vec<u8> {
self.encoder_state.inner_vec()
}
pub fn reset(&mut self, writer: W) -> io::Result<W> {
self.encoder_state.flush();
self.inner.as_mut().expect("Missing writer!").write_all(
self.encoder_state.inner_vec(),
)?;
self.encoder_state.inner_vec().clear();
self.input_buffer = InputBuffer::empty();
self.lz77_writer.clear();
self.lz77_state.reset();
self.bytes_written = 0;
self.output_buf_pos = 0;
self.flush_mode = Flush::None;
if cfg!(debug_assertions) {
self.bytes_written_control = 0;
}
mem::replace(&mut self.inner, Some(writer)).ok_or_else(|| {
io::Error::new(io::ErrorKind::Other, "Missing writer")
})
}
}