use crate::source::{DefaultSource, IterSource};
use crate::Entry;
use crate::Iter;
-use integer_encoding::{FixedInt, VarInt};
+use integer_encoding::VarInt;
pub(crate) mod block;
use std::io::{Cursor, Seek, SeekFrom};
use std::sync::Arc;
len: usize,
}
+impl<D: AsRef<[u8]>> Clone for DataSlice<D> {
+ fn clone(&self) -> Self {
+ Self {
+ data: self.data.clone(),
+ off: self.off,
+ len: self.len,
+ }
+ }
+}
+
impl<D: AsRef<[u8]>> AsRef<[u8]> for DataSlice<D> {
fn as_ref(&self) -> &[u8] {
&((*self.data).as_ref())[self.off..self.off + self.len]
metadata: Metadata,
}
+impl<D: AsRef<[u8]>> Clone for Reader<D> {
+ fn clone(&self) -> Self {
+ Self {
+ data: self.data.clone(),
+ metadata: self.metadata.clone(),
+ }
+ }
+}
+
impl<D: AsRef<[u8]>> Reader<D> {
pub fn new(d: D) -> Self {
let mut cur = Cursor::new(&d.as_ref()[d.as_ref().len() - 512..]);
}
}
-pub struct ReaderIter<'r, D: AsRef<[u8]>> {
- reader: &'r Reader<D>,
+pub struct ReaderIter<D: AsRef<[u8]>> {
+ reader: Reader<D>,
next_offset: usize,
index_iter: block::BlockIter<D>,
data_iter: Option<block::BlockIter<D>>,
}
-impl<D: AsRef<[u8]>> Reader<D> {
- pub fn iter(&self) -> ReaderIter<'_, D> {
- ReaderIter {
- reader: self,
- next_offset: 0,
- index_iter: self.index_iter(),
- data_iter: None,
- }
- }
-}
-
-impl<'r, D: AsRef<[u8]>> ReaderIter<'r, D> {
+impl<D: AsRef<[u8]>> ReaderIter<D> {
fn next_block(&mut self) -> Option<()> {
if self.next_offset >= self.reader.metadata.index_block_offset {
return None;
.expect("bad block size");
let crc_off = self.next_offset + len_size;
let data_off = crc_off + std::mem::size_of::<u32>();
+ println!(
+ "Block: {};{}, data_off = {}",
+ self.next_offset, size, data_off
+ );
let _crc = u32::from_be_bytes(
self.reader.data.as_ref()[crc_off..crc_off + 4]
.try_into()
}
}
-impl<'r, D: AsRef<[u8]>> Iterator for ReaderIter<'r, D> {
+impl<D: AsRef<[u8]>> Iterator for ReaderIter<D> {
type Item = Entry;
fn next(&mut self) -> Option<Self::Item> {
if self.data_iter.is_none() {
}
}
-impl<'r, D: AsRef<[u8]>> Iter for ReaderIter<'r, D> {
+impl<D: AsRef<[u8]>> Iter for ReaderIter<D> {
fn seek(&mut self, key: &[u8]) {
// TODO: detect and skip unneeded seek in iter.
self.index_iter.seek(key);
}
}
-impl<'r, D: AsRef<[u8]>> IterSource for &'r Reader<D> {
- type It = ReaderIter<'r, D>;
+impl<D: AsRef<[u8]>> IterSource for Reader<D> {
+ type It = ReaderIter<D>;
fn iter(&self) -> Self::It {
ReaderIter {
- reader: self,
+ reader: self.clone(),
next_offset: 0,
index_iter: self.index_iter(),
data_iter: None,
}
}
-impl<'r, D: AsRef<[u8]>> DefaultSource for &'r Reader<D> {}
+impl<D: AsRef<[u8]>> DefaultSource for Reader<D> {}