vecdb/variants/compressed/zstd/
strategy.rs1use std::marker::PhantomData;
2
3use zstd::{decode_all, encode_all};
4
5use crate::{RawStrategy, Result};
6
7use super::{super::inner::CompressionStrategy, value::ZstdVecValue};
8
9const ZSTD_COMPRESSION_LEVEL: i32 = 3;
12
13#[derive(Debug, Clone, Copy)]
15pub struct ZstdStrategy<T>(PhantomData<T>);
16
17impl<T> RawStrategy<T> for ZstdStrategy<T>
18where
19 T: ZstdVecValue,
20{
21 #[inline(always)]
22 fn read(bytes: &[u8]) -> Result<T> {
23 T::from_bytes(bytes)
24 }
25
26 #[inline(always)]
27 fn write_to_vec(value: &T, buf: &mut Vec<u8>) {
28 buf.extend_from_slice(value.to_bytes().as_ref());
29 }
30
31 #[inline(always)]
32 fn write_to_slice(value: &T, dst: &mut [u8]) {
33 dst.copy_from_slice(value.to_bytes().as_ref());
34 }
35}
36
37impl<T> CompressionStrategy<T> for ZstdStrategy<T>
38where
39 T: ZstdVecValue,
40{
41 fn compress(values: &[T]) -> Result<Vec<u8>> {
42 let bytes = Self::values_to_bytes(values);
43 Ok(encode_all(bytes.as_slice(), ZSTD_COMPRESSION_LEVEL)?)
44 }
45
46 fn decompress(bytes: &[u8], expected_len: usize) -> Result<Vec<T>> {
47 let decompressed = decode_all(bytes)?;
48 Self::bytes_to_values(&decompressed, expected_len)
49 }
50}