Avoid unnecessary allocation

This commit is contained in:
Truman Kilen 2025-01-21 13:09:38 -06:00
parent a33d5ef963
commit 1a80db37d5
2 changed files with 12 additions and 30 deletions

View file

@ -1,7 +1,4 @@
use std::{ use std::{io::Read, sync::OnceLock};
io::{Read, Write},
sync::OnceLock,
};
type Result<T, E = Error> = std::result::Result<T, E>; type Result<T, E = Error> = std::result::Result<T, E>;
@ -192,13 +189,12 @@ pub struct Oodle {
get_compressed_buffer_size_needed: oodle_lz::GetCompressedBufferSizeNeeded, get_compressed_buffer_size_needed: oodle_lz::GetCompressedBufferSizeNeeded,
} }
impl Oodle { impl Oodle {
pub fn compress<S: Write>( pub fn compress(
&self, &self,
input: &[u8], input: &[u8],
mut output: S,
compressor: Compressor, compressor: Compressor,
compression_level: CompressionLevel, compression_level: CompressionLevel,
) -> Result<usize> { ) -> Result<Vec<u8>> {
unsafe { unsafe {
let buffer_size = self.get_compressed_buffer_size_needed(compressor, input.len()); let buffer_size = self.get_compressed_buffer_size_needed(compressor, input.len());
let mut buffer = vec![0; buffer_size]; let mut buffer = vec![0; buffer_size];
@ -219,11 +215,9 @@ impl Oodle {
if len == -1 { if len == -1 {
return Err(Error::CompressionFailed); return Err(Error::CompressionFailed);
} }
let len = len as usize; buffer.truncate(len as usize);
output.write_all(&buffer[..len])?; Ok(buffer)
Ok(len)
} }
} }
pub fn decompress(&self, input: &[u8], output: &mut [u8]) -> isize { pub fn decompress(&self, input: &[u8], output: &mut [u8]) -> isize {
@ -305,14 +299,8 @@ mod test {
call compress on each of them, which decreases compression ratio but makes for trivial parallel call compress on each of them, which decreases compression ratio but makes for trivial parallel
compression and decompression."; compression and decompression.";
let mut buffer = vec![]; let buffer = oodle
oodle .compress(data, Compressor::Mermaid, CompressionLevel::Optimal5)
.compress(
data,
&mut buffer,
Compressor::Mermaid,
CompressionLevel::Optimal5,
)
.unwrap(); .unwrap();
dbg!((data.len(), buffer.len())); dbg!((data.len(), buffer.len()));

View file

@ -209,17 +209,11 @@ fn compress(compression: Compression, data: &[u8]) -> Result<Vec<u8>> {
return Err(super::Error::Oodle); return Err(super::Error::Oodle);
#[cfg(feature = "oodle")] #[cfg(feature = "oodle")]
{ {
let mut output = vec![]; oodle_loader::oodle().unwrap().compress(
oodle_loader::oodle() data.as_ref(),
.unwrap() oodle_loader::Compressor::Mermaid,
.compress( oodle_loader::CompressionLevel::Normal,
data.as_ref(), )?
&mut output,
oodle_loader::Compressor::Mermaid,
oodle_loader::CompressionLevel::Normal,
)
.unwrap();
output
} }
} }
}; };