From 1ebe699c4f70e97a930cd00d6f03773c7c2e79a2 Mon Sep 17 00:00:00 2001 From: Chris Mikkelson Date: Fri, 19 Jul 2024 15:02:20 -0500 Subject: [PATCH] Add generic source wrapper for mixed mergers --- src/source.rs | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/source.rs b/src/source.rs index e75f5c8..4672f9c 100644 --- a/src/source.rs +++ b/src/source.rs @@ -117,6 +117,47 @@ impl Iter for RangeIter { } } +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> { + type It = Box; + fn iter(&'a self) -> Self::It { + Box::new(self.0.iter()) + } +} +impl<'a, S: Source<'a> + Ranges<'a>> Ranges<'a> for WrapSource<'a, S> { + type Get = Box; + type Prefix = Box; + type Range = Box; + + 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)) + } +} + +struct GenericSource<'a>( + Box> + 'a>, + PhantomData<&'a u8>, +); +impl<'a> GenericSource<'a> { + fn from + Ranges<'a> + 'a>(source: S) -> Self { + GenericSource(Box::new(WrapSource(source, PhantomData)), PhantomData) + } +} + +impl<'a> Source<'a> for GenericSource<'a> { + type It = Box; + fn iter(&'a self) -> Self::It { + self.0.iter() + } +} +impl<'a> DefaultRanges for GenericSource<'a> {} + #[cfg(test)] pub mod test { use super::{DefaultRanges, Entry, Iter, Ranges, Source}; -- 2.50.1