use crate::Entry;
use std::iter::Iterator;
-use std::marker::PhantomData;
pub trait Iter: Iterator<Item = Entry> {
fn seek(&mut self, key: &[u8]);
}
}
-pub struct WrapSource<'a, S: Source<'a> + Ranges<'a> + 'a>(S, PhantomData<&'a S>);
-impl<'a, S: Source<'a> + Ranges<'a> + 'a> Source<'a> for WrapSource<'a, S> {
- type It = Box<dyn Iter + 'a>;
- fn iter(&'a self) -> Self::It {
- Box::new(self.0.iter())
- }
-}
-impl<'a, S: Source<'a> + Ranges<'a> + 'a> Ranges<'a> for WrapSource<'a, S> {
- type Get = Box<dyn Iter + 'a>;
- type Prefix = Box<dyn Iter + 'a>;
- type Range = Box<dyn Iter + 'a>;
-
- fn get(&'a self, key: &[u8]) -> Self::Get {
- Box::new(self.0.get(key))
- }
- fn get_prefix(&'a self, prefix: &[u8]) -> Self::Prefix {
- Box::new(self.0.get_prefix(prefix))
- }
- fn get_range(&'a self, start: &[u8], end: &[u8]) -> Self::Range {
- Box::new(self.0.get_range(start, end))
- }
-}
-impl<'a, S: Source<'a> + Ranges<'a> + 'a> GenSource<'a> for WrapSource<'a, S> {}
-
-trait GenSource<'a>:
- Source<'a, It = Box<dyn Iter + 'a>>
- + Ranges<'a, Get = Box<dyn Iter + 'a>, Prefix = Box<dyn Iter + 'a>, Range = Box<dyn Iter + 'a>>
-{
-}
-
-struct GenericSource<'a>(Box<dyn GenSource<'a> + 'a>, PhantomData<&'a u8>);
-impl<'a> GenericSource<'a> {
- fn from<S: Source<'a> + Ranges<'a> + 'a>(source: S) -> Self {
- panic!("GenericSource::from running");
- GenericSource(Box::new(WrapSource(source, PhantomData)), PhantomData)
- }
-}
-
-impl<'a> Source<'a> for GenericSource<'a> {
- type It = Box<dyn Iter + 'a>;
- fn iter(&'a self) -> Self::It {
- self.0.iter()
- }
-}
-impl<'a> Ranges<'a> for GenericSource<'a> {
- type Get = Box<dyn Iter + 'a>;
- type Prefix = Box<dyn Iter + 'a>;
- type Range = Box<dyn Iter + 'a>;
- fn get(&'a self, key: &[u8]) -> Self::Get {
- self.0.get(key)
- }
- fn get_prefix(&'a self, prefix: &[u8]) -> Self::Prefix {
- self.0.get_prefix(prefix)
- }
- fn get_range(&'a self, start: &[u8], end: &[u8]) -> Self::Range {
- self.0.get_range(start, end)
- }
-}
-
#[cfg(test)]
pub mod test {
- use super::{DefaultRanges, Entry, GenericSource, Iter, Ranges, Source};
+ use super::{DefaultRanges, Entry, Iter, Ranges, Source};
pub struct TestSource(pub Vec<Entry>);
#[test]
fn test_source_iter() {
- // WrapSource used directly works, as does test_source()
- // let s = WrapSource(test_source(), PhantomData);
let s = test_source();
- // But if wrapped in GenericSource, complains of
- // borrowed value does not live long enough
- // at the first s.iter() call
- let _ = GenericSource::from(test_source());
assert_eq!(
Vec::from_iter(s.iter().map(|e| e.value[0])),
vec![0, 1, 2, 3, 4]