From 4a541a09fe7797eb1f14f32e6240f2c0d3e206ed Mon Sep 17 00:00:00 2001 From: Chris Mikkelson Date: Fri, 6 Sep 2024 00:41:24 -0500 Subject: [PATCH] Refactor Source without object safety --- src/dupsort_func.rs | 6 +-- src/merge_func.rs | 6 +-- src/merger.rs | 20 +++---- src/source.rs | 123 ++------------------------------------------ tests/rwtest.rs | 4 +- 5 files changed, 19 insertions(+), 140 deletions(-) diff --git a/src/dupsort_func.rs b/src/dupsort_func.rs index 255053b..9d15551 100644 --- a/src/dupsort_func.rs +++ b/src/dupsort_func.rs @@ -36,7 +36,7 @@ where dupsort_func: &self.dupsort_func, } } - fn get(&self, key: impl AsRef<[u8]>) -> impl Iter { + fn get(&self, key: &[u8]) -> impl Iter { DupsortFuncIter { run: Vec::new(), next: None, @@ -44,7 +44,7 @@ where dupsort_func: &self.dupsort_func, } } - fn get_prefix(&self, prefix: impl AsRef<[u8]>) -> impl Iter { + fn get_prefix(&self, prefix: &[u8]) -> impl Iter { DupsortFuncIter { run: Vec::new(), next: None, @@ -52,7 +52,7 @@ where dupsort_func: &self.dupsort_func, } } - fn get_range(&self, start: impl AsRef<[u8]>, end: impl AsRef<[u8]>) -> impl Iter { + fn get_range(&self, start: &[u8], end: &[u8]) -> impl Iter { DupsortFuncIter { run: Vec::new(), next: None, diff --git a/src/merge_func.rs b/src/merge_func.rs index 7738df3..9aff2b6 100644 --- a/src/merge_func.rs +++ b/src/merge_func.rs @@ -27,21 +27,21 @@ where merge_func: &self.merge_func, } } - fn get(&self, key: impl AsRef<[u8]>) -> impl Iter { + fn get(&self, key: &[u8]) -> impl Iter { MergeFuncIter { prev: None, iter: self.source.get(key), merge_func: &self.merge_func, } } - fn get_prefix(&self, prefix: impl AsRef<[u8]>) -> impl Iter { + fn get_prefix(&self, prefix: &[u8]) -> impl Iter { MergeFuncIter { prev: None, iter: self.source.get_prefix(prefix), merge_func: &self.merge_func, } } - fn get_range(&self, start: impl AsRef<[u8]>, end: impl AsRef<[u8]>) -> impl Iter { + fn get_range(&self, start: &[u8], end: &[u8]) -> impl Iter { MergeFuncIter { prev: None, iter: self.source.get_range(start, end), diff --git a/src/merger.rs b/src/merger.rs index 449cff5..a4f31a0 100644 --- a/src/merger.rs +++ b/src/merger.rs @@ -140,24 +140,16 @@ impl Source for Merger { MergeIter::from(self.sources.iter().map(|s| s.iter())) } - fn get(&self, key: impl AsRef<[u8]>) -> impl Iter { - let key = Vec::from(key.as_ref()); - MergeIter::from(self.sources.iter().map(|s| s.get(key.clone()))) + fn get(&self, key: &[u8]) -> impl Iter { + MergeIter::from(self.sources.iter().map(|s| s.get(key))) } - fn get_prefix(&self, prefix: impl AsRef<[u8]>) -> impl Iter { - let prefix = Vec::from(prefix.as_ref()); - MergeIter::from(self.sources.iter().map(|s| s.get_prefix(prefix.clone()))) + fn get_prefix(&self, prefix: &[u8]) -> impl Iter { + MergeIter::from(self.sources.iter().map(|s| s.get_prefix(prefix))) } - fn get_range(&self, start: impl AsRef<[u8]>, end: impl AsRef<[u8]>) -> impl Iter { - let start = Vec::from(start.as_ref()); - let end = Vec::from(end.as_ref()); - MergeIter::from( - self.sources - .iter() - .map(|s| s.get_range(start.clone(), end.clone())), - ) + fn get_range(&self, start: &[u8], end: &[u8]) -> impl Iter { + MergeIter::from(self.sources.iter().map(|s| s.get_range(start, end))) } } diff --git a/src/source.rs b/src/source.rs index 6aaee8b..3b464ac 100644 --- a/src/source.rs +++ b/src/source.rs @@ -5,14 +5,13 @@ use crate::{Entry, Iter}; pub trait Source { fn iter(&self) -> impl Iter; - fn get(&self, key: impl AsRef<[u8]>) -> impl Iter { - let key = Vec::from(key.as_ref()); - RangeIter::new(self.iter(), key.clone(), key) + fn get(&self, key: &[u8]) -> impl Iter { + RangeIter::new(self.iter(), key, key) } - fn get_prefix(&self, prefix: impl AsRef<[u8]>) -> impl Iter { + fn get_prefix(&self, prefix: &[u8]) -> impl Iter { PrefixIter::new(self.iter(), prefix) } - fn get_range(&self, start: impl AsRef<[u8]>, end: impl AsRef<[u8]>) -> impl Iter { + fn get_range(&self, start: &[u8], end: &[u8]) -> impl Iter { RangeIter::new(self.iter(), start, end) } @@ -33,80 +32,6 @@ pub trait Source { } } -/*pub trait SourceObj<'a> { - fn iter(&'a self) -> BoxedIter<'a>; - fn get(&'a self, key: Vec) -> BoxedIter<'a>; - fn get_prefix(&'a self, prefix: Vec) -> BoxedIter<'a>; - fn get_range(&'a self, start: Vec, end: Vec) -> BoxedIter<'a>; -} - -impl<'a> Source for &'a Box + 'a> { - fn iter(&self) -> impl Iter { - (*self).as_ref().iter() - } - fn get(&self, key: impl AsRef<[u8]>) -> impl Iter { - (*self).as_ref().get(Vec::from(key.as_ref())) - } - fn get_prefix(&self, prefix: impl AsRef<[u8]>) -> impl Iter { - (*self).as_ref().get_prefix(Vec::from(prefix.as_ref())) - } - fn get_range(&self, start: impl AsRef<[u8]>, end: impl AsRef<[u8]>) -> impl Iter { - (*self) - .as_ref() - .get_range(Vec::from(start.as_ref()), Vec::from(end.as_ref())) - } -} - -struct BoxWrap<'a, S: Source + 'a>(S, PhantomData<&'a S>); -impl<'a, S: Source + 'a> SourceObj<'a> for BoxWrap<'a, S> { - fn iter(&'a self) -> BoxedIter<'a> { - Box::new(self.0.iter()) - } - fn get(&'a self, key: Vec) -> BoxedIter<'a> { - Box::new(self.0.get(key)) - } - fn get_prefix(&'a self, prefix: Vec) -> BoxedIter<'a> { - Box::new(self.0.get_prefix(prefix)) - } - fn get_range(&'a self, start: Vec, end: Vec) -> BoxedIter<'a> { - Box::new(self.0.get_range(start, end)) - } -} - -pub struct BoxedSource<'a>(Box + 'a>); - -impl<'a> BoxedSource<'a> { - fn from(s: S) -> Self { - Self(Box::new(BoxWrap(s, PhantomData))) - } -} - -impl<'a> Source for &'a BoxedSource<'a> -where - Self: 'a, -{ - fn iter(&self) -> impl Iter { - (*self).0.as_ref().iter() - } - - fn get(&self, key: impl AsRef<[u8]>) -> impl Iter { - (*self).0.as_ref().get(Vec::from(key.as_ref())) - } -} - -pub struct RefSource(S); - -impl Source for RefSource -where - for<'a> &'a S: Source + 'a, -{ - fn iter(&self) -> impl Iter { - let r = &(self.0); - r.iter() - } -} -*/ - #[cfg(test)] pub mod test_source { use crate::Entry; @@ -193,44 +118,4 @@ pub mod test { vec![1, 2, 3] ); } - - /*#[test] - fn test_generic_source_iter() { - let ts = test_source(); - let s = BoxedSource::from_source(&ts); - - assert_eq!( - Vec::from_iter(s.iter().map(|e| e.value[0])), - vec![0, 1, 2, 3, 4] - ); - assert_eq!( - Vec::from_iter(s.get(vec![0, 0, 1, 0]).map(|e| e.value[0])), - vec![2] - ); - assert_eq!( - Vec::from_iter(s.get_prefix(vec![0, 0]).map(|e| e.value[0])), - vec![0, 1, 2] - ); - assert_eq!( - Vec::from_iter( - s.get_range(vec![0, 0, 0, 1], vec![0, 1, 0, 0]) - .map(|e| e.value[0]) - ), - vec![1, 2, 3] - ); - } - - #[test] - fn test_dyn_source() { - use crate::merger::Merger; - let ts = test_source(); - let mut v = Vec::>::new(); - v.push(BoxedSource::from_source(&ts)); - v.push(BoxedSource::from_source(&ts)); - let mut refv = Vec::::from_iter((&ts).iter().chain((&ts).iter())); - refv.sort_by(|a, b| a.key.as_ref().cmp(b.key.as_ref())); - let gs = Merger::from(v.iter()); - assert_eq!(Vec::from_iter(gs.iter()), refv); - } - */ } diff --git a/tests/rwtest.rs b/tests/rwtest.rs index 550270d..31e9ea5 100644 --- a/tests/rwtest.rs +++ b/tests/rwtest.rs @@ -19,7 +19,9 @@ fn test_write_readback() { assert_eq!(ri.collect::>(), reference); // test range - let rangei = r.get_range(u32::to_be_bytes(192), u32::to_be_bytes(256)); + let start = u32::to_be_bytes(192); + let end = u32::to_be_bytes(256); + let rangei = r.get_range(&start, &end); assert_eq!( rangei.collect::>(), reference -- 2.50.1