]> git.mikk.net Git - mtbl-rs/commitdiff
Refactor Source trait hierarchy
authorChris Mikkelson <cmikk@fsi.io>
Sun, 21 Jul 2024 00:40:23 +0000 (19:40 -0500)
committerChris Mikkelson <cmikk@fsi.io>
Sun, 21 Jul 2024 00:40:23 +0000 (19:40 -0500)
Source implements get/prefix/range, and is a subtrait of
IterSource which implements only iter(). The Default
implementation is now another subtrait of IterSource.

This avoids several of the previouas `Source<'a> + Ranges<'a>`
and 'Source<'a> + DefaultRanges' type constraints, and
simplifies type paths.

src/merger.rs
src/source.rs

index 2ec071a94c0b3b1129c013cf8c09f881293638af..66e920013fa84aaa5e4c1b0cb6d411e7421a1c53 100644 (file)
@@ -1,4 +1,4 @@
-use crate::{source::Ranges, Entry, Iter, Source};
+use crate::{source::IterSource, Entry, Iter, Source};
 use std::cmp::Ordering;
 use std::collections::BinaryHeap;
 use std::marker::PhantomData;
@@ -51,15 +51,6 @@ pub struct MergeIter<I: Iter> {
     last_key: Vec<u8>,
 }
 
-impl<I: Iter> MergeIter<I> {
-    fn add(&mut self, mut it: I) {
-        match it.next() {
-            Some(e) => self.heap.push(MergeEntry { e, it }),
-            None => self.finished.push(it),
-        }
-    }
-}
-
 impl<I> From<I> for MergeIter<I::Item>
 where
     I: Iterator,
@@ -147,17 +138,17 @@ impl<I: Iter> Iter for MergeIter<I> {
     }
 }
 
-impl<'a, S: Source<'a>> Source<'a> for Merger<'a, S> {
+impl<'a, S: Source<'a>> IterSource<'a> for Merger<'a, S> {
     type It = MergeIter<S::It>;
     fn iter(&'a self) -> Self::It {
         MergeIter::from(self.sources.iter().map(|s| s.iter()))
     }
 }
 
-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>;
+impl<'a, S: Source<'a>> Source<'a> for Merger<'a, S> {
+    type Get = MergeIter<S::Get>;
+    type Prefix = MergeIter<S::Prefix>;
+    type Range = MergeIter<S::Range>;
 
     fn get(&'a self, key: &[u8]) -> Self::Get {
         MergeIter::from(self.sources.iter().map(|s| s.get(key)))
@@ -176,7 +167,8 @@ impl<'a, S: Source<'a> + Ranges<'a>> Ranges<'a> for Merger<'a, S> {
 mod test {
     use super::Merger;
     use crate::source::test::TestSource;
-    use crate::{Entry, Source};
+    use crate::source::IterSource;
+    use crate::Entry;
 
     fn tnum(m: u8) -> Vec<u8> {
         Vec::from_iter((1u8..255).into_iter().filter(|i| i % m == 0))
index 4d581a7db961b0448a6a875b2455cf2772c2e0d6..556f1105dc9adea5710df6f32dab59888d4f0769 100644 (file)
@@ -11,12 +11,11 @@ impl<'a> Iter for Box<dyn Iter + 'a> {
     }
 }
 
-pub trait Source<'a> {
+pub trait IterSource<'a> {
     type It: Iter;
-    fn iter(&'a self) -> <Self as Source>::It;
+    fn iter(&'a self) -> Self::It;
 }
-pub trait DefaultRanges {}
-pub trait Ranges<'a> {
+pub trait Source<'a>: IterSource<'a> {
     type Get: Iter;
     type Prefix: Iter;
     type Range: Iter;
@@ -26,10 +25,12 @@ pub trait Ranges<'a> {
     fn get_range(&'a self, start: &[u8], end: &[u8]) -> Self::Range;
 }
 
-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>;
+pub trait DefaultSource<'a>: IterSource<'a> {}
+
+impl<'a, S: DefaultSource<'a>> Source<'a> for S {
+    type Get = RangeIter<S::It>;
+    type Prefix = PrefixIter<S::It>;
+    type Range = RangeIter<S::It>;
 
     fn get(&'a self, key: &[u8]) -> Self::Get {
         let mut res = RangeIter {
@@ -117,7 +118,7 @@ impl<I: Iter> Iter for RangeIter<I> {
 
 #[cfg(test)]
 pub mod test {
-    use super::{DefaultRanges, Entry, Iter, Ranges, Source};
+    use super::{DefaultSource, Entry, Iter, IterSource, Source};
 
     pub struct TestSource(pub Vec<Entry>);
 
@@ -149,7 +150,7 @@ pub mod test {
         }
     }
 
-    impl<'a> Source<'a> for TestSource {
+    impl<'a> IterSource<'a> for TestSource {
         type It = TestIter<'a>;
 
         fn iter(&'a self) -> TestIter<'a> {
@@ -159,7 +160,7 @@ pub mod test {
             }
         }
     }
-    impl<'a> DefaultRanges for TestSource {}
+    impl<'a> DefaultSource<'a> for TestSource {}
 
     fn test_source() -> TestSource {
         TestSource(vec![