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),
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)))
}
}
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)
}
}
}
-/*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;
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);
- }
- */
}