use ll;
use std::io::{self, Read};
use std::path;
use std::fs;
pub fn from_continuous(sample_data: &[u8], sample_sizes: &[usize],
max_size: usize)
-> io::Result<Vec<u8>> {
if sample_sizes.iter().fold(0, |a, b| a + b) != sample_data.len() {
return Err(io::Error::new(io::ErrorKind::Other,
"sample sizes don't add up".to_string()));
}
let mut result = Vec::with_capacity(max_size);
unsafe {
let code = ll::ZDICT_trainFromBuffer(result.as_mut_ptr(),
result.capacity(),
sample_data.as_ptr(),
sample_sizes.as_ptr(),
sample_sizes.len());
let written = try!(ll::parse_code(code));
result.set_len(written);
}
Ok(result)
}
pub fn from_samples<S: AsRef<[u8]>>(samples: &[S], max_size: usize)
-> io::Result<Vec<u8>> {
let data: Vec<_> = samples.iter()
.flat_map(|s| s.as_ref())
.map(|&b| b)
.collect();
let sizes: Vec<_> = samples.iter().map(|s| s.as_ref().len()).collect();
from_continuous(&data, &sizes, max_size)
}
pub fn from_files<P: AsRef<path::Path>>(filenames: &[P], max_size: usize)
-> io::Result<Vec<u8>> {
let mut buffer = Vec::new();
let mut sizes = Vec::new();
for filename in filenames {
let mut file = try!(fs::File::open(filename));
let len = try!(file.read_to_end(&mut buffer));
sizes.push(len);
}
from_continuous(&buffer, &sizes, max_size)
}