]> git.mikk.net Git - mtbl-rs/commitdiff
Make compression CBuf type generic
authorChris Mikkelson <cmikk@fsi.io>
Tue, 13 Aug 2024 00:04:30 +0000 (19:04 -0500)
committerChris Mikkelson <cmikk@fsi.io>
Tue, 13 Aug 2024 00:04:30 +0000 (19:04 -0500)
src/compression.rs
src/reader/mod.rs

index 82164d55f9d535d0032280865b6b41219fe88fa3..e9db3d6dc0a91ca9ca42ea2cb6b7159082ca928a 100644 (file)
@@ -45,58 +45,74 @@ impl From<Compression> 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<B: AsRef<[u8]>> {
+    Buf(B),
     Vec(Vec<u8>),
 }
 
-impl<'a> Deref for CBuf<'a> {
+impl<B: AsRef<[u8]>> Deref for CBuf<B> {
     type Target = [u8];
 
     fn deref(&self) -> &Self::Target {
+        self.as_ref()
+    }
+}
+
+impl<B: AsRef<[u8]>> AsRef<[u8]> for CBuf<B> {
+    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<CBuf, Box<dyn std::error::Error>> {
+impl Compression {
+    pub(crate) fn compress<B: AsRef<[u8]>>(
+        &self,
+        buf: B,
+    ) -> Result<CBuf<B>, Box<dyn std::error::Error>> {
         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::<u8>::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<CBuf> {
+    pub(crate) fn uncompress<B: AsRef<[u8]>>(&self, buf: B) -> Option<CBuf<B>> {
         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::<u8>::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()?,
+                ))
             }
         }
     }
index cebbd8a8824a295ccfb0d97699d748285dcc6878..a530aad265c21eb2c6a3c2ccc6f049de4c00c54a 100644 (file)
@@ -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;