pub mod buzhash;
pub mod fastcdc;
use crate::repository::chunk::*;
use crate::repository::Key;
use std::io::Read;
use std::marker::PhantomData;
pub trait Slicer<R: Read + Send>: Sized + Send + IntoIterator<Item = Vec<u8>> {
type Settings: SlicerSettings<R>;
fn add_reader(&mut self, reader: R);
fn take_slice(&mut self) -> Option<Vec<u8>>;
fn copy_settings(&self) -> Self::Settings;
fn into_chunk_iter(self, settings: ChunkSettings, key: Key) -> ChunkIterator<R, Self> {
ChunkIterator {
slicer: self,
settings,
key,
marker: PhantomData,
}
}
}
#[derive(Clone)]
pub struct ChunkIterator<R: Read + Send, S: Slicer<R>> {
slicer: S,
settings: ChunkSettings,
key: Key,
marker: PhantomData<R>,
}
impl<R: Read + Send, S: Slicer<R>> Iterator for ChunkIterator<R, S> {
type Item = UnpackedChunk;
fn next(&mut self) -> Option<UnpackedChunk> {
let slice = self.slicer.take_slice()?;
Some(UnpackedChunk::new(slice, self.settings, &self.key))
}
}
pub trait SlicerSettings<R: Read + Send>: Send + Sync {
type Slicer: Slicer<R>;
fn to_slicer(&self, reader: R) -> Self::Slicer;
}