-use crate::{source::Ranges, Entry, Iter, Source};
+use crate::{source::IterSource, Entry, Iter, Source};
use std::cmp::Ordering;
use std::collections::BinaryHeap;
use std::marker::PhantomData;
last_key: Vec<u8>,
}
-impl<I: Iter> MergeIter<I> {
- fn add(&mut self, mut it: I) {
- match it.next() {
- Some(e) => self.heap.push(MergeEntry { e, it }),
- None => self.finished.push(it),
- }
- }
-}
-
impl<I> From<I> for MergeIter<I::Item>
where
I: Iterator,
}
}
-impl<'a, S: Source<'a>> Source<'a> for Merger<'a, S> {
+impl<'a, S: Source<'a>> IterSource<'a> for Merger<'a, S> {
type It = MergeIter<S::It>;
fn iter(&'a self) -> Self::It {
MergeIter::from(self.sources.iter().map(|s| s.iter()))
}
}
-impl<'a, S: Source<'a> + Ranges<'a>> Ranges<'a> for Merger<'a, S> {
- type Get = MergeIter<<S as Ranges<'a>>::Get>;
- type Prefix = MergeIter<<S as Ranges<'a>>::Prefix>;
- type Range = MergeIter<<S as Ranges<'a>>::Range>;
+impl<'a, S: Source<'a>> Source<'a> for Merger<'a, S> {
+ type Get = MergeIter<S::Get>;
+ type Prefix = MergeIter<S::Prefix>;
+ type Range = MergeIter<S::Range>;
fn get(&'a self, key: &[u8]) -> Self::Get {
MergeIter::from(self.sources.iter().map(|s| s.get(key)))
mod test {
use super::Merger;
use crate::source::test::TestSource;
- use crate::{Entry, Source};
+ use crate::source::IterSource;
+ use crate::Entry;
fn tnum(m: u8) -> Vec<u8> {
Vec::from_iter((1u8..255).into_iter().filter(|i| i % m == 0))
}
}
-pub trait Source<'a> {
+pub trait IterSource<'a> {
type It: Iter;
- fn iter(&'a self) -> <Self as Source>::It;
+ fn iter(&'a self) -> Self::It;
}
-pub trait DefaultRanges {}
-pub trait Ranges<'a> {
+pub trait Source<'a>: IterSource<'a> {
type Get: Iter;
type Prefix: Iter;
type Range: Iter;
fn get_range(&'a self, start: &[u8], end: &[u8]) -> Self::Range;
}
-impl<'a, S: Source<'a> + DefaultRanges> Ranges<'a> for S {
- type Get = RangeIter<<S as Source<'a>>::It>;
- type Prefix = PrefixIter<<S as Source<'a>>::It>;
- type Range = RangeIter<<S as Source<'a>>::It>;
+pub trait DefaultSource<'a>: IterSource<'a> {}
+
+impl<'a, S: DefaultSource<'a>> Source<'a> for S {
+ type Get = RangeIter<S::It>;
+ type Prefix = PrefixIter<S::It>;
+ type Range = RangeIter<S::It>;
fn get(&'a self, key: &[u8]) -> Self::Get {
let mut res = RangeIter {
#[cfg(test)]
pub mod test {
- use super::{DefaultRanges, Entry, Iter, Ranges, Source};
+ use super::{DefaultSource, Entry, Iter, IterSource, Source};
pub struct TestSource(pub Vec<Entry>);
}
}
- impl<'a> Source<'a> for TestSource {
+ impl<'a> IterSource<'a> for TestSource {
type It = TestIter<'a>;
fn iter(&'a self) -> TestIter<'a> {
}
}
}
- impl<'a> DefaultRanges for TestSource {}
+ impl<'a> DefaultSource<'a> for TestSource {}
fn test_source() -> TestSource {
TestSource(vec![