-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;
-}
-use crate::{source::IterSource, Entry, Iter, Source};
+use crate::{Entry, Iter, Source};
use std::cmp::Ordering;
use std::collections::BinaryHeap;
}
}
-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)))
}
#[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))
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)
}
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))
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)
}
#[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>);
}
}
}
- 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![