}
}
+impl<I: SeekableIter + ?Sized> SeekableIter for Box<I> {
+ fn seek(&mut self, key: &[u8]) {
+ self.as_mut().seek(key);
+ }
+}
+
pub struct PrefixIter<I>
where
I: SeekableIter,
#[test]
fn test_merge() {
let range = 1..8;
- let iters: Vec<_> = range.clone().map(test_source).collect();
+ let iters: Vec<_> = range
+ .clone()
+ .map(test_source)
+ .map(|s| s.into_boxed())
+ .collect();
let s = Merger::from(iters);
let mut v = Vec::<u8>::new();
for i in range {
{
FilterSource::new(self, filter_func)
}
+
+ fn into_boxed(
+ self,
+ ) -> Box<
+ dyn Source<'a, Item = Self::Item, Iter = Box<dyn 'a + SeekableIter<Item = Self::Item>>>
+ + 'a,
+ >
+ where
+ Self: Sized + 'a,
+ {
+ Box::new(BoxedSource::<'a>(self, std::marker::PhantomData))
+ }
+}
+
+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>;
+ 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>;
+
+ fn iter(&'a self) -> Self::Iter {
+ Box::new(self.0.iter())
+ }
}
pub struct VecIter<'a> {