use crate::entry::HasPrefix;
-use crate::{Iter, Source};
+use crate::{SeekableIter, Source};
use std::cmp::Ordering;
pub struct DupsortFunc<S, F>
F: Fn(&S::Item, &S::Item) -> Ordering,
{
type Item = S::Item;
- fn iter(&self) -> impl Iter<Item = Self::Item> {
+ fn iter(&self) -> impl SeekableIter<Item = Self::Item> {
self.source.iter().dupsort_func(&self.dupsort_func)
}
- fn get(&self, key: &[u8]) -> impl Iter<Item = Self::Item>
+ fn get(&self, key: &[u8]) -> impl SeekableIter<Item = Self::Item>
where
S::Item: PartialOrd<[u8]>,
{
self.source.get(key).dupsort_func(&self.dupsort_func)
}
- fn get_prefix(&self, prefix: &[u8]) -> impl Iter<Item = Self::Item>
+ fn get_prefix(&self, prefix: &[u8]) -> impl SeekableIter<Item = Self::Item>
where
S::Item: HasPrefix,
{
.get_prefix(prefix)
.dupsort_func(&self.dupsort_func)
}
- fn get_range(&self, start: &[u8], end: &[u8]) -> impl Iter<Item = Self::Item>
+ fn get_range(&self, start: &[u8], end: &[u8]) -> impl SeekableIter<Item = Self::Item>
where
S::Item: PartialOrd<[u8]>,
{
#[derive(Debug)]
pub struct DupsortFuncIter<'a, I, F>
where
- I: Iter,
+ I: SeekableIter,
F: Fn(&I::Item, &I::Item) -> Ordering,
{
run: Vec<I::Item>,
impl<'a, I, F> DupsortFuncIter<'a, I, F>
where
- I: Iter,
+ I: SeekableIter,
F: Fn(&I::Item, &I::Item) -> Ordering,
{
pub fn new(iter: I, dupsort_func: &'a F) -> Self {
impl<'a, I, F> Iterator for DupsortFuncIter<'a, I, F>
where
- I: Iter,
+ I: SeekableIter,
I::Item: PartialEq,
F: Fn(&I::Item, &I::Item) -> Ordering,
{
}
}
-impl<'a, I, F> Iter for DupsortFuncIter<'a, I, F>
+impl<'a, I, F> SeekableIter for DupsortFuncIter<'a, I, F>
where
- I: Iter,
+ I: SeekableIter,
I::Item: PartialEq,
F: Fn(&I::Item, &I::Item) -> Ordering,
{
-use crate::{entry::HasPrefix, Iter, Source};
+use crate::{entry::HasPrefix, SeekableIter, Source};
pub struct FilterIter<'a, I, F> {
iter: I,
impl<'a, I, F> FilterIter<'a, I, F>
where
- I: Iter,
- F: Fn(&I::Item, &mut dyn Iter<Item = I::Item>) -> bool,
+ I: SeekableIter,
+ F: Fn(&I::Item, &mut dyn SeekableIter<Item = I::Item>) -> bool,
{
pub fn new(iter: I, filter_func: &'a F) -> Self {
Self { iter, filter_func }
impl<'a, I, F> Iterator for FilterIter<'a, I, F>
where
- I: Iter,
- F: Fn(&I::Item, &mut dyn Iter<Item = I::Item>) -> bool,
+ I: SeekableIter,
+ F: Fn(&I::Item, &mut dyn SeekableIter<Item = I::Item>) -> bool,
{
type Item = I::Item;
}
}
-impl<'a, I, F> Iter for FilterIter<'a, I, F>
+impl<'a, I, F> SeekableIter for FilterIter<'a, I, F>
where
- I: Iter,
- F: Fn(&I::Item, &mut dyn Iter<Item = I::Item>) -> bool,
+ I: SeekableIter,
+ F: Fn(&I::Item, &mut dyn SeekableIter<Item = I::Item>) -> bool,
{
fn seek(&mut self, key: &[u8]) {
self.iter.seek(key);
impl<S, F> FilterSource<S, F>
where
S: Source,
- F: Fn(&S::Item, &mut dyn Iter<Item = S::Item>) -> bool,
+ F: Fn(&S::Item, &mut dyn SeekableIter<Item = S::Item>) -> bool,
{
pub fn new(source: S, filter_func: F) -> Self {
Self {
impl<S, F> Source for FilterSource<S, F>
where
S: Source,
- F: Fn(&S::Item, &mut dyn Iter<Item = S::Item>) -> bool,
+ F: Fn(&S::Item, &mut dyn SeekableIter<Item = S::Item>) -> bool,
{
type Item = S::Item;
- fn iter(&self) -> impl Iter<Item = Self::Item> {
+ fn iter(&self) -> impl SeekableIter<Item = Self::Item> {
self.source.iter().filter_func(&self.filter_func)
}
- fn get(&self, key: &[u8]) -> impl Iter<Item = Self::Item>
+ fn get(&self, key: &[u8]) -> impl SeekableIter<Item = Self::Item>
where
Self::Item: PartialOrd<[u8]>,
{
self.source.get(key).filter_func(&self.filter_func)
}
- fn get_prefix(&self, prefix: &[u8]) -> impl Iter<Item = Self::Item>
+ fn get_prefix(&self, prefix: &[u8]) -> impl SeekableIter<Item = Self::Item>
where
Self::Item: HasPrefix,
{
.filter_func(&self.filter_func)
}
- fn get_range(&self, start: &[u8], end: &[u8]) -> impl Iter<Item = Self::Item>
+ fn get_range(&self, start: &[u8], end: &[u8]) -> impl SeekableIter<Item = Self::Item>
where
Self::Item: PartialOrd<[u8]>,
{
use std::cmp::Ordering;
use std::iter::Iterator;
-pub trait Iter: Iterator {
+pub trait SeekableIter: Iterator {
fn seek(&mut self, key: &[u8]);
fn merge_func<'a, F>(self, merge_func: &'a F) -> MergeFuncIter<'a, Self, F>
fn filter_func<'a, F>(self, filter_func: &'a F) -> FilterIter<'a, Self, F>
where
- F: Fn(&Self::Item, &mut dyn Iter<Item = Self::Item>) -> bool,
+ F: Fn(&Self::Item, &mut dyn SeekableIter<Item = Self::Item>) -> bool,
Self: Sized,
{
FilterIter::new(self, filter_func)
impl<E, I> PrefixIter<I>
where
- I: Iter<Item = E>,
+ I: SeekableIter<Item = E>,
E: HasPrefix,
{
pub fn new(mut iter: I, prefix: impl AsRef<[u8]>) -> Self {
impl<E, I> Iterator for PrefixIter<I>
where
- I: Iter<Item = E>,
+ I: SeekableIter<Item = E>,
E: HasPrefix,
{
type Item = E;
}
}
-impl<E, I> Iter for PrefixIter<I>
+impl<E, I> SeekableIter for PrefixIter<I>
where
- I: Iter<Item = E>,
+ I: SeekableIter<Item = E>,
E: HasPrefix,
{
fn seek(&mut self, key: &[u8]) {
end: Vec<u8>,
}
-impl<I: Iter> RangeIter<I> {
+impl<I: SeekableIter> RangeIter<I> {
pub fn new(mut iter: I, start: impl AsRef<[u8]>, end: impl AsRef<[u8]>) -> Self {
iter.seek(start.as_ref());
Self {
impl<E, I> Iterator for RangeIter<I>
where
- I: Iter<Item = E>,
+ I: SeekableIter<Item = E>,
E: PartialOrd<[u8]>,
{
type Item = E;
}
}
-impl<E, I> Iter for RangeIter<I>
+impl<E, I> SeekableIter for RangeIter<I>
where
- I: Iter<Item = E>,
+ I: SeekableIter<Item = E>,
E: PartialOrd<[u8]>,
{
fn seek(&mut self, key: &[u8]) {
pub use compression::Compression;
pub use entry::Entry;
pub use fileset::Fileset;
-pub use iter::Iter;
+pub use iter::SeekableIter;
pub use merger::Merger;
pub use reader::Reader;
pub use source::Source;
-use crate::{Entry, Iter, Source};
+use crate::{Entry, SeekableIter, Source};
pub struct MergeFunc<S: Source, F: Fn(&mut Vec<u8>, &Entry)> {
source: S,
F: Fn(&mut Vec<u8>, &Entry),
{
type Item = Entry;
- fn iter(&self) -> impl Iter<Item = Self::Item> {
+ fn iter(&self) -> impl SeekableIter<Item = Self::Item> {
self.source.iter().merge_func(&self.merge_func)
}
- fn get(&self, key: &[u8]) -> impl Iter<Item = Self::Item> {
+ fn get(&self, key: &[u8]) -> impl SeekableIter<Item = Self::Item> {
self.source.get(key).merge_func(&self.merge_func)
}
- fn get_prefix(&self, prefix: &[u8]) -> impl Iter<Item = Self::Item> {
+ fn get_prefix(&self, prefix: &[u8]) -> impl SeekableIter<Item = Self::Item> {
self.source.get_prefix(prefix).merge_func(&self.merge_func)
}
- fn get_range(&self, start: &[u8], end: &[u8]) -> impl Iter<Item = Self::Item> {
+ fn get_range(&self, start: &[u8], end: &[u8]) -> impl SeekableIter<Item = Self::Item> {
self.source
.get_range(start, end)
.merge_func(&self.merge_func)
}
}
-impl<'a, I, F> Iter for MergeFuncIter<'a, I, F>
+impl<'a, I, F> SeekableIter for MergeFuncIter<'a, I, F>
where
- I: Iter<Item = Entry>,
+ I: SeekableIter<Item = Entry>,
F: Fn(&mut Vec<u8>, &Entry),
{
fn seek(&mut self, key: &[u8]) {
-use crate::{Entry, Iter, Source};
+use crate::{Entry, SeekableIter, Source};
use std::cmp::Ordering;
use std::collections::BinaryHeap;
}
}
-struct MergeEntry<I: Iter> {
+struct MergeEntry<I: SeekableIter> {
e: Entry,
it: I,
}
-impl<I: Iter> PartialEq for MergeEntry<I> {
+impl<I: SeekableIter> PartialEq for MergeEntry<I> {
fn eq(&self, other: &Self) -> bool {
self.e.key() == other.e.key()
}
}
-impl<I: Iter> Eq for MergeEntry<I> {}
+impl<I: SeekableIter> Eq for MergeEntry<I> {}
-impl<I: Iter> PartialOrd for MergeEntry<I> {
+impl<I: SeekableIter> PartialOrd for MergeEntry<I> {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(other.e.key().cmp(&self.e.key()))
}
}
-impl<I: Iter> Ord for MergeEntry<I> {
+impl<I: SeekableIter> Ord for MergeEntry<I> {
fn cmp(&self, other: &Self) -> Ordering {
other.e.key().cmp(&self.e.key())
}
}
-pub struct MergeIter<I: Iter> {
+pub struct MergeIter<I: SeekableIter> {
heap: BinaryHeap<MergeEntry<I>>,
finished: Vec<I>,
last_key: Vec<u8>,
impl<I> From<I> for MergeIter<I::Item>
where
I: Iterator,
- I::Item: Iter<Item = Entry>,
+ I::Item: SeekableIter<Item = Entry>,
{
fn from(iters: I) -> Self {
let mut v: Vec<I::Item> = Vec::new();
}
}
-impl<I: Iter<Item = Entry>> Iterator for MergeIter<I> {
+impl<I: SeekableIter<Item = Entry>> Iterator for MergeIter<I> {
type Item = Entry;
fn next(&mut self) -> Option<Self::Item> {
}
}
-impl<I: Iter<Item = Entry>> Iter for MergeIter<I> {
+impl<I: SeekableIter<Item = Entry>> SeekableIter for MergeIter<I> {
fn seek(&mut self, key: &[u8]) {
if key > self.last_key.as_slice() {
loop {
impl<S: Source<Item = Entry>> Source for Merger<S> {
type Item = Entry;
- fn iter(&self) -> impl Iter<Item = Self::Item> {
+ fn iter(&self) -> impl SeekableIter<Item = Self::Item> {
MergeIter::from(self.sources.iter().map(|s| s.iter()))
}
- fn get(&self, key: &[u8]) -> impl Iter<Item = Self::Item> {
+ fn get(&self, key: &[u8]) -> impl SeekableIter<Item = Self::Item> {
MergeIter::from(self.sources.iter().map(|s| s.get(key)))
}
- fn get_prefix(&self, prefix: &[u8]) -> impl Iter<Item = Self::Item> {
+ fn get_prefix(&self, prefix: &[u8]) -> impl SeekableIter<Item = Self::Item> {
MergeIter::from(self.sources.iter().map(|s| s.get_prefix(prefix)))
}
- fn get_range(&self, start: &[u8], end: &[u8]) -> impl Iter<Item = Self::Item> {
+ fn get_range(&self, start: &[u8], end: &[u8]) -> impl SeekableIter<Item = Self::Item> {
MergeIter::from(self.sources.iter().map(|s| s.get_range(start, end)))
}
}
-use crate::{Entry, Iter, Result};
+use crate::{Entry, Result, SeekableIter};
use integer_encoding::VarInt;
use std::mem::size_of;
}
}
-impl<D: AsRef<[u8]>> Iter for BlockIter<D> {
+impl<D: AsRef<[u8]>> SeekableIter for BlockIter<D> {
fn seek(&mut self, key: &[u8]) {
// TODO: "galloping search"
if self.block.restart_count > 0 {
use crate::reader::block::Block;
use crate::writer::block_builder::BlockBuilder;
use crate::Entry;
- use crate::Iter;
+ use crate::SeekableIter;
fn build_block(n: u32, skip: u32, r: usize) -> Block<Vec<u8>> {
let mut bb = BlockBuilder::default();
use crate::metadata::Metadata;
use crate::Source;
-use crate::{Entry, Iter};
+use crate::{Entry, SeekableIter};
use integer_encoding::VarInt;
pub(crate) mod block;
use crate::compression::CBuf;
}
}
-impl<D: AsRef<[u8]>> Iter for ReaderIter<D> {
+impl<D: AsRef<[u8]>> SeekableIter for ReaderIter<D> {
fn seek(&mut self, key: &[u8]) {
// TODO: detect and skip unneeded seek in iter.
self.index_iter.seek(key);
impl<D: AsRef<[u8]>> Source for Reader<D> {
type Item = Entry;
- fn iter(&self) -> impl Iter<Item = Self::Item> {
+ fn iter(&self) -> impl SeekableIter<Item = Self::Item> {
ReaderIter {
reader: self.clone(),
next_offset: 0,
use crate::filter::FilterSource;
use crate::iter::{PrefixIter, RangeIter};
use crate::merge_func::MergeFunc;
-use crate::{Entry, Iter};
+use crate::{Entry, SeekableIter};
pub trait Source {
type Item;
- fn iter(&self) -> impl Iter<Item = Self::Item>;
- fn get(&self, key: &[u8]) -> impl Iter<Item = Self::Item>
+ fn iter(&self) -> impl SeekableIter<Item = Self::Item>;
+ fn get(&self, key: &[u8]) -> impl SeekableIter<Item = Self::Item>
where
Self::Item: PartialOrd<[u8]>,
{
RangeIter::new(self.iter(), key, key)
}
- fn get_prefix(&self, prefix: &[u8]) -> impl Iter<Item = Self::Item>
+ fn get_prefix(&self, prefix: &[u8]) -> impl SeekableIter<Item = Self::Item>
where
Self::Item: HasPrefix,
{
PrefixIter::new(self.iter(), prefix)
}
- fn get_range(&self, start: &[u8], end: &[u8]) -> impl Iter<Item = Self::Item>
+ fn get_range(&self, start: &[u8], end: &[u8]) -> impl SeekableIter<Item = Self::Item>
where
Self::Item: PartialOrd<[u8]>,
{
fn filter<F>(self, filter_func: F) -> FilterSource<Self, F>
where
Self: Sized,
- F: Fn(&Self::Item, &mut dyn Iter<Item = Self::Item>) -> bool,
+ F: Fn(&Self::Item, &mut dyn SeekableIter<Item = Self::Item>) -> bool,
{
FilterSource::new(self, filter_func)
}
}
}
-impl<'a> Iter for VecIter<'a> {
+impl<'a> SeekableIter for VecIter<'a> {
fn seek(&mut self, key: &[u8]) {
let mut left = 0;
let mut right = self.vec.len() - 1;
impl Source for Vec<Entry> {
type Item = Entry;
- fn iter(&self) -> impl Iter<Item = Self::Item> {
+ fn iter(&self) -> impl SeekableIter<Item = Self::Item> {
VecIter {
index: 0,
vec: self,
#[cfg(test)]
pub mod test_source {
use crate::Entry;
- use crate::Iter;
+ use crate::SeekableIter;
use crate::Source;
pub struct TestSource(pub Vec<Entry>);
}
}
- impl<'a> Iter for TestIter<'a> {
+ impl<'a> SeekableIter for TestIter<'a> {
fn seek(&mut self, key: &[u8]) {
self.off = 0;
while self.off < self.source.0.len() && self.source.0[self.off].key() < key {
impl Source for TestSource {
type Item = Entry;
- fn iter(&self) -> impl Iter<Item = Self::Item> {
+ fn iter(&self) -> impl SeekableIter<Item = Self::Item> {
TestIter {
source: self,
off: 0,