]> git.mikk.net Git - mtbl-rs/commitdiff
More refactoring, natch.
authorChris Mikkelson <cmikk@fsi.io>
Sat, 17 Aug 2024 22:07:12 +0000 (17:07 -0500)
committerChris Mikkelson <cmikk@fsi.io>
Sat, 17 Aug 2024 22:07:12 +0000 (17:07 -0500)
Replace DefaultSource with generic implementation on IterSource.

Ditch "prelude" import -- IterSource no longer required, importing
mtbl::Source is sufficient to use Source trait.

src/bin/mtbl_dump.rs
src/lib.rs
src/merger.rs
src/reader/mod.rs
src/source.rs
tests/rwtest.rs

index 2e92c10c6ca21eac9e9244313c5f1fd0525682c6..4b0142b217ab1d6678c9578c7ff2eac32a67e666 100644 (file)
@@ -1,8 +1,9 @@
-use mtbl::prelude::*;
-use std::env;
+use mtbl::Source; // needed for reader.iter()
 
 fn main() {
-    let fname = env::args().nth(1).expect("Usage: mtbl_dump <filename>");
+    let fname = std::env::args()
+        .nth(1)
+        .expect("Usage: mtbl_dump <filename>");
     let reader = mtbl::reader::from_file(fname);
     for e in reader.iter() {
         println!("{:?}: {:?}", *e.key, *e.value);
index 4e6183612871f8ac75f9649df132155fb8001da3..4e70a990f3058319429749df9d8aed663944bc45 100644 (file)
@@ -1,30 +1,21 @@
-pub mod entry;
-pub use entry::Entry;
-
+mod compression;
+mod entry;
+mod iter;
+mod merger;
+pub mod reader;
 pub mod source;
-pub use source::IterSource;
-pub use source::Source;
+mod writer;
 
-pub mod iter;
+pub use compression::Compression;
+pub use entry::Entry;
 use iter::Iter;
-
-pub mod merger;
-
-pub mod compression;
-pub mod reader;
-pub mod writer;
+pub use merger::Merger;
+pub use reader::Reader;
+pub use source::Source;
+pub use writer::Writer;
 
 mod fileset;
 mod metadata;
 
 type Error = Box<dyn std::error::Error>;
 type Result<T> = std::result::Result<T, Error>;
-
-pub mod prelude {
-    pub use super::entry::Entry;
-    pub use super::iter::Iter;
-    pub use super::reader::Reader;
-    pub use super::source::IterSource;
-    pub use super::source::Source;
-    pub use super::writer::Writer;
-}
index 630616d1dc16e065df0ebce219a509dd95eaee63..8a726cbed364370dfd8efecc6feefeec5f4bfc30 100644 (file)
@@ -1,4 +1,4 @@
-use crate::{source::IterSource, Entry, Iter, Source};
+use crate::{Entry, Iter, Source};
 use std::cmp::Ordering;
 use std::collections::BinaryHeap;
 
@@ -135,18 +135,16 @@ impl<I: Iter> Iter for MergeIter<I> {
     }
 }
 
-impl<S: Source> IterSource for Merger<S> {
-    type It = MergeIter<S::It>;
-    fn iter(&self) -> Self::It {
-        MergeIter::from(self.sources.iter().map(|s| s.iter()))
-    }
-}
-
 impl<S: Source> Source for Merger<S> {
+    type It = MergeIter<S::It>;
     type Get = MergeIter<S::Get>;
     type Prefix = MergeIter<S::Prefix>;
     type Range = MergeIter<S::Range>;
 
+    fn iter(&self) -> Self::It {
+        MergeIter::from(self.sources.iter().map(|s| s.iter()))
+    }
+
     fn get(&self, key: &[u8]) -> Self::Get {
         MergeIter::from(self.sources.iter().map(|s| s.get(key)))
     }
@@ -163,9 +161,9 @@ impl<S: Source> Source for Merger<S> {
 #[cfg(test)]
 mod test {
     use super::Merger;
-    use crate::source::test::TestSource;
-    use crate::source::IterSource;
+    use crate::source::test_source::TestSource;
     use crate::Entry;
+    use crate::Source;
 
     fn tnum(m: u8) -> Vec<u8> {
         Vec::from_iter((1u8..255).into_iter().filter(|i| i % m == 0))
index 477aef15dc99b33d5d82e24448032596e9c200f6..f98310eb284d91e8667a138ca7f9a6247f3fae26 100644 (file)
@@ -1,5 +1,5 @@
 use crate::metadata::Metadata;
-use crate::source::{DefaultSource, IterSource};
+use crate::source::IterSource;
 use crate::{Entry, Iter};
 use integer_encoding::VarInt;
 pub(crate) mod block;
@@ -184,5 +184,3 @@ impl<D: AsRef<[u8]>> IterSource for Reader<D> {
         }
     }
 }
-
-impl<D: AsRef<[u8]>> DefaultSource for Reader<D> {}
index b1bd9b674f424c446acfae82b8597a524789f858..4fd83b7db64a5bea6fefe21b35ca53e097bda342 100644 (file)
@@ -2,26 +2,32 @@ use crate::iter::{BoxedIter, PrefixIter, RangeIter};
 use crate::Iter;
 use std::marker::PhantomData;
 
-pub trait IterSource {
+pub trait Source {
     type It: Iter;
-    fn iter(&self) -> Self::It;
-}
-pub trait Source: IterSource {
     type Get: Iter;
     type Prefix: Iter;
     type Range: Iter;
 
+    fn iter(&self) -> Self::It;
     fn get(&self, key: &[u8]) -> Self::Get;
     fn get_prefix(&self, prefix: &[u8]) -> Self::Prefix;
     fn get_range(&self, start: &[u8], end: &[u8]) -> Self::Range;
 }
 
-pub trait DefaultSource: IterSource {}
+pub trait IterSource {
+    type It: Iter;
+    fn iter(&self) -> Self::It;
+}
+
+impl<I: IterSource> Source for I {
+    type It = <I as IterSource>::It;
+    type Get = RangeIter<Self::It>;
+    type Prefix = PrefixIter<Self::It>;
+    type Range = RangeIter<Self::It>;
 
-impl<S: DefaultSource> Source for S {
-    type Get = RangeIter<S::It>;
-    type Prefix = PrefixIter<S::It>;
-    type Range = RangeIter<S::It>;
+    fn iter(&self) -> Self::It {
+        (self as &I).iter()
+    }
 
     fn get(&self, key: &[u8]) -> Self::Get {
         RangeIter::new(self.iter(), key, key)
@@ -37,13 +43,11 @@ impl<S: DefaultSource> Source for S {
 }
 
 struct BoxWrap<'a, S: Source + 'a>(S, PhantomData<&'a S>);
-impl<'a, S: Source + 'a> IterSource for BoxWrap<'a, S> {
+impl<'a, S: Source + 'a> Source for BoxWrap<'a, S> {
     type It = BoxedIter<'a>;
     fn iter(&self) -> Self::It {
         Box::new(self.0.iter())
     }
-}
-impl<'a, S: Source + 'a> Source for BoxWrap<'a, S> {
     type Get = BoxedIter<'a>;
     fn get(&self, key: &[u8]) -> Self::Get {
         Box::new(self.0.get(key))
@@ -75,13 +79,11 @@ impl<'a> BoxedSource<'a> {
         Self(Box::new(BoxWrap(source, PhantomData)))
     }
 }
-impl<'a> IterSource for BoxedSource<'a> {
+impl<'a> Source for BoxedSource<'a> {
     type It = BoxedIter<'a>;
     fn iter(&self) -> Self::It {
         self.0.as_ref().iter()
     }
-}
-impl<'a> Source for BoxedSource<'a> {
     type Get = BoxedIter<'a>;
     fn get(&self, key: &[u8]) -> Self::Get {
         self.0.get(key)
@@ -97,11 +99,10 @@ impl<'a> Source for BoxedSource<'a> {
 }
 
 #[cfg(test)]
-pub mod test {
-    use super::{BoxedSource, DefaultSource, IterSource};
+pub mod test_source {
+    use super::IterSource;
     use crate::Entry;
     use crate::Iter;
-    use crate::Source;
 
     pub struct TestSource(pub Vec<Entry>);
 
@@ -143,7 +144,13 @@ pub mod test {
             }
         }
     }
-    impl<'a> DefaultSource for &'a TestSource {}
+}
+
+#[cfg(test)]
+pub mod test {
+    use super::test_source::TestSource;
+    use super::{BoxedSource, Source};
+    use crate::Entry;
 
     fn test_source() -> TestSource {
         TestSource(vec![
index dd8e884b6a8dd85abdf9c9ba6817c2019dda0f0c..6988191aa9e9b513f95b2989ea331f2a7fa25ef4 100644 (file)
@@ -1,4 +1,4 @@
-use mtbl::prelude::*;
+use mtbl::{Entry, Reader, Source, Writer};
 
 #[test]
 fn test_write_readback() {