use crate::Entry;
-use std::io;
use std::iter::Iterator;
use std::marker::PhantomData;
}
}
-struct WrapSource<'a, S: Source<'a> + Ranges<'a>>(S, PhantomData<&'a S>);
-impl<'a, S: Source<'a> + Ranges<'a>> Source<'a> for WrapSource<'a, S> {
+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>> Ranges<'a> for WrapSource<'a, S> {
+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>;
Box::new(self.0.get_range(start, end))
}
}
+impl<'a, S: Source<'a> + Ranges<'a> + 'a> GenSource<'a> for WrapSource<'a, S> {}
-struct GenericSource<'a>(
- Box<dyn Source<'a, It = Box<dyn Iter + 'a>> + 'a>,
- PhantomData<&'a u8>,
-);
+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)
}
}
self.0.iter()
}
}
-impl<'a> DefaultRanges for GenericSource<'a> {}
+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, Iter, Ranges, Source};
+ use super::{DefaultRanges, Entry, GenericSource, 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]