From cd15eaa7c13be81d7278727a2728c72eab5521b5 Mon Sep 17 00:00:00 2001 From: Chris Mikkelson Date: Mon, 7 Apr 2025 14:39:00 -0500 Subject: [PATCH] WIP #2 - Remove Item associated type from Source --- src/dupsort.rs | 9 ++++----- src/filter.rs | 5 ++--- src/iter.rs | 1 - src/merge.rs | 4 ++-- src/merger.rs | 6 +++--- src/reader/mod.rs | 1 - src/source.rs | 37 ++++++++++++++++++++++--------------- 7 files changed, 33 insertions(+), 30 deletions(-) diff --git a/src/dupsort.rs b/src/dupsort.rs index 7905ce3..f0a53ef 100644 --- a/src/dupsort.rs +++ b/src/dupsort.rs @@ -5,7 +5,7 @@ use std::marker::PhantomData; pub struct DupsortSource<'a, S, F> where S: Source<'a>, - F: Fn(&S::Item, &S::Item) -> Ordering, + F: Fn(&::Item, &::Item) -> Ordering, { source: S, dupsort_func: F, @@ -15,7 +15,7 @@ where impl<'a, S, F> DupsortSource<'a, S, F> where S: Source<'a>, - F: Fn(&S::Item, &S::Item) -> Ordering, + F: Fn(&::Item, &::Item) -> Ordering, { pub fn new(source: S, dupsort_func: F) -> Self { Self { @@ -29,11 +29,10 @@ where impl<'a, S, F> Source<'a> for DupsortSource<'a, S, F> where S: Source<'a>, - S::Item: PartialEq, - F: Fn(&S::Item, &S::Item) -> Ordering + 'a, + ::Item: PartialEq, + F: Fn(&::Item, &::Item) -> Ordering + 'a, { type Iter = DupsortIter; - type Item = S::Item; fn iter(&'a self) -> Self::Iter { self.source.iter().dupsort_func(&self.dupsort_func) diff --git a/src/filter.rs b/src/filter.rs index 8f02f8c..f0ccd5e 100644 --- a/src/filter.rs +++ b/src/filter.rs @@ -62,7 +62,7 @@ pub struct FilterSource<'a, S, F> { impl<'a, S, F> FilterSource<'a, S, F> where S: Source<'a>, - F: Fn(&S::Item, &mut Vec) -> bool, + F: Fn(&::Item, &mut Vec) -> bool, { pub fn new(source: S, filter_func: F) -> Self { Self { @@ -76,10 +76,9 @@ where impl<'a, S, F> Source<'a> for FilterSource<'a, S, F> where S: Source<'a>, - F: Fn(&S::Item, &mut Vec) -> bool + 'a, + F: Fn(&::Item, &mut Vec) -> bool + 'a, { type Iter = FilterIter; - type Item = S::Item; fn iter(&'a self) -> Self::Iter { self.source.iter().filter_func(&self.filter_func) } diff --git a/src/iter.rs b/src/iter.rs index 9152683..080e9c2 100644 --- a/src/iter.rs +++ b/src/iter.rs @@ -95,7 +95,6 @@ pub struct RangeIter { impl RangeIter where I: SeekableIter, - I::Item: AsRef<[u8]>, { pub fn new(mut iter: I, start: impl AsRef<[u8]>, end: impl AsRef<[u8]>) -> Self { iter.seek(start.as_ref()); diff --git a/src/merge.rs b/src/merge.rs index 3abcb3d..567c2d9 100644 --- a/src/merge.rs +++ b/src/merge.rs @@ -23,11 +23,11 @@ where impl<'a, S, F> Source<'a> for MergeSource<'a, S, F> where - S: Source<'a, Item = Entry>, + S: Source<'a>, + S::Iter: Iterator, F: Fn(&mut Vec, &Entry) + 'a, { type Iter = MergeIter; - type Item = Entry; fn iter(&'a self) -> Self::Iter { self.source.iter().merge_func(&self.merge_func) } diff --git a/src/merger.rs b/src/merger.rs index 4b65716..7fb405f 100644 --- a/src/merger.rs +++ b/src/merger.rs @@ -136,9 +136,9 @@ impl> SeekableIter for MergeIter { impl<'a, S> Source<'a> for Merger where - S: Source<'a, Item = Entry>, + S: Source<'a>, + S::Iter: Iterator, { - type Item = Entry; type Iter = MergeIter; fn iter(&'a self) -> Self::Iter { MergeIter::from(self.sources.iter().map(|s| s.iter())) @@ -168,7 +168,7 @@ mod test { let iters: Vec<_> = range .clone() .map(test_source) - .map(|s| s.into_boxed()) + //.map(|s| s.into_boxed()) .collect(); let s = Merger::from(iters); let mut v = Vec::::new(); diff --git a/src/reader/mod.rs b/src/reader/mod.rs index e5659a3..0b5ad43 100644 --- a/src/reader/mod.rs +++ b/src/reader/mod.rs @@ -177,7 +177,6 @@ impl> SeekableIter for ReaderIter { } impl<'a, D: AsRef<[u8]>> Source<'a> for Reader { - type Item = Entry; type Iter = ReaderIter; fn iter(&'a self) -> Self::Iter { diff --git a/src/source.rs b/src/source.rs index da59f93..a785fce 100644 --- a/src/source.rs +++ b/src/source.rs @@ -5,17 +5,25 @@ use crate::merge::MergeSource; use crate::{Entry, SeekableIter}; pub trait Source<'a> { - type Iter: SeekableIter; - type Item: AsRef<[u8]>; + type Iter: SeekableIter; fn iter(&'a self) -> Self::Iter; - fn get(&'a self, key: &[u8]) -> RangeIter { + fn get(&'a self, key: &[u8]) -> RangeIter + where + ::Item: PartialOrd<[u8]>, + { RangeIter::new(self.iter(), key, key) } - fn get_prefix(&'a self, prefix: &[u8]) -> PrefixIter { + fn get_prefix(&'a self, prefix: &[u8]) -> PrefixIter + where + ::Item: AsRef<[u8]>, + { PrefixIter::new(self.iter(), prefix) } - fn get_range(&'a self, start: &[u8], end: &[u8]) -> RangeIter { + fn get_range(&'a self, start: &[u8], end: &[u8]) -> RangeIter + where + ::Item: PartialOrd<[u8]>, + { RangeIter::new(self.iter(), start, end) } @@ -30,7 +38,10 @@ pub trait Source<'a> { fn dupsort_func(self, dupsort_func: F) -> DupsortSource<'a, Self, F> where Self: Sized, - F: Fn(&Self::Item, &Self::Item) -> std::cmp::Ordering, + F: Fn( + &::Item, + &::Item, + ) -> std::cmp::Ordering, { DupsortSource::new(self, dupsort_func) } @@ -38,7 +49,7 @@ pub trait Source<'a> { fn filter(self, filter_func: F) -> FilterSource<'a, Self, F> where Self: Sized, - F: Fn(&Self::Item, &mut Vec) -> bool, + F: Fn(&::Item, &mut Vec) -> bool, { FilterSource::new(self, filter_func) } @@ -46,7 +57,7 @@ pub trait Source<'a> { fn into_boxed( self, ) -> Box< - dyn Source<'a, Item = Self::Item, Iter = Box>> + dyn Source<'a, Iter = Box::Item>>> + 'a, > where @@ -56,9 +67,8 @@ pub trait Source<'a> { } } -impl<'a, S: Source<'a> + ?Sized + 'a> Source<'a> for Box { - type Item = S::Item; - type Iter = Box + 'a>; +impl<'a, S: Source<'a> + ?Sized> Source<'a> for Box { + type Iter = Box::Item> + 'a>; fn iter(&'a self) -> Self::Iter { Box::new(self.as_ref().iter()) } @@ -66,8 +76,7 @@ impl<'a, S: Source<'a> + ?Sized + 'a> Source<'a> for Box { struct BoxedSource<'a, S: Source<'a>>(S, std::marker::PhantomData<&'a S>); impl<'a, S: Source<'a>> Source<'a> for BoxedSource<'a, S> { - type Item = S::Item; - type Iter = Box + 'a>; + type Iter = Box::Item> + 'a>; fn iter(&'a self) -> Self::Iter { Box::new(self.0.iter()) @@ -109,7 +118,6 @@ impl SeekableIter for VecIter<'_> { } impl<'a> Source<'a> for Vec { - type Item = Entry; type Iter = VecIter<'a>; fn iter(&'a self) -> Self::Iter { VecIter { @@ -155,7 +163,6 @@ pub mod test_source { } impl<'a> Source<'a> for TestSource { - type Item = Entry; type Iter = TestIter<'a>; fn iter(&'a self) -> Self::Iter { TestIter { -- 2.50.1