pub struct DupsortSource<'a, S, F>
where
S: Source<'a>,
- F: Fn(&S::Item, &S::Item) -> Ordering,
+ F: Fn(&<S::Iter as Iterator>::Item, &<S::Iter as Iterator>::Item) -> Ordering,
{
source: S,
dupsort_func: F,
impl<'a, S, F> DupsortSource<'a, S, F>
where
S: Source<'a>,
- F: Fn(&S::Item, &S::Item) -> Ordering,
+ F: Fn(&<S::Iter as Iterator>::Item, &<S::Iter as Iterator>::Item) -> Ordering,
{
pub fn new(source: S, dupsort_func: F) -> Self {
Self {
impl<'a, S, F> Source<'a> for DupsortSource<'a, S, F>
where
S: Source<'a>,
- S::Item: PartialEq,
- F: Fn(&S::Item, &S::Item) -> Ordering + 'a,
+ <S::Iter as Iterator>::Item: PartialEq,
+ F: Fn(&<S::Iter as Iterator>::Item, &<S::Iter as Iterator>::Item) -> Ordering + 'a,
{
type Iter = DupsortIter<S::Iter, &'a F>;
- type Item = S::Item;
fn iter(&'a self) -> Self::Iter {
self.source.iter().dupsort_func(&self.dupsort_func)
impl<'a, S, F> FilterSource<'a, S, F>
where
S: Source<'a>,
- F: Fn(&S::Item, &mut Vec<u8>) -> bool,
+ F: Fn(&<S::Iter as Iterator>::Item, &mut Vec<u8>) -> bool,
{
pub fn new(source: S, filter_func: F) -> Self {
Self {
impl<'a, S, F> Source<'a> for FilterSource<'a, S, F>
where
S: Source<'a>,
- F: Fn(&S::Item, &mut Vec<u8>) -> bool + 'a,
+ F: Fn(&<S::Iter as Iterator>::Item, &mut Vec<u8>) -> bool + 'a,
{
type Iter = FilterIter<S::Iter, &'a F>;
- type Item = S::Item;
fn iter(&'a self) -> Self::Iter {
self.source.iter().filter_func(&self.filter_func)
}
impl<I> RangeIter<I>
where
I: SeekableIter,
- I::Item: AsRef<[u8]>,
{
pub fn new(mut iter: I, start: impl AsRef<[u8]>, end: impl AsRef<[u8]>) -> Self {
iter.seek(start.as_ref());
impl<'a, S, F> Source<'a> for MergeSource<'a, S, F>
where
- S: Source<'a, Item = Entry>,
+ S: Source<'a>,
+ S::Iter: Iterator<Item = Entry>,
F: Fn(&mut Vec<u8>, &Entry) + 'a,
{
type Iter = MergeIter<S::Iter, &'a F>;
- type Item = Entry;
fn iter(&'a self) -> Self::Iter {
self.source.iter().merge_func(&self.merge_func)
}
impl<'a, S> Source<'a> for Merger<S>
where
- S: Source<'a, Item = Entry>,
+ S: Source<'a>,
+ S::Iter: Iterator<Item = Entry>,
{
- type Item = Entry;
type Iter = MergeIter<S::Iter>;
fn iter(&'a self) -> Self::Iter {
MergeIter::from(self.sources.iter().map(|s| s.iter()))
let iters: Vec<_> = range
.clone()
.map(test_source)
- .map(|s| s.into_boxed())
+ //.map(|s| s.into_boxed())
.collect();
let s = Merger::from(iters);
let mut v = Vec::<u8>::new();
}
impl<'a, D: AsRef<[u8]>> Source<'a> for Reader<D> {
- type Item = Entry;
type Iter = ReaderIter<D>;
fn iter(&'a self) -> Self::Iter {
use crate::{Entry, SeekableIter};
pub trait Source<'a> {
- type Iter: SeekableIter<Item = Self::Item>;
- type Item: AsRef<[u8]>;
+ type Iter: SeekableIter;
fn iter(&'a self) -> Self::Iter;
- fn get(&'a self, key: &[u8]) -> RangeIter<Self::Iter> {
+ fn get(&'a self, key: &[u8]) -> RangeIter<Self::Iter>
+ where
+ <Self::Iter as Iterator>::Item: PartialOrd<[u8]>,
+ {
RangeIter::new(self.iter(), key, key)
}
- fn get_prefix(&'a self, prefix: &[u8]) -> PrefixIter<Self::Iter> {
+ fn get_prefix(&'a self, prefix: &[u8]) -> PrefixIter<Self::Iter>
+ where
+ <Self::Iter as Iterator>::Item: AsRef<[u8]>,
+ {
PrefixIter::new(self.iter(), prefix)
}
- fn get_range(&'a self, start: &[u8], end: &[u8]) -> RangeIter<Self::Iter> {
+ fn get_range(&'a self, start: &[u8], end: &[u8]) -> RangeIter<Self::Iter>
+ where
+ <Self::Iter as Iterator>::Item: PartialOrd<[u8]>,
+ {
RangeIter::new(self.iter(), start, end)
}
fn dupsort_func<F>(self, dupsort_func: F) -> DupsortSource<'a, Self, F>
where
Self: Sized,
- F: Fn(&Self::Item, &Self::Item) -> std::cmp::Ordering,
+ F: Fn(
+ &<Self::Iter as Iterator>::Item,
+ &<Self::Iter as Iterator>::Item,
+ ) -> std::cmp::Ordering,
{
DupsortSource::new(self, dupsort_func)
}
fn filter<F>(self, filter_func: F) -> FilterSource<'a, Self, F>
where
Self: Sized,
- F: Fn(&Self::Item, &mut Vec<u8>) -> bool,
+ F: Fn(&<Self::Iter as Iterator>::Item, &mut Vec<u8>) -> bool,
{
FilterSource::new(self, filter_func)
}
fn into_boxed(
self,
) -> Box<
- dyn Source<'a, Item = Self::Item, Iter = Box<dyn 'a + SeekableIter<Item = Self::Item>>>
+ dyn Source<'a, Iter = Box<dyn 'a + SeekableIter<Item = <Self::Iter as Iterator>::Item>>>
+ 'a,
>
where
}
}
-impl<'a, S: Source<'a> + ?Sized + 'a> Source<'a> for Box<S> {
- type Item = S::Item;
- type Iter = Box<dyn SeekableIter<Item = Self::Item> + 'a>;
+impl<'a, S: Source<'a> + ?Sized> Source<'a> for Box<S> {
+ type Iter = Box<dyn SeekableIter<Item = <S::Iter as Iterator>::Item> + 'a>;
fn iter(&'a self) -> Self::Iter {
Box::new(self.as_ref().iter())
}
struct BoxedSource<'a, S: Source<'a>>(S, std::marker::PhantomData<&'a S>);
impl<'a, S: Source<'a>> Source<'a> for BoxedSource<'a, S> {
- type Item = S::Item;
- type Iter = Box<dyn SeekableIter<Item = S::Item> + 'a>;
+ type Iter = Box<dyn SeekableIter<Item = <S::Iter as Iterator>::Item> + 'a>;
fn iter(&'a self) -> Self::Iter {
Box::new(self.0.iter())
}
impl<'a> Source<'a> for Vec<Entry> {
- type Item = Entry;
type Iter = VecIter<'a>;
fn iter(&'a self) -> Self::Iter {
VecIter {
}
impl<'a> Source<'a> for TestSource {
- type Item = Entry;
type Iter = TestIter<'a>;
fn iter(&'a self) -> Self::Iter {
TestIter {