use crate::{Error, Result};
#[cfg(feature = "alloc")]
extern crate alloc;
const MAX_DECOMPRESSED_SIZE: usize = 256 * 1024 * 1024;
#[cfg(feature = "alloc")]
pub fn compress(data: &[u8]) -> Result<alloc::vec::Vec<u8>> {
oxiarc_lz4::compress(data).map_err(|_| Error::Custom {
message: "LZ4 compression error",
})
}
#[cfg(feature = "alloc")]
pub fn decompress(data: &[u8]) -> Result<alloc::vec::Vec<u8>> {
oxiarc_lz4::decompress(data, MAX_DECOMPRESSED_SIZE).map_err(|_| Error::InvalidData {
message: "LZ4 decompression error",
})
}
#[allow(dead_code)]
#[cfg(feature = "alloc")]
pub fn compress_into(src: &[u8], dst: &mut [u8]) -> Result<usize> {
let compressed = oxiarc_lz4::compress(src).map_err(|_| Error::Custom {
message: "LZ4 compression failed",
})?;
if dst.len() < compressed.len() {
return Err(Error::UnexpectedEnd {
additional: compressed.len() - dst.len(),
});
}
dst[..compressed.len()].copy_from_slice(&compressed);
Ok(compressed.len())
}
#[allow(dead_code)]
pub fn max_compressed_size(input_size: usize) -> usize {
input_size + (input_size / 255) + 32
}
#[cfg(test)]
mod tests {
use super::*;
#[cfg(feature = "alloc")]
#[test]
fn test_compress_decompress() {
let data = b"Hello, World! This is a test of LZ4 compression.";
let compressed = compress(data).expect("compress failed");
let decompressed = decompress(&compressed).expect("decompress failed");
assert_eq!(data.as_slice(), decompressed.as_slice());
}
#[cfg(feature = "alloc")]
#[test]
fn test_empty_data() {
let data: &[u8] = b"";
let compressed = compress(data).expect("compress failed");
let decompressed = decompress(&compressed).expect("decompress failed");
assert_eq!(data, decompressed.as_slice());
}
#[cfg(feature = "alloc")]
#[test]
fn test_large_data() {
let data: alloc::vec::Vec<u8> = (0..100000).map(|i| (i % 256) as u8).collect();
let compressed = compress(&data).expect("compress failed");
let decompressed = decompress(&compressed).expect("decompress failed");
assert_eq!(data, decompressed);
assert!(compressed.len() < data.len());
}
#[cfg(feature = "alloc")]
#[test]
fn test_incompressible_data() {
let data: alloc::vec::Vec<u8> = (0..1000).map(|i| ((i * 17 + 31) % 256) as u8).collect();
let compressed = compress(&data).expect("compress failed");
let decompressed = decompress(&compressed).expect("decompress failed");
assert_eq!(data, decompressed);
}
#[test]
fn test_max_compressed_size() {
let size = max_compressed_size(1000);
assert!(size > 1000);
}
}