use crate::repository::{ChunkSettings, Key, UnpackedChunk};
use std::io::{Empty, Read};
pub mod slicer;
pub use self::slicer::{ChunkIterator, Slicer, SlicerSettings};
#[cfg(feature = "profile")]
use flamer::*;
pub struct Slice {
pub data: UnpackedChunk,
pub start: u64,
pub end: u64,
}
pub struct IteratedReader<R: Read + Send, S: Slicer<R>> {
chunk_iterator: ChunkIterator<R, S>,
offset: u64,
}
impl<R: Read + Send, S: Slicer<R>> Iterator for IteratedReader<R, S> {
type Item = Slice;
#[cfg_attr(feature = "profile", flame)]
fn next(&mut self) -> Option<Slice> {
let data = self.chunk_iterator.next()?;
let start = self.offset;
self.offset = start + (data.data().len() as u64);
let end = self.offset - 1;
Some(Slice { data, start, end })
}
}
#[derive(Clone)]
pub struct Chunker<S> {
settings: S,
}
impl<S: SlicerSettings<Empty>> Chunker<S> {
pub fn new(settings: S) -> Chunker<S> {
Chunker { settings }
}
pub fn chunked_iterator<R>(
&self,
reader: R,
offset: u64,
settings: &ChunkSettings,
key: &Key,
) -> IteratedReader<R, impl Slicer<R>>
where
R: Read + Send,
S: SlicerSettings<R>,
{
let slicer = <S as SlicerSettings<R>>::to_slicer(&self.settings, reader);
let chunk_iterator = slicer.into_chunk_iter(settings.clone(), key.clone());
IteratedReader {
chunk_iterator,
offset,
}
}
}