From 99e1b118eee64bb46689906a814af522d0c3d204 Mon Sep 17 00:00:00 2001 From: Chris Mikkelson Date: Sun, 21 Jul 2024 21:12:51 -0500 Subject: [PATCH] WIP experiment dyn source Lifetime making it hard to test, possibly implement at all --- src/lib.rs | 1 + src/source.rs | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 92 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index d54ab8b..9a79bf0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ +#![allow(dead_code)] pub mod entry; use entry::Entry; diff --git a/src/source.rs b/src/source.rs index 556f110..ee341bd 100644 --- a/src/source.rs +++ b/src/source.rs @@ -172,9 +172,34 @@ pub mod test { ]) } + fn chk<'a, S: Source<'a>>(s: S) -> S { + s + } + #[test] fn test_source_iter() { - let s = test_source(); + // works + //let s = test_source(); + + // works + //let w = Box::new(SourceWrapper(test_source(), PhantomData)); + //let s: &dyn GenSource = w.as_ref(); + + // also works + // let w = SourceWrapper(test_source(), PhantomData); + // let s: &dyn GenSource = &w; + + let s = GenSourceS::from(test_source()); + //let s = test_source(); + + // borrowed value 's' doesn't live long enough' + // box.iter() consumes! Ding + // let s: Box = test_source().into(); + // + // same as above + // let b: Box = test_source().into(); + // let s = b.as_ref(); + // assert_eq!( Vec::from_iter(s.iter().map(|e| e.value[0])), vec![0, 1, 2, 3, 4] @@ -195,4 +220,69 @@ pub mod test { vec![1, 2, 3] ); } + + type GenIter<'a> = Box; + struct GenSourceS<'a> { + inner: Box< + dyn Source<'a, It = GenIter, Get = GenIter, Prefix = GenIter, Range = GenIter> + 'a, + >, + } + use std::marker::PhantomData; + struct SourceWrapper<'a, S: Source<'a>>(S, PhantomData<&'a u8>); + impl<'a, S: Source<'a>> IterSource<'a> for SourceWrapper<'a, S> { + type It = GenIter<'a>; + fn iter(&'a self) -> Self::It { + Box::new(self.0.iter()) + } + } + impl<'a, S: Source<'a>> Source<'a> for SourceWrapper<'a, S> { + type Get = GenIter<'a>; + fn get(&'a self, key: &[u8]) -> Self::Get { + Box::new(self.0.get(key)) + } + type Prefix = GenIter<'a>; + fn get_prefix(&'a self, prefix: &[u8]) -> Self::Prefix { + Box::new(self.0.get_prefix(prefix)) + } + type Range = GenIter<'a>; + fn get_range(&'a self, start: &[u8], end: &[u8]) -> Self::Range { + Box::new(self.0.get_range(start, end)) + } + } + + impl<'a> GenSourceS<'a> { + fn from + 'a>(source: S) -> Self { + GenSourceS { + inner: Box::new(SourceWrapper(source, PhantomData)), + } + } + } + impl<'a> IterSource<'a> for GenSourceS<'a> { + type It = GenIter<'a>; + fn iter(&'a self) -> Self::It { + Box::new(self.inner.iter()) + } + } + impl<'a> Source<'a> for GenSourceS<'a> { + type Get = GenIter<'a>; + fn get(&'a self, key: &[u8]) -> Self::Get { + Box::new(self.inner.get(key)) + } + type Prefix = GenIter<'a>; + fn get_prefix(&'a self, prefix: &[u8]) -> Self::Prefix { + Box::new(self.inner.get_prefix(prefix)) + } + type Range = GenIter<'a>; + fn get_range(&'a self, start: &[u8], end: &[u8]) -> Self::Range { + Box::new(self.inner.get_range(start, end)) + } + } + + #[test] + fn test_dyn_source() { + let b = GenSourceS::from(test_source()); + { + b.iter(); + } + } } -- 2.50.1