From: Chris Mikkelson Date: Tue, 13 Aug 2024 00:04:30 +0000 (-0500) Subject: Make compression CBuf type generic X-Git-Url: https://git.mikk.net/?a=commitdiff_plain;h=8209a73b963a3341aa0447e82b5196a0d6e2b352;p=mtbl-rs Make compression CBuf type generic --- diff --git a/src/compression.rs b/src/compression.rs index 82164d5..e9db3d6 100644 --- a/src/compression.rs +++ b/src/compression.rs @@ -45,58 +45,74 @@ impl From for u64 { // Store compressed data as either a vec or (for uncompressed) // #[derive(Debug)] -pub(crate) enum CBuf<'a> { - Buf(&'a [u8]), +pub(crate) enum CBuf> { + Buf(B), Vec(Vec), } -impl<'a> Deref for CBuf<'a> { +impl> Deref for CBuf { type Target = [u8]; fn deref(&self) -> &Self::Target { + self.as_ref() + } +} + +impl> AsRef<[u8]> for CBuf { + fn as_ref(&self) -> &[u8] { match self { - CBuf::Buf(b) => b, + CBuf::Buf(b) => b.as_ref(), CBuf::Vec(v) => v.as_slice(), } } } -impl<'a> Compression { - pub(crate) fn compress(&'a self, buf: &'a [u8]) -> Result> { +impl Compression { + pub(crate) fn compress>( + &self, + buf: B, + ) -> Result, Box> { match self { Compression::None => Ok(CBuf::Buf(buf)), - Compression::Snappy => Ok(CBuf::Vec(snap::raw::Encoder::new().compress_vec(buf)?)), + Compression::Snappy => Ok(CBuf::Vec( + snap::raw::Encoder::new().compress_vec(buf.as_ref())?, + )), Compression::Zlib(level) => { let mut v = Vec::::new(); { let mut enc = flate2::write::ZlibEncoder::new(&mut v, *level); - enc.write_all(buf)?; + enc.write_all(buf.as_ref())?; } Ok(CBuf::Vec(v)) } // Compression::LZ4 => {} // Compression::LZ4HC => {} - Compression::Zstd(level) => Ok(CBuf::Vec(zstd::bulk::compress(buf, *level)?)), + Compression::Zstd(level) => Ok(CBuf::Vec(zstd::bulk::compress(buf.as_ref(), *level)?)), } } - pub(crate) fn uncompress(&'a self, buf: &'a [u8]) -> Option { + pub(crate) fn uncompress>(&self, buf: B) -> Option> { match self { Compression::None => Some(CBuf::Buf(buf)), Compression::Snappy => Some(CBuf::Vec( - snap::raw::Decoder::new().decompress_vec(buf).ok()?, + snap::raw::Decoder::new() + .decompress_vec(buf.as_ref()) + .ok()?, )), Compression::Zlib(_) => { let mut v = Vec::::new(); { - let mut dec = flate2::read::ZlibDecoder::new(buf); + let mut dec = flate2::read::ZlibDecoder::new(buf.as_ref()); dec.read_to_end(&mut v).ok()?; } Some(CBuf::Vec(v)) } Compression::Zstd(_) => { let mut dec = zstd::bulk::Decompressor::new().ok()?; - Some(CBuf::Vec(dec.decompress(buf, 100 * buf.len()).ok()?)) + Some(CBuf::Vec( + dec.decompress(buf.as_ref(), 100 * buf.as_ref().len()) + .ok()?, + )) } } } diff --git a/src/reader/mod.rs b/src/reader/mod.rs index cebbd8a..a530aad 100644 --- a/src/reader/mod.rs +++ b/src/reader/mod.rs @@ -5,7 +5,7 @@ use integer_encoding::VarInt; pub(crate) mod block; use memmap::{Mmap, MmapOptions}; use std::fs::File; -use std::io::{Cursor, Seek, SeekFrom}; +use std::io::Cursor; use std::path::Path; use std::sync::Arc;