use crate::dupsort_func::DupsortFunc;
-use crate::iter::{BoxedIter, PrefixIter, RangeIter};
+use crate::iter::{PrefixIter, RangeIter};
use crate::merge_func::MergeFunc;
use crate::{Entry, Iter};
-use std::marker::PhantomData;
pub trait Source {
- type It: Iter;
- 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;
+ 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_prefix(&self, prefix: impl AsRef<[u8]>) -> impl Iter {
+ PrefixIter::new(self.iter(), prefix)
+ }
+ fn get_range(&self, start: impl AsRef<[u8]>, end: impl AsRef<[u8]>) -> impl Iter {
+ RangeIter::new(self.iter(), start, end)
+ }
fn merge_func<F>(self, merge_func: F) -> MergeFunc<Self, F>
where
}
}
-pub trait IterSource {
- type It: Iter;
- fn iter(&self) -> Self::It;
+/*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<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>;
-
- fn iter(&self) -> Self::It {
- (self as &I).iter()
+impl<'a> Source for &'a Box<dyn SourceObj<'a> + 'a> {
+ fn iter(&self) -> impl Iter {
+ (*self).as_ref().iter()
}
-
- fn get(&self, key: &[u8]) -> Self::Get {
- RangeIter::new(self.iter(), key, key)
+ fn get(&self, key: impl AsRef<[u8]>) -> impl Iter {
+ (*self).as_ref().get(Vec::from(key.as_ref()))
}
-
- fn get_prefix(&self, prefix: &[u8]) -> Self::Prefix {
- PrefixIter::new(self.iter(), prefix)
+ 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: &[u8], end: &[u8]) -> Self::Range {
- RangeIter::new(self.iter(), start, end)
+ 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> Source for BoxWrap<'a, S> {
- type It = BoxedIter<'a>;
- fn iter(&self) -> Self::It {
+impl<'a, S: Source + 'a> SourceObj<'a> for BoxWrap<'a, S> {
+ fn iter(&'a self) -> BoxedIter<'a> {
Box::new(self.0.iter())
}
- type Get = BoxedIter<'a>;
- fn get(&self, key: &[u8]) -> Self::Get {
+ fn get(&'a self, key: Vec<u8>) -> BoxedIter<'a> {
Box::new(self.0.get(key))
}
- type Prefix = BoxedIter<'a>;
- fn get_prefix(&self, prefix: &[u8]) -> Self::Get {
+ fn get_prefix(&'a self, prefix: Vec<u8>) -> BoxedIter<'a> {
Box::new(self.0.get_prefix(prefix))
}
- type Range = BoxedIter<'a>;
- fn get_range(&self, start: &[u8], end: &[u8]) -> Self::Get {
+ 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 Source<
- It = BoxedIter<'a>,
- Get = BoxedIter<'a>,
- Prefix = BoxedIter<'a>,
- Range = BoxedIter<'a>,
- > + 'a,
- >,
-);
-
-#[allow(dead_code)]
+pub struct BoxedSource<'a>(Box<dyn SourceObj<'a> + 'a>);
+
impl<'a> BoxedSource<'a> {
- fn from<S: Source + 'a>(source: S) -> Self {
- Self(Box::new(BoxWrap(source, PhantomData)))
+ fn from<S: Source + 'a>(s: S) -> Self {
+ Self(Box::new(BoxWrap(s, PhantomData)))
}
}
-impl<'a> Source for BoxedSource<'a> {
- type It = BoxedIter<'a>;
- fn iter(&self) -> Self::It {
- self.0.as_ref().iter()
- }
- type Get = BoxedIter<'a>;
- fn get(&self, key: &[u8]) -> Self::Get {
- self.0.get(key)
+
+impl<'a> Source for &'a BoxedSource<'a>
+where
+ Self: 'a,
+{
+ fn iter(&self) -> impl Iter {
+ (*self).0.as_ref().iter()
}
- type Prefix = BoxedIter<'a>;
- fn get_prefix(&self, prefix: &[u8]) -> Self::Prefix {
- self.0.get_prefix(prefix)
+
+ fn get(&self, key: impl AsRef<[u8]>) -> impl Iter {
+ (*self).0.as_ref().get(Vec::from(key.as_ref()))
}
- type Range = BoxedIter<'a>;
- fn get_range(&self, start: &[u8], end: &[u8]) -> Self::Prefix {
- self.0.get_range(start, end)
+}
+
+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 super::IterSource;
use crate::Entry;
use crate::Iter;
+ use crate::Source;
pub struct TestSource(pub Vec<Entry>);
}
}
- impl<'a> IterSource for &'a TestSource {
- type It = TestIter<'a>;
-
- fn iter(&self) -> TestIter<'a> {
+ impl<'a> Source for &'a TestSource {
+ fn iter(&self) -> impl Iter {
TestIter {
source: self,
off: 0,
#[cfg(test)]
pub mod test {
use super::test_source::TestSource;
- use super::{BoxedSource, Source};
+ use super::Source;
use crate::Entry;
fn test_source() -> TestSource {
);
}
- #[test]
+ /*#[test]
fn test_generic_source_iter() {
let ts = test_source();
- let s = BoxedSource::from(&ts);
+ 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].as_slice()).map(|e| e.value[0])),
+ 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].as_slice()).map(|e| e.value[0])),
+ 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].as_slice(), vec![0, 1, 0, 0].as_slice())
+ s.get_range(vec![0, 0, 0, 1], vec![0, 1, 0, 0])
.map(|e| e.value[0])
),
vec![1, 2, 3]
fn test_dyn_source() {
use crate::merger::Merger;
let ts = test_source();
- let mut v = Vec::<BoxedSource>::new();
- v.push(BoxedSource::from(&ts));
- v.push(BoxedSource::from(&ts));
+ 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);
+ let gs = Merger::from(v.iter());
assert_eq!(Vec::from_iter(gs.iter()), refv);
}
+ */
}