From 917bdd0cdbf624e57b4acbc83e4bbdd434570b76 Mon Sep 17 00:00:00 2001 From: Chris Mikkelson Date: Fri, 19 Jul 2024 13:41:45 -0500 Subject: [PATCH] fixed lifetime issue! ? --- src/merger.rs | 39 ++++++++++++++++--------------- src/source.rs | 64 +++++++++++++++++++++++++-------------------------- 2 files changed, 51 insertions(+), 52 deletions(-) diff --git a/src/merger.rs b/src/merger.rs index 78e0362..13af043 100644 --- a/src/merger.rs +++ b/src/merger.rs @@ -1,19 +1,22 @@ use crate::{source::Ranges, Entry, Iter, Source}; use std::cmp::Ordering; use std::collections::BinaryHeap; +use std::marker::PhantomData; -pub struct Merger { +pub struct Merger<'a, S: Source<'a>> { sources: Vec, + phantom: PhantomData<&'a S>, } -impl From for Merger +impl<'a, S, I> From for Merger<'a, S> where - S: Source, + S: Source<'a>, I: IntoIterator, { fn from(i: I) -> Self { Merger { sources: Vec::from_iter(i), + phantom: PhantomData, } } } @@ -144,27 +147,27 @@ impl Iter for MergeIter { } } -impl Source for Merger { +impl<'a, S: Source<'a>> Source<'a> for Merger<'a, S> { type It = MergeIter; - fn iter(&self) -> Self::It { + fn iter(&'a self) -> Self::It { MergeIter::from(self.sources.iter().map(|s| s.iter())) } } -impl Ranges for Merger { - type Get = MergeIter<::Get>; - type Prefix = MergeIter<::Prefix>; - type Range = MergeIter<::Range>; +impl<'a, S: Source<'a> + Ranges<'a>> Ranges<'a> for Merger<'a, S> { + type Get = MergeIter<>::Get>; + type Prefix = MergeIter<>::Prefix>; + type Range = MergeIter<>::Range>; - fn get(&self, key: &[u8]) -> Self::Get { + fn get(&'a self, key: &[u8]) -> Self::Get { MergeIter::from(self.sources.iter().map(|s| s.get(key))) } - fn get_prefix(&self, prefix: &[u8]) -> Self::Prefix { + fn get_prefix(&'a self, prefix: &[u8]) -> Self::Prefix { MergeIter::from(self.sources.iter().map(|s| s.get_prefix(prefix))) } - fn get_range(&self, start: &[u8], end: &[u8]) -> Self::Range { + fn get_range(&'a self, start: &[u8], end: &[u8]) -> Self::Range { MergeIter::from(self.sources.iter().map(|s| s.get_range(start, end))) } } @@ -173,18 +176,16 @@ impl Ranges for Merger { mod test { use super::Merger; use crate::source::test::TestSource; - use crate::{Entry, Source}; - use std::marker::PhantomData; + use crate::{Entry, Iter, Source}; fn tnum(m: u8) -> Vec { Vec::from_iter((1u8..255).into_iter().filter(|i| i % m == 0)) } - fn test_source<'a>(m: u8) -> TestSource<'a> { - TestSource( - Vec::from_iter(tnum(m).into_iter().map(|n| Entry::new(vec![n], vec![0]))), - PhantomData, - ) + fn test_source(m: u8) -> TestSource { + TestSource(Vec::from_iter( + tnum(m).into_iter().map(|n| Entry::new(vec![n], vec![0])), + )) } #[test] diff --git a/src/source.rs b/src/source.rs index 1f7ce31..e75f5c8 100644 --- a/src/source.rs +++ b/src/source.rs @@ -1,37 +1,39 @@ use crate::Entry; +use std::io; use std::iter::Iterator; +use std::marker::PhantomData; pub trait Iter: Iterator { fn seek(&mut self, key: &[u8]); } -impl Iter for Box { +impl<'a> Iter for Box { fn seek(&mut self, key: &[u8]) { self.as_mut().seek(key); } } -pub trait Source { +pub trait Source<'a> { type It: Iter; - fn iter(&self) -> ::It; + fn iter(&'a self) -> ::It; } pub trait DefaultRanges {} -pub trait Ranges { +pub trait Ranges<'a> { type Get: Iter; type Prefix: Iter; type Range: Iter; - fn get(&self, key: &[u8]) -> Self::Get; - fn get_prefix(&self, prefix: &[u8]) -> Self::Prefix; - fn get_range(&self, start: &[u8], end: &[u8]) -> Self::Range; + fn get(&'a self, key: &[u8]) -> Self::Get; + fn get_prefix(&'a self, prefix: &[u8]) -> Self::Prefix; + fn get_range(&'a self, start: &[u8], end: &[u8]) -> Self::Range; } -impl Ranges for S { - type Get = RangeIter<::It>; - type Prefix = PrefixIter<::It>; - type Range = RangeIter<::It>; +impl<'a, S: Source<'a> + DefaultRanges> Ranges<'a> for S { + type Get = RangeIter<>::It>; + type Prefix = PrefixIter<>::It>; + type Range = RangeIter<>::It>; - fn get(&self, key: &[u8]) -> Self::Get { + fn get(&'a self, key: &[u8]) -> Self::Get { let mut res = RangeIter { iter: self.iter(), start: Vec::from(key), @@ -41,7 +43,7 @@ impl Ranges for S { res } - fn get_prefix(&self, prefix: &[u8]) -> Self::Prefix { + fn get_prefix(&'a self, prefix: &[u8]) -> Self::Prefix { let mut res = PrefixIter { iter: self.iter(), prefix: Vec::from(prefix), @@ -50,7 +52,7 @@ impl Ranges for S { res } - fn get_range(&self, start: &[u8], end: &[u8]) -> Self::Range { + fn get_range(&'a self, start: &[u8], end: &[u8]) -> Self::Range { let mut res = RangeIter { iter: self.iter(), start: Vec::from(start), @@ -118,12 +120,11 @@ impl Iter for RangeIter { #[cfg(test)] pub mod test { use super::{DefaultRanges, Entry, Iter, Ranges, Source}; - use std::marker::PhantomData; - pub struct TestSource<'a>(pub Vec, pub PhantomData<&'a u8>); + pub struct TestSource(pub Vec); - struct TestIter<'a> { - source: &'a TestSource<'a>, + pub struct TestIter<'a> { + source: &'a TestSource, off: usize, } @@ -150,29 +151,26 @@ pub mod test { } } - impl<'a> Source for TestSource<'a> { + impl<'a> Source<'a> for TestSource { type It = TestIter<'a>; - fn iter(&self) -> TestIter<'a> { + fn iter(&'a self) -> TestIter<'a> { TestIter { source: self, off: 0, } } } - impl<'a> DefaultRanges for TestSource<'a> {} - - fn test_source<'a>() -> TestSource<'a> { - TestSource( - vec![ - Entry::new(vec![0, 0, 0, 0], vec![0]), - Entry::new(vec![0, 0, 0, 1], vec![1]), - Entry::new(vec![0, 0, 1, 0], vec![2]), - Entry::new(vec![0, 1, 0, 0], vec![3]), - Entry::new(vec![1, 0, 0, 0], vec![4]), - ], - PhantomData, - ) + impl<'a> DefaultRanges for TestSource {} + + fn test_source() -> TestSource { + TestSource(vec![ + Entry::new(vec![0, 0, 0, 0], vec![0]), + Entry::new(vec![0, 0, 0, 1], vec![1]), + Entry::new(vec![0, 0, 1, 0], vec![2]), + Entry::new(vec![0, 1, 0, 0], vec![3]), + Entry::new(vec![1, 0, 0, 0], vec![4]), + ]) } #[test] -- 2.50.1