pub mod block;
pub mod config;
pub mod engine;
pub mod format;
pub mod index;
pub use config::{
EngineConfiguration, EngineConfigurationBuilder, ProgressCallback, ProgressEvent, ProgressPhase,
};
pub use engine::{
compress, compress_file, compress_stream, compress_to_writer, decompress,
decompress_from_reader,
};
pub use format::BlockIndexEntry;
pub use index::{decompress_block, load_index, BlockIndex};
use crush_core::error::Result;
use crush_core::plugin::{CompressionAlgorithm, PluginMetadata, COMPRESSION_ALGORITHMS};
use linkme::distributed_slice;
use std::sync::atomic::AtomicBool;
use std::sync::Arc;
pub const PLUGIN_MAGIC: [u8; 4] = [0x43, 0x52, 0x01, 0x02];
struct ParallelDeflatePlugin;
impl CompressionAlgorithm for ParallelDeflatePlugin {
fn name(&self) -> &'static str {
"parallel-deflate"
}
fn metadata(&self) -> PluginMetadata {
PluginMetadata {
name: "parallel-deflate",
version: env!("CARGO_PKG_VERSION"),
magic_number: PLUGIN_MAGIC,
throughput: 500.0,
compression_ratio: 0.65,
description: "Multi-threaded DEFLATE with CRSH block format; parallel decompress and random access",
}
}
fn compress(&self, input: &[u8], cancel_flag: Arc<AtomicBool>) -> Result<Vec<u8>> {
use crate::config::ProgressCallback;
use std::sync::atomic::Ordering;
use std::sync::Mutex;
let cb: ProgressCallback = Box::new(move |_event| !cancel_flag.load(Ordering::Acquire));
let config = EngineConfiguration::builder()
.progress(Arc::new(Mutex::new(cb)))
.build()?;
compress(input, &config)
}
fn decompress(&self, input: &[u8], cancel_flag: Arc<AtomicBool>) -> Result<Vec<u8>> {
use crate::config::ProgressCallback;
use std::sync::atomic::Ordering;
use std::sync::Mutex;
let cb: ProgressCallback = Box::new(move |_event| !cancel_flag.load(Ordering::Acquire));
let config = EngineConfiguration::builder()
.progress(Arc::new(Mutex::new(cb)))
.build()?;
decompress(input, &config)
}
fn detect(&self, file_header: &[u8]) -> bool {
file_header.len() >= 4 && file_header[0..4] == crate::format::CRSH_MAGIC
}
}
#[distributed_slice(COMPRESSION_ALGORITHMS)]
static PARALLEL_DEFLATE_PLUGIN: &dyn CompressionAlgorithm = &ParallelDeflatePlugin;