F: Fn(&Entry, &Entry) -> Ordering,
{
fn iter(&self) -> impl Iter {
- DupsortFuncIter {
- run: Vec::new(),
- next: None,
- iter: self.source.iter(),
- dupsort_func: &self.dupsort_func,
- }
+ self.source.iter().dupsort_func(&self.dupsort_func)
}
fn get(&self, key: &[u8]) -> impl Iter {
- DupsortFuncIter {
- run: Vec::new(),
- next: None,
- iter: self.source.get(key),
- dupsort_func: &self.dupsort_func,
- }
+ self.source.get(key).dupsort_func(&self.dupsort_func)
}
fn get_prefix(&self, prefix: &[u8]) -> impl Iter {
- DupsortFuncIter {
- run: Vec::new(),
- next: None,
- iter: self.source.get_prefix(prefix),
- dupsort_func: &self.dupsort_func,
- }
+ self.source
+ .get_prefix(prefix)
+ .dupsort_func(&self.dupsort_func)
}
fn get_range(&self, start: &[u8], end: &[u8]) -> impl Iter {
- DupsortFuncIter {
- run: Vec::new(),
- next: None,
- iter: self.source.get_range(start, end),
- dupsort_func: &self.dupsort_func,
- }
+ self.source
+ .get_range(start, end)
+ .dupsort_func(&self.dupsort_func)
}
}
#[derive(Debug)]
-struct DupsortFuncIter<'a, I, F>
+pub struct DupsortFuncIter<'a, I, F>
where
- I: Iter,
F: Fn(&Entry, &Entry) -> Ordering,
{
run: Vec<Entry>,
dupsort_func: &'a F,
}
+impl<'a, I, F> DupsortFuncIter<'a, I, F>
+where
+ F: Fn(&Entry, &Entry) -> Ordering,
+{
+ pub fn new(iter: I, dupsort_func: &'a F) -> Self {
+ Self {
+ run: Vec::new(),
+ next: None,
+ iter,
+ dupsort_func,
+ }
+ }
+}
+
impl<'a, I, F> Iterator for DupsortFuncIter<'a, I, F>
where
- I: Iter,
+ I: Iterator<Item = Entry>,
F: Fn(&Entry, &Entry) -> Ordering,
{
type Item = Entry;
+use crate::dupsort_func::DupsortFuncIter;
+use crate::filter::FilterIter;
+use crate::merge_func::MergeFuncIter;
use crate::Entry;
+use std::cmp::Ordering;
use std::iter::Iterator;
pub trait Iter: Iterator<Item = Entry> {
fn seek(&mut self, key: &[u8]);
+
+ fn merge_func<'a, F>(self, merge_func: &'a F) -> MergeFuncIter<'a, Self, F>
+ where
+ F: Fn(&mut Vec<u8>, &Entry),
+ Self: Sized,
+ {
+ MergeFuncIter::new(self, merge_func)
+ }
+
+ fn dupsort_func<'a, F>(self, dupsort_func: &'a F) -> DupsortFuncIter<'a, Self, F>
+ where
+ F: Fn(&Entry, &Entry) -> Ordering,
+ Self: Sized,
+ {
+ DupsortFuncIter::new(self, dupsort_func)
+ }
+
+ fn filter_func<'a, F>(self, filter_func: &'a F) -> FilterIter<'a, Self, F>
+ where
+ F: Fn(&Entry, &mut dyn Iter) -> bool,
+ Self: Sized,
+ {
+ FilterIter::new(self, filter_func)
+ }
}
pub type BoxedIter<'a> = Box<dyn Iter + 'a>;
mod compression;
mod dupsort_func;
mod entry;
+mod filter;
mod iter;
mod merge_func;
mod merger;
F: Fn(&mut Vec<u8>, &Entry),
{
fn iter(&self) -> impl Iter {
- MergeFuncIter {
- prev: None,
- iter: self.source.iter(),
- merge_func: &self.merge_func,
- }
+ self.source.iter().merge_func(&self.merge_func)
}
fn get(&self, key: &[u8]) -> impl Iter {
- MergeFuncIter {
- prev: None,
- iter: self.source.get(key),
- merge_func: &self.merge_func,
- }
+ self.source.get(key).merge_func(&self.merge_func)
}
fn get_prefix(&self, prefix: &[u8]) -> impl Iter {
- MergeFuncIter {
- prev: None,
- iter: self.source.get_prefix(prefix),
- merge_func: &self.merge_func,
- }
+ self.source.get_prefix(prefix).merge_func(&self.merge_func)
}
fn get_range(&self, start: &[u8], end: &[u8]) -> impl Iter {
- MergeFuncIter {
- prev: None,
- iter: self.source.get_range(start, end),
- merge_func: &self.merge_func,
- }
+ self.source
+ .get_range(start, end)
+ .merge_func(&self.merge_func)
}
}
-struct MergeFuncIter<'a, I: Iter, F: Fn(&mut Vec<u8>, &Entry)> {
+pub struct MergeFuncIter<'a, I, F: Fn(&mut Vec<u8>, &Entry)> {
prev: Option<Entry>,
iter: I,
merge_func: &'a F,
}
+impl<'a, I, F> MergeFuncIter<'a, I, F>
+where
+ F: Fn(&mut Vec<u8>, &Entry),
+{
+ pub fn new(iter: I, merge_func: &'a F) -> Self {
+ Self {
+ prev: None,
+ iter,
+ merge_func,
+ }
+ }
+}
+
impl<'a, I, F> Iterator for MergeFuncIter<'a, I, F>
where
- I: Iter,
+ I: Iterator<Item = Entry>,
F: Fn(&mut Vec<u8>, &Entry),
{
type Item = Entry;
use crate::dupsort_func::DupsortFunc;
+use crate::filter::FilterSource;
use crate::iter::{PrefixIter, RangeIter};
use crate::merge_func::MergeFunc;
use crate::{Entry, Iter};
{
DupsortFunc::new(self, dupsort_func)
}
+
+ fn filter<F>(self, filter_func: F) -> FilterSource<Self, F>
+ where
+ Self: Sized,
+ F: Fn(&Entry, &mut dyn Iter) -> bool,
+ {
+ FilterSource::new(self, filter_func)
+ }
}
struct VecIter<'a> {