]> git.mikk.net Git - mtbl-rs/commitdiff
fixed lifetime issue! ?
authorChris Mikkelson <cmikk@fsi.io>
Fri, 19 Jul 2024 18:41:45 +0000 (13:41 -0500)
committerChris Mikkelson <cmikk@fsi.io>
Fri, 19 Jul 2024 18:41:45 +0000 (13:41 -0500)
src/merger.rs
src/source.rs

index 78e036266508a932b0da510781f9ad96f627e5f0..13af043ea0ca47ad2b7081bff24fea64a3a050a5 100644 (file)
@@ -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<S: Source> {
+pub struct Merger<'a, S: Source<'a>> {
     sources: Vec<S>,
+    phantom: PhantomData<&'a S>,
 }
 
-impl<S, I> From<I> for Merger<S>
+impl<'a, S, I> From<I> for Merger<'a, S>
 where
-    S: Source,
+    S: Source<'a>,
     I: IntoIterator<Item = S>,
 {
     fn from(i: I) -> Self {
         Merger {
             sources: Vec::from_iter(i),
+            phantom: PhantomData,
         }
     }
 }
@@ -144,27 +147,27 @@ impl<I: Iter> Iter for MergeIter<I> {
     }
 }
 
-impl<S: Source> Source for Merger<S> {
+impl<'a, S: Source<'a>> Source<'a> for Merger<'a, S> {
     type It = MergeIter<S::It>;
-    fn iter(&self) -> Self::It {
+    fn iter(&'a self) -> Self::It {
         MergeIter::from(self.sources.iter().map(|s| s.iter()))
     }
 }
 
-impl<S: Source + Ranges> Ranges for Merger<S> {
-    type Get = MergeIter<<S as Ranges>::Get>;
-    type Prefix = MergeIter<<S as Ranges>::Prefix>;
-    type Range = MergeIter<<S as Ranges>::Range>;
+impl<'a, S: Source<'a> + Ranges<'a>> Ranges<'a> for Merger<'a, S> {
+    type Get = MergeIter<<S as Ranges<'a>>::Get>;
+    type Prefix = MergeIter<<S as Ranges<'a>>::Prefix>;
+    type Range = MergeIter<<S as Ranges<'a>>::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<S: Source + Ranges> Ranges for Merger<S> {
 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<u8> {
         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]
index 1f7ce310ffa60844dab049e2d5087728c1e6329e..e75f5c87b20065b3b32934b1e951977c1bab94a1 100644 (file)
@@ -1,37 +1,39 @@
 use crate::Entry;
+use std::io;
 use std::iter::Iterator;
+use std::marker::PhantomData;
 
 pub trait Iter: Iterator<Item = Entry> {
     fn seek(&mut self, key: &[u8]);
 }
 
-impl Iter for Box<dyn Iter> {
+impl<'a> Iter for Box<dyn Iter + 'a> {
     fn seek(&mut self, key: &[u8]) {
         self.as_mut().seek(key);
     }
 }
 
-pub trait Source {
+pub trait Source<'a> {
     type It: Iter;
-    fn iter(&self) -> <Self as Source>::It;
+    fn iter(&'a self) -> <Self as Source>::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<S: Source + DefaultRanges> Ranges for S {
-    type Get = RangeIter<<S as Source>::It>;
-    type Prefix = PrefixIter<<S as Source>::It>;
-    type Range = RangeIter<<S as Source>::It>;
+impl<'a, S: Source<'a> + DefaultRanges> Ranges<'a> for S {
+    type Get = RangeIter<<S as Source<'a>>::It>;
+    type Prefix = PrefixIter<<S as Source<'a>>::It>;
+    type Range = RangeIter<<S as Source<'a>>::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<S: Source + DefaultRanges> 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<S: Source + DefaultRanges> 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<I: Iter> Iter for RangeIter<I> {
 #[cfg(test)]
 pub mod test {
     use super::{DefaultRanges, Entry, Iter, Ranges, Source};
-    use std::marker::PhantomData;
 
-    pub struct TestSource<'a>(pub Vec<Entry>, pub PhantomData<&'a u8>);
+    pub struct TestSource(pub Vec<Entry>);
 
-    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]