From: Chris Mikkelson Date: Fri, 19 Jul 2024 20:02:20 +0000 (-0500) Subject: Add generic source wrapper for mixed mergers X-Git-Url: https://git.mikk.net/?a=commitdiff_plain;h=1ebe699c4f70e97a930cd00d6f03773c7c2e79a2;p=mtbl-rs Add generic source wrapper for mixed mergers --- 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};