use std::env;
#[cfg(feature = "dhat-heap")]
#[global_allocator]
static ALLOC: dhat::Alloc = dhat::Alloc;
use structured_zstd::decoding::{DictionaryHandle, FrameDecoder};
fn main() {
let args: Vec<String> = env::args().collect();
let iters: u32 = args.get(1).and_then(|s| s.parse().ok()).unwrap_or(500_000);
let payload_path = args
.get(2)
.map(String::as_str)
.unwrap_or("/tmp/szstd-dicts/small-4k-log-lines.level_2_fast.zst");
let dict_path = args
.get(3)
.map(String::as_str)
.unwrap_or("/tmp/szstd-dicts/small-4k-log-lines.dict");
let expected_len: usize = args.get(4).and_then(|s| s.parse().ok()).unwrap_or(4096);
let payload = std::fs::read(payload_path).expect("read payload file");
let dict = std::fs::read(dict_path).expect("read dict file");
let handle = DictionaryHandle::decode_dict(dict.as_slice()).expect("parse dictionary");
let mut decoder = FrameDecoder::new();
let mut output = vec![0u8; expected_len];
#[cfg(feature = "dhat-heap")]
let _dhat = dhat::Profiler::new_heap();
let mut sink: usize = 0;
for _ in 0..iters {
let n = decoder
.decode_all_with_dict_handle(payload.as_slice(), output.as_mut_slice(), &handle)
.expect("dict decode should succeed");
assert_eq!(n, expected_len, "decoded length mismatch");
sink = sink.wrapping_add(n);
core::hint::black_box(&output[..n]);
}
eprintln!(
"decoded {} bytes x {} iters (payload {} bytes, dict {} bytes); out-sum={}",
expected_len,
iters,
payload.len(),
dict.len(),
sink
);
}