compressible_map/
compression.rs1#[cfg(feature = "bincode")]
2mod compressed_bincode;
3#[cfg(feature = "lz4")]
4mod lz4_compression;
5#[cfg(feature = "snap")]
6mod snappy_compression;
7
8#[cfg(feature = "bincode")]
9pub use compressed_bincode::BincodeCompression;
10#[cfg(feature = "lz4")]
11pub use lz4_compression::Lz4;
12#[cfg(feature = "snap")]
13pub use snappy_compression::Snappy;
14
15use serde::{Deserialize, Serialize};
16
17pub trait Compression: Sized {
19 type Data;
20 type CompressedData;
21
22 fn compress(&self, data: &Self::Data) -> Compressed<Self>;
23 fn decompress(compressed: &Self::CompressedData) -> Self::Data;
24}
25
26#[derive(Clone, Deserialize, Serialize)]
27pub struct Compressed<A>
28where
29 A: Compression,
30{
31 pub compressed_data: A::CompressedData,
32 marker: std::marker::PhantomData<A>,
33}
34
35impl<T, A> Compressed<A>
36where
37 A: Compression<CompressedData = T>,
38{
39 pub fn new(compressed_data: A::CompressedData) -> Self {
40 Self {
41 compressed_data,
42 marker: Default::default(),
43 }
44 }
45
46 pub fn decompress(&self) -> A::Data {
47 A::decompress(&self.compressed_data)
48 }
49
50 pub fn take(self) -> A::CompressedData {
51 self.compressed_data
52 }
53}
54
55pub trait BytesCompression {
57 fn compress_bytes(&self, bytes: &[u8], compressed_bytes: impl std::io::Write);
58 fn decompress_bytes(compressed_bytes: &[u8], bytes: &mut impl std::io::Write);
59}