// 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()?,
+ ))
}
}
}