]> git.mikk.net Git - mtbl-rs/commitdiff
Refactor Source without object safety
authorChris Mikkelson <cmikk@fsi.io>
Fri, 6 Sep 2024 05:41:24 +0000 (00:41 -0500)
committerChris Mikkelson <cmikk@fsi.io>
Fri, 6 Sep 2024 05:41:24 +0000 (00:41 -0500)
src/dupsort_func.rs
src/merge_func.rs
src/merger.rs
src/source.rs
tests/rwtest.rs

index 255053b8af73c44b041207e131b551106cfe0bec..9d155510f6719920dc39e3c8e96a1dc7ba0b7dc3 100644 (file)
@@ -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,
index 7738df3e434e31acae1a7e70df58f8c5d84e7167..9aff2b6e0ad423c4665c22f9b9754672889991fa 100644 (file)
@@ -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),
index 449cff5f3557794b17ea0f6af4c1df4f0a48b99d..a4f31a0249a21ab8955fe9ac5324ae6374bd1830 100644 (file)
@@ -140,24 +140,16 @@ impl<S: Source> Source for Merger<S> {
         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)))
     }
 }
 
index 6aaee8b1f9f85a9944f707aee902ec1c5055df44..3b464ac75913a20709206b983003a9e36de97212 100644 (file)
@@ -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<u8>) -> BoxedIter<'a>;
-    fn get_prefix(&'a self, prefix: Vec<u8>) -> BoxedIter<'a>;
-    fn get_range(&'a self, start: Vec<u8>, end: Vec<u8>) -> BoxedIter<'a>;
-}
-
-impl<'a> Source for &'a Box<dyn SourceObj<'a> + '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<u8>) -> BoxedIter<'a> {
-        Box::new(self.0.get(key))
-    }
-    fn get_prefix(&'a self, prefix: Vec<u8>) -> BoxedIter<'a> {
-        Box::new(self.0.get_prefix(prefix))
-    }
-    fn get_range(&'a self, start: Vec<u8>, end: Vec<u8>) -> BoxedIter<'a> {
-        Box::new(self.0.get_range(start, end))
-    }
-}
-
-pub struct BoxedSource<'a>(Box<dyn SourceObj<'a> + 'a>);
-
-impl<'a> BoxedSource<'a> {
-    fn from<S: Source + 'a>(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>(S);
-
-impl<S> Source for RefSource<S>
-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::<Box<dyn SourceObj + '_>>::new();
-        v.push(BoxedSource::from_source(&ts));
-        v.push(BoxedSource::from_source(&ts));
-        let mut refv = Vec::<Entry>::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);
-    }
-    */
 }
index 550270d11cd634a86dc7d263b49f763aa69def26..31e9ea5441fca1515fe4118d13139a81047daaae 100644 (file)
@@ -19,7 +19,9 @@ fn test_write_readback() {
     assert_eq!(ri.collect::<Vec<_>>(), 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::<Vec<_>>(),
         reference