From: Chris Mikkelson Date: Sat, 17 Aug 2024 22:07:12 +0000 (-0500) Subject: More refactoring, natch. X-Git-Url: https://git.mikk.net/?a=commitdiff_plain;h=16d1b5b579724074f1f74de44a96cd2dae9517e7;p=mtbl-rs More refactoring, natch. Replace DefaultSource with generic implementation on IterSource. Ditch "prelude" import -- IterSource no longer required, importing mtbl::Source is sufficient to use Source trait. --- diff --git a/src/bin/mtbl_dump.rs b/src/bin/mtbl_dump.rs index 2e92c10..4b0142b 100644 --- a/src/bin/mtbl_dump.rs +++ b/src/bin/mtbl_dump.rs @@ -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 "); + let fname = std::env::args() + .nth(1) + .expect("Usage: mtbl_dump "); let reader = mtbl::reader::from_file(fname); for e in reader.iter() { println!("{:?}: {:?}", *e.key, *e.value); diff --git a/src/lib.rs b/src/lib.rs index 4e61836..4e70a99 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -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; type Result = std::result::Result; - -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; -} diff --git a/src/merger.rs b/src/merger.rs index 630616d..8a726cb 100644 --- a/src/merger.rs +++ b/src/merger.rs @@ -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 Iter for MergeIter { } } -impl IterSource for Merger { - type It = MergeIter; - fn iter(&self) -> Self::It { - MergeIter::from(self.sources.iter().map(|s| s.iter())) - } -} - impl Source for Merger { + type It = MergeIter; type Get = MergeIter; type Prefix = MergeIter; type Range = MergeIter; + 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 Source for Merger { #[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 { Vec::from_iter((1u8..255).into_iter().filter(|i| i % m == 0)) diff --git a/src/reader/mod.rs b/src/reader/mod.rs index 477aef1..f98310e 100644 --- a/src/reader/mod.rs +++ b/src/reader/mod.rs @@ -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> IterSource for Reader { } } } - -impl> DefaultSource for Reader {} diff --git a/src/source.rs b/src/source.rs index b1bd9b6..4fd83b7 100644 --- a/src/source.rs +++ b/src/source.rs @@ -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 Source for I { + type It = ::It; + type Get = RangeIter; + type Prefix = PrefixIter; + type Range = RangeIter; -impl Source for S { - type Get = RangeIter; - type Prefix = PrefixIter; - type Range = RangeIter; + 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 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); @@ -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![ diff --git a/tests/rwtest.rs b/tests/rwtest.rs index dd8e884..6988191 100644 --- a/tests/rwtest.rs +++ b/tests/rwtest.rs @@ -1,4 +1,4 @@ -use mtbl::prelude::*; +use mtbl::{Entry, Reader, Source, Writer}; #[test] fn test_write_readback() {