From 704f2561a0e31b11686d350bb0caf23db204c158 Mon Sep 17 00:00:00 2001 From: Chris Mikkelson Date: Sat, 20 Jul 2024 19:40:23 -0500 Subject: [PATCH] Refactor Source trait hierarchy 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 | 24 ++++++++---------------- src/source.rs | 23 ++++++++++++----------- 2 files changed, 20 insertions(+), 27 deletions(-) diff --git a/src/merger.rs b/src/merger.rs index 2ec071a..66e9200 100644 --- a/src/merger.rs +++ b/src/merger.rs @@ -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 { last_key: Vec, } -impl MergeIter { - fn add(&mut self, mut it: I) { - match it.next() { - Some(e) => self.heap.push(MergeEntry { e, it }), - None => self.finished.push(it), - } - } -} - impl From for MergeIter where I: Iterator, @@ -147,17 +138,17 @@ impl Iter for MergeIter { } } -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; 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<>::Get>; - type Prefix = MergeIter<>::Prefix>; - type Range = MergeIter<>::Range>; +impl<'a, S: Source<'a>> Source<'a> for Merger<'a, S> { + type Get = MergeIter; + type Prefix = MergeIter; + type Range = MergeIter; 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 { Vec::from_iter((1u8..255).into_iter().filter(|i| i % m == 0)) diff --git a/src/source.rs b/src/source.rs index 4d581a7..556f110 100644 --- a/src/source.rs +++ b/src/source.rs @@ -11,12 +11,11 @@ impl<'a> Iter for Box { } } -pub trait Source<'a> { +pub trait IterSource<'a> { type It: Iter; - fn iter(&'a self) -> ::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<>::It>; - type Prefix = PrefixIter<>::It>; - type Range = RangeIter<>::It>; +pub trait DefaultSource<'a>: IterSource<'a> {} + +impl<'a, S: DefaultSource<'a>> Source<'a> for S { + type Get = RangeIter; + type Prefix = PrefixIter; + type Range = RangeIter; fn get(&'a self, key: &[u8]) -> Self::Get { let mut res = RangeIter { @@ -117,7 +118,7 @@ impl Iter for RangeIter { #[cfg(test)] pub mod test { - use super::{DefaultRanges, Entry, Iter, Ranges, Source}; + use super::{DefaultSource, Entry, Iter, IterSource, Source}; pub struct TestSource(pub Vec); @@ -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![ -- 2.50.1