use crate::{source::Ranges, Entry, Iter, Source};
use std::cmp::Ordering;
use std::collections::BinaryHeap;
+use std::marker::PhantomData;
-pub struct Merger<S: Source> {
+pub struct Merger<'a, S: Source<'a>> {
sources: Vec<S>,
+ phantom: PhantomData<&'a S>,
}
-impl<S, I> From<I> for Merger<S>
+impl<'a, S, I> From<I> for Merger<'a, S>
where
- S: Source,
+ S: Source<'a>,
I: IntoIterator<Item = S>,
{
fn from(i: I) -> Self {
Merger {
sources: Vec::from_iter(i),
+ phantom: PhantomData,
}
}
}
}
}
-impl<S: Source> Source for Merger<S> {
+impl<'a, S: Source<'a>> Source<'a> for Merger<'a, S> {
type It = MergeIter<S::It>;
- fn iter(&self) -> Self::It {
+ fn iter(&'a self) -> Self::It {
MergeIter::from(self.sources.iter().map(|s| s.iter()))
}
}
-impl<S: Source + Ranges> Ranges for Merger<S> {
- type Get = MergeIter<<S as Ranges>::Get>;
- type Prefix = MergeIter<<S as Ranges>::Prefix>;
- type Range = MergeIter<<S as Ranges>::Range>;
+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>;
- fn get(&self, key: &[u8]) -> Self::Get {
+ fn get(&'a self, key: &[u8]) -> Self::Get {
MergeIter::from(self.sources.iter().map(|s| s.get(key)))
}
- fn get_prefix(&self, prefix: &[u8]) -> Self::Prefix {
+ fn get_prefix(&'a self, prefix: &[u8]) -> Self::Prefix {
MergeIter::from(self.sources.iter().map(|s| s.get_prefix(prefix)))
}
- fn get_range(&self, start: &[u8], end: &[u8]) -> Self::Range {
+ fn get_range(&'a self, start: &[u8], end: &[u8]) -> Self::Range {
MergeIter::from(self.sources.iter().map(|s| s.get_range(start, end)))
}
}
mod test {
use super::Merger;
use crate::source::test::TestSource;
- use crate::{Entry, Source};
- use std::marker::PhantomData;
+ use crate::{Entry, Iter, Source};
fn tnum(m: u8) -> Vec<u8> {
Vec::from_iter((1u8..255).into_iter().filter(|i| i % m == 0))
}
- fn test_source<'a>(m: u8) -> TestSource<'a> {
- TestSource(
- Vec::from_iter(tnum(m).into_iter().map(|n| Entry::new(vec![n], vec![0]))),
- PhantomData,
- )
+ fn test_source(m: u8) -> TestSource {
+ TestSource(Vec::from_iter(
+ tnum(m).into_iter().map(|n| Entry::new(vec![n], vec![0])),
+ ))
}
#[test]
use crate::Entry;
+use std::io;
use std::iter::Iterator;
+use std::marker::PhantomData;
pub trait Iter: Iterator<Item = Entry> {
fn seek(&mut self, key: &[u8]);
}
-impl Iter for Box<dyn Iter> {
+impl<'a> Iter for Box<dyn Iter + 'a> {
fn seek(&mut self, key: &[u8]) {
self.as_mut().seek(key);
}
}
-pub trait Source {
+pub trait Source<'a> {
type It: Iter;
- fn iter(&self) -> <Self as Source>::It;
+ fn iter(&'a self) -> <Self as Source>::It;
}
pub trait DefaultRanges {}
-pub trait Ranges {
+pub trait Ranges<'a> {
type Get: Iter;
type Prefix: Iter;
type Range: Iter;
- fn get(&self, key: &[u8]) -> Self::Get;
- fn get_prefix(&self, prefix: &[u8]) -> Self::Prefix;
- fn get_range(&self, start: &[u8], end: &[u8]) -> Self::Range;
+ fn get(&'a self, key: &[u8]) -> Self::Get;
+ fn get_prefix(&'a self, prefix: &[u8]) -> Self::Prefix;
+ fn get_range(&'a self, start: &[u8], end: &[u8]) -> Self::Range;
}
-impl<S: Source + DefaultRanges> Ranges for S {
- type Get = RangeIter<<S as Source>::It>;
- type Prefix = PrefixIter<<S as Source>::It>;
- type Range = RangeIter<<S as Source>::It>;
+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>;
- fn get(&self, key: &[u8]) -> Self::Get {
+ fn get(&'a self, key: &[u8]) -> Self::Get {
let mut res = RangeIter {
iter: self.iter(),
start: Vec::from(key),
res
}
- fn get_prefix(&self, prefix: &[u8]) -> Self::Prefix {
+ fn get_prefix(&'a self, prefix: &[u8]) -> Self::Prefix {
let mut res = PrefixIter {
iter: self.iter(),
prefix: Vec::from(prefix),
res
}
- fn get_range(&self, start: &[u8], end: &[u8]) -> Self::Range {
+ fn get_range(&'a self, start: &[u8], end: &[u8]) -> Self::Range {
let mut res = RangeIter {
iter: self.iter(),
start: Vec::from(start),
#[cfg(test)]
pub mod test {
use super::{DefaultRanges, Entry, Iter, Ranges, Source};
- use std::marker::PhantomData;
- pub struct TestSource<'a>(pub Vec<Entry>, pub PhantomData<&'a u8>);
+ pub struct TestSource(pub Vec<Entry>);
- struct TestIter<'a> {
- source: &'a TestSource<'a>,
+ pub struct TestIter<'a> {
+ source: &'a TestSource,
off: usize,
}
}
}
- impl<'a> Source for TestSource<'a> {
+ impl<'a> Source<'a> for TestSource {
type It = TestIter<'a>;
- fn iter(&self) -> TestIter<'a> {
+ fn iter(&'a self) -> TestIter<'a> {
TestIter {
source: self,
off: 0,
}
}
}
- impl<'a> DefaultRanges for TestSource<'a> {}
-
- fn test_source<'a>() -> TestSource<'a> {
- TestSource(
- vec![
- Entry::new(vec![0, 0, 0, 0], vec![0]),
- Entry::new(vec![0, 0, 0, 1], vec![1]),
- Entry::new(vec![0, 0, 1, 0], vec![2]),
- Entry::new(vec![0, 1, 0, 0], vec![3]),
- Entry::new(vec![1, 0, 0, 0], vec![4]),
- ],
- PhantomData,
- )
+ impl<'a> DefaultRanges for TestSource {}
+
+ fn test_source() -> TestSource {
+ TestSource(vec![
+ Entry::new(vec![0, 0, 0, 0], vec![0]),
+ Entry::new(vec![0, 0, 0, 1], vec![1]),
+ Entry::new(vec![0, 0, 1, 0], vec![2]),
+ Entry::new(vec![0, 1, 0, 0], vec![3]),
+ Entry::new(vec![1, 0, 0, 0], vec![4]),
+ ])
}
#[test]