use std::env;
use structured_zstd::encoding::{CompressionLevel, FrameCompressor};
fn main() {
let args: Vec<String> = env::args().collect();
let level: i32 = args.get(1).and_then(|s| s.parse().ok()).unwrap_or(3);
let iters: u32 = args.get(2).and_then(|s| s.parse().ok()).unwrap_or(2000);
let corpus_path: Option<&str> = args.get(3).map(|s| s.as_str());
let src: Vec<u8> = if let Some(path) = corpus_path {
std::fs::read(path).expect("read corpus file")
} else {
let n = 1_048_576usize;
let mut src = Vec::with_capacity(n);
let mut state: u64 = 0x517cc1b727220a95;
while src.len() < n {
state = state
.wrapping_mul(6364136223846793005)
.wrapping_add(1442695040888963407);
src.push((state >> 56) as u8);
}
src
};
let cap = src
.len()
.checked_add(src.len() >> 3)
.and_then(|v| v.checked_add(4096))
.expect("corpus too large: output-capacity bound overflows usize");
let mut out: Vec<u8> = Vec::with_capacity(cap);
let compressor_level = CompressionLevel::from_level(level);
let mut sink: usize = 0;
for _ in 0..iters {
out.clear();
let mut frame_enc = FrameCompressor::new(compressor_level);
frame_enc.set_source_size_hint(src.len() as u64);
frame_enc.set_source(src.as_slice());
frame_enc.set_drain(&mut out);
frame_enc.compress();
sink = sink.wrapping_add(out.len());
core::hint::black_box(&out);
}
eprintln!(
"encoded {} bytes × {} iters at level {}; last-out-sum={}",
src.len(),
iters,
level,
sink
);
}