Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 26 additions & 28 deletions crates/compression-codecs/src/brotli/decoder.rs
Original file line number Diff line number Diff line change
@@ -1,37 +1,45 @@
use crate::Decode;
use brotli::{enc::StandardAlloc, BrotliDecompressStream, BrotliResult, BrotliState};
use compression_core::util::PartialBuffer;
use crate::DecodeV2;
use brotli::{enc::StandardAlloc, BrotliDecompressStream, BrotliResult};
use compression_core::util::{PartialBuffer, WriteBuffer};
use std::{fmt, io};

type BrotliState = brotli::BrotliState<StandardAlloc, StandardAlloc, StandardAlloc>;

pub struct BrotliDecoder {
// `BrotliState` is very large (over 2kb) which is why we're boxing it.
state: Box<BrotliState<StandardAlloc, StandardAlloc, StandardAlloc>>,
state: Box<BrotliState>,
}

impl Default for BrotliDecoder {
fn default() -> Self {
Self {
state: Box::new(BrotliState::new(
StandardAlloc::default(),
StandardAlloc::default(),
StandardAlloc::default(),
)),
state: Box::new(Self::new_brotli_state()),
}
}
}

impl BrotliDecoder {
fn new_brotli_state() -> BrotliState {
BrotliState::new(
StandardAlloc::default(),
StandardAlloc::default(),
StandardAlloc::default(),
)
}

pub fn new() -> Self {
Self::default()
}

fn decode(
&mut self,
input: &mut PartialBuffer<impl AsRef<[u8]>>,
output: &mut PartialBuffer<impl AsRef<[u8]> + AsMut<[u8]>>,
input: &mut PartialBuffer<&[u8]>,
output: &mut WriteBuffer<'_>,
) -> io::Result<BrotliResult> {
output.initialize_unwritten();

let in_buf = input.unwritten();
let out_buf = output.unwritten_mut();
let out_buf = output.unwritten_initialized_mut();

let mut input_len = 0;
let mut output_len = 0;
Expand All @@ -57,20 +65,16 @@ impl BrotliDecoder {
}
}

impl Decode for BrotliDecoder {
impl DecodeV2 for BrotliDecoder {
fn reinit(&mut self) -> io::Result<()> {
self.state = Box::new(BrotliState::new(
StandardAlloc::default(),
StandardAlloc::default(),
StandardAlloc::default(),
));
*self.state = Self::new_brotli_state();
Ok(())
}

fn decode(
&mut self,
input: &mut PartialBuffer<impl AsRef<[u8]>>,
output: &mut PartialBuffer<impl AsRef<[u8]> + AsMut<[u8]>>,
input: &mut PartialBuffer<&[u8]>,
output: &mut WriteBuffer<'_>,
) -> io::Result<bool> {
match self.decode(input, output)? {
BrotliResult::ResultSuccess => Ok(true),
Expand All @@ -79,21 +83,15 @@ impl Decode for BrotliDecoder {
}
}

fn flush(
&mut self,
output: &mut PartialBuffer<impl AsRef<[u8]> + AsMut<[u8]>>,
) -> io::Result<bool> {
fn flush(&mut self, output: &mut WriteBuffer<'_>) -> io::Result<bool> {
match self.decode(&mut PartialBuffer::new(&[][..]), output)? {
BrotliResult::ResultSuccess | BrotliResult::NeedsMoreInput => Ok(true),
BrotliResult::NeedsMoreOutput => Ok(false),
BrotliResult::ResultFailure => unreachable!(),
}
}

fn finish(
&mut self,
output: &mut PartialBuffer<impl AsRef<[u8]> + AsMut<[u8]>>,
) -> io::Result<bool> {
fn finish(&mut self, output: &mut WriteBuffer<'_>) -> io::Result<bool> {
match self.decode(&mut PartialBuffer::new(&[][..]), output)? {
BrotliResult::ResultSuccess => Ok(true),
BrotliResult::NeedsMoreOutput => Ok(false),
Expand Down
28 changes: 12 additions & 16 deletions crates/compression-codecs/src/brotli/encoder.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
use crate::{brotli::params::EncoderParams, Encode};
use crate::{brotli::params::EncoderParams, EncodeV2};
use brotli::enc::{
backward_references::BrotliEncoderParams,
encode::{BrotliEncoderOperation, BrotliEncoderStateStruct},
StandardAlloc,
};
use compression_core::util::PartialBuffer;
use compression_core::util::{PartialBuffer, WriteBuffer};
use std::{fmt, io};

pub struct BrotliEncoder {
Expand All @@ -21,12 +21,14 @@ impl BrotliEncoder {

fn encode(
&mut self,
input: &mut PartialBuffer<impl AsRef<[u8]>>,
output: &mut PartialBuffer<impl AsRef<[u8]> + AsMut<[u8]>>,
input: &mut PartialBuffer<&[u8]>,
output: &mut WriteBuffer<'_>,
op: BrotliEncoderOperation,
) -> io::Result<()> {
output.initialize_unwritten();

let in_buf = input.unwritten();
let out_buf = output.unwritten_mut();
let out_buf = output.unwritten_initialized_mut();

let mut input_len = 0;
let mut output_len = 0;
Expand All @@ -52,11 +54,11 @@ impl BrotliEncoder {
}
}

impl Encode for BrotliEncoder {
impl EncodeV2 for BrotliEncoder {
fn encode(
&mut self,
input: &mut PartialBuffer<impl AsRef<[u8]>>,
output: &mut PartialBuffer<impl AsRef<[u8]> + AsMut<[u8]>>,
input: &mut PartialBuffer<&[u8]>,
output: &mut WriteBuffer<'_>,
) -> io::Result<()> {
self.encode(
input,
Expand All @@ -65,10 +67,7 @@ impl Encode for BrotliEncoder {
)
}

fn flush(
&mut self,
output: &mut PartialBuffer<impl AsRef<[u8]> + AsMut<[u8]>>,
) -> io::Result<bool> {
fn flush(&mut self, output: &mut WriteBuffer<'_>) -> io::Result<bool> {
self.encode(
&mut PartialBuffer::new(&[][..]),
output,
Expand All @@ -78,10 +77,7 @@ impl Encode for BrotliEncoder {
Ok(!self.state.has_more_output())
}

fn finish(
&mut self,
output: &mut PartialBuffer<impl AsRef<[u8]> + AsMut<[u8]>>,
) -> io::Result<bool> {
fn finish(&mut self, output: &mut WriteBuffer<'_>) -> io::Result<bool> {
self.encode(
&mut PartialBuffer::new(&[][..]),
output,
Expand Down
34 changes: 15 additions & 19 deletions crates/compression-codecs/src/bzip2/decoder.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::Decode;
use crate::DecodeV2;
use bzip2::{Decompress, Status};
use compression_core::util::PartialBuffer;
use compression_core::util::{PartialBuffer, WriteBuffer};
use std::{fmt, io};

pub struct BzDecoder {
Expand Down Expand Up @@ -33,15 +33,17 @@ impl BzDecoder {

fn decode(
&mut self,
input: &mut PartialBuffer<impl AsRef<[u8]>>,
output: &mut PartialBuffer<impl AsRef<[u8]> + AsMut<[u8]>>,
input: &mut PartialBuffer<&[u8]>,
output: &mut WriteBuffer<'_>,
) -> io::Result<Status> {
output.initialize_unwritten();

let prior_in = self.decompress.total_in();
let prior_out = self.decompress.total_out();

let status = self
.decompress
.decompress(input.unwritten(), output.unwritten_mut())
.decompress(input.unwritten(), output.unwritten_initialized_mut())
.map_err(io::Error::other)?;

input.advance((self.decompress.total_in() - prior_in) as usize);
Expand All @@ -51,16 +53,16 @@ impl BzDecoder {
}
}

impl Decode for BzDecoder {
impl DecodeV2 for BzDecoder {
fn reinit(&mut self) -> io::Result<()> {
self.decompress = Decompress::new(false);
Ok(())
}

fn decode(
&mut self,
input: &mut PartialBuffer<impl AsRef<[u8]>>,
output: &mut PartialBuffer<impl AsRef<[u8]> + AsMut<[u8]>>,
input: &mut PartialBuffer<&[u8]>,
output: &mut WriteBuffer<'_>,
) -> io::Result<bool> {
match self.decode(input, output)? {
// Decompression went fine, nothing much to report.
Expand All @@ -84,27 +86,21 @@ impl Decode for BzDecoder {
}
}

fn flush(
&mut self,
output: &mut PartialBuffer<impl AsRef<[u8]> + AsMut<[u8]>>,
) -> io::Result<bool> {
fn flush(&mut self, output: &mut WriteBuffer<'_>) -> io::Result<bool> {
self.decode(&mut PartialBuffer::new(&[][..]), output)?;

loop {
let old_len = output.written().len();
let old_len = output.written_len();
self.decode(&mut PartialBuffer::new(&[][..]), output)?;
if output.written().len() == old_len {
if output.written_len() == old_len {
break;
}
}

Ok(!output.unwritten().is_empty())
Ok(!output.has_no_spare_space())
}

fn finish(
&mut self,
_output: &mut PartialBuffer<impl AsRef<[u8]> + AsMut<[u8]>>,
) -> io::Result<bool> {
fn finish(&mut self, _output: &mut WriteBuffer<'_>) -> io::Result<bool> {
Ok(true)
}
}
32 changes: 16 additions & 16 deletions crates/compression-codecs/src/bzip2/encoder.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::{bzip2::params::Bzip2EncoderParams, Encode};
use crate::{bzip2::params::Bzip2EncoderParams, EncodeV2};
use bzip2::{Action, Compress, Compression, Status};
use compression_core::util::PartialBuffer;
use compression_core::util::{PartialBuffer, WriteBuffer};
use std::{fmt, io};

pub struct BzEncoder {
Expand Down Expand Up @@ -48,16 +48,22 @@ impl BzEncoder {

fn encode(
&mut self,
input: &mut PartialBuffer<impl AsRef<[u8]>>,
output: &mut PartialBuffer<impl AsRef<[u8]> + AsMut<[u8]>>,
input: &mut PartialBuffer<&[u8]>,
output: &mut WriteBuffer<'_>,
action: Action,
) -> io::Result<Status> {
output.initialize_unwritten();

let prior_in = self.compress.total_in();
let prior_out = self.compress.total_out();

let status = self
.compress
.compress(input.unwritten(), output.unwritten_mut(), action)
.compress(
input.unwritten(),
output.unwritten_initialized_mut(),
action,
)
.map_err(io::Error::other)?;

input.advance((self.compress.total_in() - prior_in) as usize);
Expand All @@ -67,11 +73,11 @@ impl BzEncoder {
}
}

impl Encode for BzEncoder {
impl EncodeV2 for BzEncoder {
fn encode(
&mut self,
input: &mut PartialBuffer<impl AsRef<[u8]>>,
output: &mut PartialBuffer<impl AsRef<[u8]> + AsMut<[u8]>>,
input: &mut PartialBuffer<&[u8]>,
output: &mut WriteBuffer<'_>,
) -> io::Result<()> {
match self.encode(input, output, Action::Run)? {
// Decompression went fine, nothing much to report.
Expand All @@ -95,10 +101,7 @@ impl Encode for BzEncoder {
}
}

fn flush(
&mut self,
output: &mut PartialBuffer<impl AsRef<[u8]> + AsMut<[u8]>>,
) -> io::Result<bool> {
fn flush(&mut self, output: &mut WriteBuffer<'_>) -> io::Result<bool> {
match self.encode(&mut PartialBuffer::new(&[][..]), output, Action::Flush)? {
// Decompression went fine, nothing much to report.
Status::Ok => unreachable!(),
Expand All @@ -121,10 +124,7 @@ impl Encode for BzEncoder {
}
}

fn finish(
&mut self,
output: &mut PartialBuffer<impl AsRef<[u8]> + AsMut<[u8]>>,
) -> io::Result<bool> {
fn finish(&mut self, output: &mut WriteBuffer<'_>) -> io::Result<bool> {
match self.encode(&mut PartialBuffer::new(&[][..]), output, Action::Finish)? {
// Decompression went fine, nothing much to report.
Status::Ok => Ok(false),
Expand Down
20 changes: 7 additions & 13 deletions crates/compression-codecs/src/deflate/decoder.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use crate::{Decode, FlateDecoder};
use compression_core::util::PartialBuffer;
use crate::{DecodeV2, FlateDecoder};
use compression_core::util::{PartialBuffer, WriteBuffer};
use std::io::Result;

#[derive(Debug)]
Expand All @@ -21,31 +21,25 @@ impl DeflateDecoder {
}
}

impl Decode for DeflateDecoder {
impl DecodeV2 for DeflateDecoder {
fn reinit(&mut self) -> Result<()> {
self.inner.reinit()?;
Ok(())
}

fn decode(
&mut self,
input: &mut PartialBuffer<impl AsRef<[u8]>>,
output: &mut PartialBuffer<impl AsRef<[u8]> + AsMut<[u8]>>,
input: &mut PartialBuffer<&[u8]>,
output: &mut WriteBuffer<'_>,
) -> Result<bool> {
self.inner.decode(input, output)
}

fn flush(
&mut self,
output: &mut PartialBuffer<impl AsRef<[u8]> + AsMut<[u8]>>,
) -> Result<bool> {
fn flush(&mut self, output: &mut WriteBuffer<'_>) -> Result<bool> {
self.inner.flush(output)
}

fn finish(
&mut self,
output: &mut PartialBuffer<impl AsRef<[u8]> + AsMut<[u8]>>,
) -> Result<bool> {
fn finish(&mut self, output: &mut WriteBuffer<'_>) -> Result<bool> {
self.inner.finish(output)
}
}
Loading