summaryrefslogtreecommitdiffstats
path: root/vendor/ruzstd/src/decoding/scratch.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-18 02:49:50 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-18 02:49:50 +0000
commit9835e2ae736235810b4ea1c162ca5e65c547e770 (patch)
tree3fcebf40ed70e581d776a8a4c65923e8ec20e026 /vendor/ruzstd/src/decoding/scratch.rs
parentReleasing progress-linux version 1.70.0+dfsg2-1~progress7.99u1. (diff)
downloadrustc-9835e2ae736235810b4ea1c162ca5e65c547e770.tar.xz
rustc-9835e2ae736235810b4ea1c162ca5e65c547e770.zip
Merging upstream version 1.71.1+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/ruzstd/src/decoding/scratch.rs')
-rw-r--r--vendor/ruzstd/src/decoding/scratch.rs128
1 files changed, 128 insertions, 0 deletions
diff --git a/vendor/ruzstd/src/decoding/scratch.rs b/vendor/ruzstd/src/decoding/scratch.rs
new file mode 100644
index 000000000..2bd753bde
--- /dev/null
+++ b/vendor/ruzstd/src/decoding/scratch.rs
@@ -0,0 +1,128 @@
+use super::super::blocks::sequence_section::Sequence;
+use super::decodebuffer::Decodebuffer;
+use crate::decoding::dictionary::Dictionary;
+use crate::fse::FSETable;
+use crate::huff0::HuffmanTable;
+
+pub struct DecoderScratch {
+ pub huf: HuffmanScratch,
+ pub fse: FSEScratch,
+ pub buffer: Decodebuffer,
+ pub offset_hist: [u32; 3],
+
+ pub literals_buffer: Vec<u8>,
+ pub sequences: Vec<Sequence>,
+ pub block_content_buffer: Vec<u8>,
+}
+
+impl DecoderScratch {
+ pub fn new(window_size: usize) -> DecoderScratch {
+ DecoderScratch {
+ huf: HuffmanScratch {
+ table: HuffmanTable::new(),
+ },
+ fse: FSEScratch {
+ offsets: FSETable::new(),
+ of_rle: None,
+ literal_lengths: FSETable::new(),
+ ll_rle: None,
+ match_lengths: FSETable::new(),
+ ml_rle: None,
+ },
+ buffer: Decodebuffer::new(window_size),
+ offset_hist: [1, 4, 8],
+
+ block_content_buffer: Vec::new(),
+ literals_buffer: Vec::new(),
+ sequences: Vec::new(),
+ }
+ }
+
+ pub fn reset(&mut self, window_size: usize) {
+ self.offset_hist = [1, 4, 8];
+ self.literals_buffer.clear();
+ self.sequences.clear();
+ self.block_content_buffer.clear();
+
+ self.buffer.reset(window_size);
+
+ self.fse.literal_lengths.reset();
+ self.fse.match_lengths.reset();
+ self.fse.offsets.reset();
+ self.fse.ll_rle = None;
+ self.fse.ml_rle = None;
+ self.fse.of_rle = None;
+
+ self.huf.table.reset();
+ }
+
+ pub fn use_dict(&mut self, dict: &Dictionary) {
+ self.fse = dict.fse.clone();
+ self.huf = dict.huf.clone();
+ self.offset_hist = dict.offset_hist;
+ self.buffer.dict_content = dict.dict_content.clone();
+ }
+
+ /// parses the dictionary and set the tables
+ /// it returns the dict_id for checking with the frame's dict_id
+ pub fn load_dict(
+ &mut self,
+ raw: &[u8],
+ ) -> Result<u32, super::dictionary::DictionaryDecodeError> {
+ let dict = super::dictionary::Dictionary::decode_dict(raw)?;
+
+ self.huf = dict.huf.clone();
+ self.fse = dict.fse.clone();
+ self.offset_hist = dict.offset_hist;
+ self.buffer.dict_content = dict.dict_content.clone();
+ Ok(dict.id)
+ }
+}
+
+#[derive(Clone)]
+pub struct HuffmanScratch {
+ pub table: HuffmanTable,
+}
+
+impl HuffmanScratch {
+ pub fn new() -> HuffmanScratch {
+ HuffmanScratch {
+ table: HuffmanTable::new(),
+ }
+ }
+}
+
+impl Default for HuffmanScratch {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+#[derive(Clone)]
+pub struct FSEScratch {
+ pub offsets: FSETable,
+ pub of_rle: Option<u8>,
+ pub literal_lengths: FSETable,
+ pub ll_rle: Option<u8>,
+ pub match_lengths: FSETable,
+ pub ml_rle: Option<u8>,
+}
+
+impl FSEScratch {
+ pub fn new() -> FSEScratch {
+ FSEScratch {
+ offsets: FSETable::new(),
+ of_rle: None,
+ literal_lengths: FSETable::new(),
+ ll_rle: None,
+ match_lengths: FSETable::new(),
+ ml_rle: None,
+ }
+ }
+}
+
+impl Default for FSEScratch {
+ fn default() -> Self {
+ Self::new()
+ }
+}