From 209b48d381b7949461e308bf734f1105d40b514b Mon Sep 17 00:00:00 2001 From: Chris Mikkelson Date: Mon, 7 Apr 2025 13:43:59 -0500 Subject: [PATCH] WIP attempt to make dyn compatible source abstraction. --- src/iter.rs | 6 ++++++ src/merger.rs | 6 +++++- src/source.rs | 30 ++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/iter.rs b/src/iter.rs index 201172b..9152683 100644 --- a/src/iter.rs +++ b/src/iter.rs @@ -33,6 +33,12 @@ pub trait SeekableIter: Iterator { } } +impl SeekableIter for Box { + fn seek(&mut self, key: &[u8]) { + self.as_mut().seek(key); + } +} + pub struct PrefixIter where I: SeekableIter, diff --git a/src/merger.rs b/src/merger.rs index cd7d7b2..4b65716 100644 --- a/src/merger.rs +++ b/src/merger.rs @@ -165,7 +165,11 @@ mod test { #[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::::new(); for i in range { diff --git a/src/source.rs b/src/source.rs index 79068a7..da59f93 100644 --- a/src/source.rs +++ b/src/source.rs @@ -42,6 +42,36 @@ pub trait Source<'a> { { FilterSource::new(self, filter_func) } + + fn into_boxed( + self, + ) -> Box< + dyn Source<'a, Item = Self::Item, Iter = Box>> + + 'a, + > + where + Self: Sized + 'a, + { + Box::new(BoxedSource::<'a>(self, std::marker::PhantomData)) + } +} + +impl<'a, S: Source<'a> + ?Sized + 'a> Source<'a> for Box { + type Item = S::Item; + type Iter = Box + '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 + 'a>; + + fn iter(&'a self) -> Self::Iter { + Box::new(self.0.iter()) + } } pub struct VecIter<'a> { -- 2.50.1