From a771372ca15b35a5cd940f691f4de420ae0f76e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BClker?= Date: Sat, 16 Mar 2024 23:59:43 +0100 Subject: [PATCH] compression: Use the sl-std ringbuffer implementation --- crates/compression/src/brotli/mod.rs | 7 +-- crates/compression/src/lib.rs | 1 - crates/compression/src/ringbuffer.rs | 79 ---------------------------- 3 files changed, 4 insertions(+), 83 deletions(-) delete mode 100644 crates/compression/src/ringbuffer.rs diff --git a/crates/compression/src/brotli/mod.rs b/crates/compression/src/brotli/mod.rs index 993ca881..e4cde6a2 100644 --- a/crates/compression/src/brotli/mod.rs +++ b/crates/compression/src/brotli/mod.rs @@ -5,9 +5,10 @@ pub mod dictionary; use crate::{ bitreader::{self, BitReader}, huffman::{Bits, HuffmanBitTree, HuffmanTree}, - ringbuffer::RingBuffer, }; +use sl_std::ring_buffer::RingBuffer; + use std::cmp::min; macro_rules! update_block_type_and_count { @@ -149,7 +150,7 @@ pub fn decompress(source: &[u8]) -> Result, Error> { }; let window_size = (1 << wbits) - 16; - let mut past_distances = RingBuffer::new([16, 15, 11, 4]); + let mut past_distances = RingBuffer::from([16, 15, 11, 4]); let mut is_last = false; while !is_last { @@ -364,7 +365,7 @@ pub fn decompress(source: &[u8]) -> Result, Error> { // Dictionary references, 0 distances and a few transformations are not pushed if distance_code != 0 && distance < max_distance + 1 { - past_distances.push(distance); + past_distances.push_overwriting(distance); } distance }; diff --git a/crates/compression/src/lib.rs b/crates/compression/src/lib.rs index 401f33f7..9243e10d 100644 --- a/crates/compression/src/lib.rs +++ b/crates/compression/src/lib.rs @@ -9,4 +9,3 @@ pub mod zlib; pub mod bitreader; pub mod gzip; pub mod huffman; -pub mod ringbuffer; diff --git a/crates/compression/src/ringbuffer.rs b/crates/compression/src/ringbuffer.rs deleted file mode 100644 index 09217342..00000000 --- a/crates/compression/src/ringbuffer.rs +++ /dev/null @@ -1,79 +0,0 @@ -//! Implements a [circular buffer](https://en.wikipedia.org/wiki/Circular_buffer) which can hold a fixed number of items. - -#[derive(Clone, Debug)] -pub struct RingBuffer { - elements: [T; N], - ptr: usize, -} - -impl RingBuffer { - pub fn new(elements: [T; N]) -> Self { - Self { elements, ptr: 0 } - } - - #[inline] - pub fn size(&self) -> usize { - N - } - - #[inline] - pub fn push(&mut self, element: T) { - self.elements[self.ptr] = element; - self.ptr += 1; - self.ptr %= self.size(); - } - - /// Get the nth previous element from the ringbuffer. - /// - /// Note that the index is 0-based, so `nth_last(0)` returns the element that was - /// last pushed. However, you may not retrieve more than `size` previous elements. - /// - /// # Panics - /// This function panics if `index >= buffer size` - #[inline] - pub fn nth_last(&self, index: usize) -> &T { - assert!(index < self.size()); - &self.elements[(self.ptr + self.size() - index - 1) % self.size()] - } -} - -#[cfg(test)] -mod tests { - use super::RingBuffer; - - #[test] - fn test_ringbuffer() { - let mut buffer = RingBuffer::new([3, 2, 1]); - - assert_eq!(*buffer.nth_last(0), 1); - assert_eq!(*buffer.nth_last(1), 2); - assert_eq!(*buffer.nth_last(2), 3); - - buffer.push(4); - // Internal buffer should now look like this: - // [4, 2, 1] - // ^_ self.ptr - - assert_eq!(*buffer.nth_last(0), 4); - assert_eq!(*buffer.nth_last(1), 1); - assert_eq!(*buffer.nth_last(2), 2); - - buffer.push(5); - // Internal buffer should now look like this: - // [5, 4, 1] - // ^_ self.ptr - - assert_eq!(*buffer.nth_last(0), 5); - assert_eq!(*buffer.nth_last(1), 4); - assert_eq!(*buffer.nth_last(2), 1); - - buffer.push(6); - // Internal buffer should now look like this: - // [5, 4, 6] - // ^_ self.ptr - - assert_eq!(*buffer.nth_last(0), 6); - assert_eq!(*buffer.nth_last(1), 5); - assert_eq!(*buffer.nth_last(2), 4); - } -}