diff --git a/src/relation.rs b/src/relation.rs index 16c09de..c1edf4f 100644 --- a/src/relation.rs +++ b/src/relation.rs @@ -38,7 +38,7 @@ impl Relation { /// see [`Variable::from_leapjoin`](crate::Variable::from_leapjoin) pub fn from_leapjoin<'leap, SourceTuple: Ord, Val: Ord + 'leap>( source: &Relation, - leapers: impl Leapers<'leap, SourceTuple, Val>, + leapers: impl Leapers, logic: impl FnMut(&SourceTuple, &Val) -> Tuple, ) -> Self { treefrog::leapjoin(&source.elements, leapers, logic) diff --git a/src/treefrog.rs b/src/treefrog.rs index e473436..7759dfc 100644 --- a/src/treefrog.rs +++ b/src/treefrog.rs @@ -5,7 +5,7 @@ use super::Relation; /// Performs treefrog leapjoin using a list of leapers. pub(crate) fn leapjoin<'leap, Tuple: Ord, Val: Ord + 'leap, Result: Ord>( source: &[Tuple], - mut leapers: impl Leapers<'leap, Tuple, Val>, + mut leapers: impl Leapers, mut logic: impl FnMut(&Tuple, &Val) -> Result, ) -> Relation { let mut result = Vec::new(); // temp output storage. @@ -45,23 +45,23 @@ pub(crate) fn leapjoin<'leap, Tuple: Ord, Val: Ord + 'leap, Result: Ord>( } /// Implemented for a tuple of leapers -pub trait Leapers<'leap, Tuple, Val> { +pub trait Leapers { /// Internal method: fn for_each_count(&mut self, tuple: &Tuple, op: impl FnMut(usize, usize)); /// Internal method: - fn propose(&mut self, tuple: &Tuple, min_index: usize, values: &mut Vec<&'leap Val>); + fn propose(&mut self, tuple: &Tuple, min_index: usize, values: &mut Vec); /// Internal method: - fn intersect(&mut self, tuple: &Tuple, min_index: usize, values: &mut Vec<&'leap Val>); + fn intersect(&mut self, tuple: &Tuple, min_index: usize, values: &mut Vec); } macro_rules! tuple_leapers { ($($Ty:ident)*) => { #[allow(unused_assignments, non_snake_case)] - impl<'leap, Tuple, Val, $($Ty),*> Leapers<'leap, Tuple, Val> for ($($Ty,)*) + impl Leapers for ($($Ty,)*) where - $($Ty: Leaper<'leap, Tuple, Val>,)* + $($Ty: Leaper,)* { fn for_each_count(&mut self, tuple: &Tuple, mut op: impl FnMut(usize, usize)) { let ($($Ty,)*) = self; @@ -73,7 +73,7 @@ macro_rules! tuple_leapers { )* } - fn propose(&mut self, tuple: &Tuple, min_index: usize, values: &mut Vec<&'leap Val>) { + fn propose(&mut self, tuple: &Tuple, min_index: usize, values: &mut Vec) { let ($($Ty,)*) = self; let mut index = 0; $( @@ -85,7 +85,7 @@ macro_rules! tuple_leapers { panic!("no match found for min_index={}", min_index); } - fn intersect(&mut self, tuple: &Tuple, min_index: usize, values: &mut Vec<&'leap Val>) { + fn intersect(&mut self, tuple: &Tuple, min_index: usize, values: &mut Vec) { let ($($Ty,)*) = self; let mut index = 0; $( @@ -107,13 +107,13 @@ tuple_leapers!(A B C D E F); tuple_leapers!(A B C D E F G); /// Methods to support treefrog leapjoin. -pub trait Leaper<'leap, Tuple, Val> { +pub trait Leaper { /// Estimates the number of proposed values. fn count(&mut self, prefix: &Tuple) -> usize; /// Populates `values` with proposed values. - fn propose(&mut self, prefix: &Tuple, values: &mut Vec<&'leap Val>); + fn propose(&mut self, prefix: &Tuple, values: &mut Vec); /// Restricts `values` to proposed values. - fn intersect(&mut self, prefix: &Tuple, values: &mut Vec<&'leap Val>); + fn intersect(&mut self, prefix: &Tuple, values: &mut Vec); } pub(crate) mod filters { @@ -131,7 +131,7 @@ pub(crate) mod filters { predicate: Func, } - impl<'leap, Tuple, Func> PrefixFilter + impl PrefixFilter where Func: Fn(&Tuple) -> bool, { @@ -144,7 +144,7 @@ pub(crate) mod filters { } } - impl<'leap, Tuple, Val, Func> Leaper<'leap, Tuple, Val> for PrefixFilter + impl Leaper for PrefixFilter where Func: Fn(&Tuple) -> bool, { @@ -157,21 +157,21 @@ pub(crate) mod filters { } } /// Populates `values` with proposed values. - fn propose(&mut self, _prefix: &Tuple, _values: &mut Vec<&'leap Val>) { + fn propose(&mut self, _prefix: &Tuple, _values: &mut Vec) { panic!("PrefixFilter::propose(): variable apparently unbound"); } /// Restricts `values` to proposed values. - fn intersect(&mut self, _prefix: &Tuple, _values: &mut Vec<&'leap Val>) { + fn intersect(&mut self, _prefix: &Tuple, _values: &mut Vec) { // We can only be here if we returned max_value() above. } } - impl<'leap, Tuple, Func> Leapers<'leap, Tuple, ()> for PrefixFilter + impl<'leap, Tuple, Func> Leapers for PrefixFilter where Func: Fn(&Tuple) -> bool, { fn for_each_count(&mut self, tuple: &Tuple, mut op: impl FnMut(usize, usize)) { - if >::count(self, tuple) == 0 { + if >::count(self, tuple) == 0 { op(0, 0) } else { // we will "propose" the `()` value if the predicate applies @@ -202,7 +202,7 @@ pub(crate) mod filters { } } - impl<'leap, Tuple> Leaper<'leap, Tuple, ()> for Passthrough { + impl<'leap, Tuple> Leaper for Passthrough { /// Estimates the number of proposed values. fn count(&mut self, _prefix: &Tuple) -> usize { 1 @@ -250,7 +250,7 @@ pub(crate) mod filters { predicate: Func, } - impl<'leap, Tuple, Val, Func> ValueFilter + impl ValueFilter where Func: Fn(&Tuple, &Val) -> bool, { @@ -263,7 +263,7 @@ pub(crate) mod filters { } } - impl<'leap, Tuple, Val, Func> Leaper<'leap, Tuple, Val> for ValueFilter + impl<'leap, Tuple, Val, Func> Leaper for ValueFilter where Func: Fn(&Tuple, &Val) -> bool, { @@ -401,7 +401,7 @@ pub(crate) mod extend_with { } } - impl<'leap, Key, Val, Tuple, Func> Leaper<'leap, Tuple, Val> + impl<'leap, Key, Val, Tuple, Func> Leaper for ExtendWith<'leap, Key, Val, Tuple, Func> where Key: Ord + 'leap, @@ -435,7 +435,7 @@ pub(crate) mod extend_with { } } - impl<'leap, Key, Val, Tuple, Func> Leapers<'leap, Tuple, Val> + impl<'leap, Key, Val, Tuple, Func> Leapers for ExtendWith<'leap, Key, Val, Tuple, Func> where Key: Ord + 'leap, @@ -496,7 +496,7 @@ pub(crate) mod extend_anti { } } - impl<'leap, Key: Ord, Val: Ord + 'leap, Tuple: Ord, Func> Leaper<'leap, Tuple, Val> + impl<'leap, Key: Ord, Val: Ord + 'leap, Tuple: Ord, Func> Leaper for ExtendAnti<'leap, Key, Val, Tuple, Func> where Key: Ord + 'leap, @@ -575,7 +575,7 @@ pub(crate) mod filter_with { } } - impl<'leap, Key, Val, Val2, Tuple, Func> Leaper<'leap, Tuple, Val2> + impl<'leap, Key, Val, Val2, Tuple, Func> Leaper for FilterWith<'leap, Key, Val, Tuple, Func> where Key: Ord + 'leap, @@ -604,7 +604,7 @@ pub(crate) mod filter_with { } } - impl<'leap, Key, Val, Tuple, Func> Leapers<'leap, Tuple, ()> + impl<'leap, Key, Val, Tuple, Func> Leapers for FilterWith<'leap, Key, Val, Tuple, Func> where Key: Ord + 'leap, @@ -613,7 +613,7 @@ pub(crate) mod filter_with { Func: Fn(&Tuple) -> (Key, Val), { fn for_each_count(&mut self, tuple: &Tuple, mut op: impl FnMut(usize, usize)) { - if >::count(self, tuple) == 0 { + if >::count(self, tuple) == 0 { op(0, 0) } else { op(0, 1) @@ -668,7 +668,7 @@ pub(crate) mod filter_anti { } } - impl<'leap, Key: Ord, Val: Ord + 'leap, Val2, Tuple: Ord, Func> Leaper<'leap, Tuple, Val2> + impl<'leap, Key: Ord, Val: Ord + 'leap, Val2, Tuple: Ord, Func> Leaper for FilterAnti<'leap, Key, Val, Tuple, Func> where Key: Ord + 'leap, @@ -697,7 +697,7 @@ pub(crate) mod filter_anti { } } - impl<'leap, Key, Val, Tuple, Func> Leapers<'leap, Tuple, ()> + impl<'leap, Key, Val, Tuple, Func> Leapers for FilterAnti<'leap, Key, Val, Tuple, Func> where Key: Ord + 'leap, @@ -706,7 +706,7 @@ pub(crate) mod filter_anti { Func: Fn(&Tuple) -> (Key, Val), { fn for_each_count(&mut self, tuple: &Tuple, mut op: impl FnMut(usize, usize)) { - if >::count(self, tuple) == 0 { + if >::count(self, tuple) == 0 { op(0, 0) } else { op(0, 1) diff --git a/src/variable.rs b/src/variable.rs index 537822c..d5dfa0f 100644 --- a/src/variable.rs +++ b/src/variable.rs @@ -264,7 +264,7 @@ impl Variable { pub fn from_leapjoin<'leap, SourceTuple: Ord, Val: Ord + 'leap>( &self, source: &Variable, - leapers: impl Leapers<'leap, SourceTuple, Val>, + leapers: impl Leapers, logic: impl FnMut(&SourceTuple, &Val) -> Tuple, ) { self.insert(treefrog::leapjoin(&source.recent.borrow(), leapers, logic));