#[cfg(not(feature = "std"))]
extern crate alloc;
use crate::prelude::*;
#[cfg(not(feature = "std"))]
use alloc::vec::Vec;
const ZSTD_LEVEL: i32 = 1;
pub(crate) const MIN_COMPRESS_LEN: usize = 64;
#[inline(always)]
pub(crate) fn looks_incompressible(data: &[u8]) -> bool {
let sample_len = data.len().min(32);
if sample_len < 32 {
return false; }
let mut bits = [0u64; 4];
for &b in &data[..sample_len] {
bits[(b >> 6) as usize] |= 1u64 << (b & 63);
}
let distinct =
bits[0].count_ones() + bits[1].count_ones() + bits[2].count_ones() + bits[3].count_ones();
distinct >= 28
}
#[inline(always)]
pub fn zstd_compress(input: &[u8]) -> Result<Vec<u8>> {
let bound = zstd_safe::compress_bound(input.len());
let mut out = vec![0u8; bound];
let written = match zstd_safe::compress(&mut out[..], input, ZSTD_LEVEL) {
Ok(n) => n,
Err(_) => return Err(Error::InvalidData),
};
out.truncate(written);
Ok(out)
}
#[inline(always)]
pub fn zstd_decompress(compressed: &[u8], original_len: usize) -> Result<Vec<u8>> {
let mut out = vec![0u8; original_len];
let written = match zstd_safe::decompress(&mut out[..], compressed) {
Ok(n) => n,
Err(_) => return Err(Error::InvalidData),
};
if written != original_len {
return Err(Error::IncorrectLength);
}
Ok(out)
}
#[inline(always)]
pub fn zstd_content_size(compressed: &[u8]) -> Result<usize> {
match zstd_safe::get_frame_content_size(compressed) {
Ok(Some(n)) => Ok(n as usize),
_ => Err(Error::InvalidData),
}
}
#[inline(always)]
const fn varint_len_usize(mut val: usize) -> usize {
if val <= 127 {
return 1;
}
let mut n = 0usize;
while val != 0 {
n += 1;
val >>= 8;
}
1 + n
}
#[inline(always)]
pub const fn flagged_header_len(payload_len: usize, compressed: bool) -> usize {
let v = (payload_len << 1) | (compressed as usize);
varint_len_usize(v)
}