Skip to content

Commit ccaca5b

Browse files
leap by-value
1 parent 1d2a08a commit ccaca5b

File tree

3 files changed

+60
-60
lines changed

3 files changed

+60
-60
lines changed

src/relation.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@ impl<Tuple: Ord> Relation<Tuple> {
3636

3737
/// Creates a `Relation` using the `leapjoin` logic;
3838
/// see [`Variable::from_leapjoin`]
39-
pub fn from_leapjoin<'leap, SourceTuple: Ord, Val: Ord + 'leap>(
39+
pub fn from_leapjoin<SourceTuple: Ord, Val: Ord>(
4040
source: &Relation<SourceTuple>,
41-
leapers: impl Leapers<'leap, SourceTuple, Val>,
41+
leapers: impl Leapers<SourceTuple, Val>,
4242
logic: impl FnMut(&SourceTuple, &Val) -> Tuple,
4343
) -> Self {
4444
treefrog::leapjoin(&source.elements, leapers, logic)

src/treefrog.rs

Lines changed: 56 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
use super::Relation;
44

55
/// Performs treefrog leapjoin using a list of leapers.
6-
pub(crate) fn leapjoin<'leap, Tuple: Ord, Val: Ord + 'leap, Result: Ord>(
6+
pub(crate) fn leapjoin<Tuple: Ord, Val: Ord, Result: Ord>(
77
source: &[Tuple],
8-
mut leapers: impl Leapers<'leap, Tuple, Val>,
8+
mut leapers: impl Leapers<Tuple, Val>,
99
mut logic: impl FnMut(&Tuple, &Val) -> Result,
1010
) -> Relation<Result> {
1111
let mut result = Vec::new(); // temp output storage.
@@ -36,7 +36,7 @@ pub(crate) fn leapjoin<'leap, Tuple: Ord, Val: Ord + 'leap, Result: Ord>(
3636

3737
// Push remaining items into result.
3838
for val in values.drain(..) {
39-
result.push(logic(tuple, val));
39+
result.push(logic(tuple, &val));
4040
}
4141
}
4242
}
@@ -45,23 +45,23 @@ pub(crate) fn leapjoin<'leap, Tuple: Ord, Val: Ord + 'leap, Result: Ord>(
4545
}
4646

4747
/// Implemented for a tuple of leapers
48-
pub trait Leapers<'leap, Tuple, Val> {
48+
pub trait Leapers<Tuple, Val> {
4949
/// Internal method:
5050
fn for_each_count(&mut self, tuple: &Tuple, op: impl FnMut(usize, usize));
5151

5252
/// Internal method:
53-
fn propose(&mut self, tuple: &Tuple, min_index: usize, values: &mut Vec<&'leap Val>);
53+
fn propose(&mut self, tuple: &Tuple, min_index: usize, values: &mut Vec<Val>);
5454

5555
/// Internal method:
56-
fn intersect(&mut self, tuple: &Tuple, min_index: usize, values: &mut Vec<&'leap Val>);
56+
fn intersect(&mut self, tuple: &Tuple, min_index: usize, values: &mut Vec<Val>);
5757
}
5858

5959
macro_rules! tuple_leapers {
6060
($($Ty:ident)*) => {
6161
#[allow(unused_assignments, non_snake_case)]
62-
impl<'leap, Tuple, Val, $($Ty),*> Leapers<'leap, Tuple, Val> for ($($Ty,)*)
62+
impl<Tuple, Val, $($Ty),*> Leapers<Tuple, Val> for ($($Ty,)*)
6363
where
64-
$($Ty: Leaper<'leap, Tuple, Val>,)*
64+
$($Ty: Leaper<Tuple, Val>,)*
6565
{
6666
fn for_each_count(&mut self, tuple: &Tuple, mut op: impl FnMut(usize, usize)) {
6767
let ($($Ty,)*) = self;
@@ -73,7 +73,7 @@ macro_rules! tuple_leapers {
7373
)*
7474
}
7575

76-
fn propose(&mut self, tuple: &Tuple, min_index: usize, values: &mut Vec<&'leap Val>) {
76+
fn propose(&mut self, tuple: &Tuple, min_index: usize, values: &mut Vec<Val>) {
7777
let ($($Ty,)*) = self;
7878
let mut index = 0;
7979
$(
@@ -85,7 +85,7 @@ macro_rules! tuple_leapers {
8585
panic!("no match found for min_index={}", min_index);
8686
}
8787

88-
fn intersect(&mut self, tuple: &Tuple, min_index: usize, values: &mut Vec<&'leap Val>) {
88+
fn intersect(&mut self, tuple: &Tuple, min_index: usize, values: &mut Vec<Val>) {
8989
let ($($Ty,)*) = self;
9090
let mut index = 0;
9191
$(
@@ -107,13 +107,13 @@ tuple_leapers!(A B C D E F);
107107
tuple_leapers!(A B C D E F G);
108108

109109
/// Methods to support treefrog leapjoin.
110-
pub trait Leaper<'leap, Tuple, Val> {
110+
pub trait Leaper<Tuple, Val> {
111111
/// Estimates the number of proposed values.
112112
fn count(&mut self, prefix: &Tuple) -> usize;
113113
/// Populates `values` with proposed values.
114-
fn propose(&mut self, prefix: &Tuple, values: &mut Vec<&'leap Val>);
114+
fn propose(&mut self, prefix: &Tuple, values: &mut Vec<Val>);
115115
/// Restricts `values` to proposed values.
116-
fn intersect(&mut self, prefix: &Tuple, values: &mut Vec<&'leap Val>);
116+
fn intersect(&mut self, prefix: &Tuple, values: &mut Vec<Val>);
117117
}
118118

119119
pub(crate) mod filters {
@@ -131,7 +131,7 @@ pub(crate) mod filters {
131131
predicate: Func,
132132
}
133133

134-
impl<'leap, Tuple, Func> PrefixFilter<Tuple, Func>
134+
impl<Tuple, Func> PrefixFilter<Tuple, Func>
135135
where
136136
Func: Fn(&Tuple) -> bool,
137137
{
@@ -144,7 +144,7 @@ pub(crate) mod filters {
144144
}
145145
}
146146

147-
impl<'leap, Tuple, Val, Func> Leaper<'leap, Tuple, Val> for PrefixFilter<Tuple, Func>
147+
impl<Tuple, Val, Func> Leaper<Tuple, Val> for PrefixFilter<Tuple, Func>
148148
where
149149
Func: Fn(&Tuple) -> bool,
150150
{
@@ -157,34 +157,34 @@ pub(crate) mod filters {
157157
}
158158
}
159159
/// Populates `values` with proposed values.
160-
fn propose(&mut self, _prefix: &Tuple, _values: &mut Vec<&'leap Val>) {
160+
fn propose(&mut self, _prefix: &Tuple, _values: &mut Vec<Val>) {
161161
panic!("PrefixFilter::propose(): variable apparently unbound");
162162
}
163163
/// Restricts `values` to proposed values.
164-
fn intersect(&mut self, _prefix: &Tuple, _values: &mut Vec<&'leap Val>) {
164+
fn intersect(&mut self, _prefix: &Tuple, _values: &mut Vec<Val>) {
165165
// We can only be here if we returned max_value() above.
166166
}
167167
}
168168

169-
impl<'leap, Tuple, Func> Leapers<'leap, Tuple, ()> for PrefixFilter<Tuple, Func>
169+
impl<Tuple, Func> Leapers<Tuple, ()> for PrefixFilter<Tuple, Func>
170170
where
171171
Func: Fn(&Tuple) -> bool,
172172
{
173173
fn for_each_count(&mut self, tuple: &Tuple, mut op: impl FnMut(usize, usize)) {
174-
if <Self as Leaper<'_, Tuple, ()>>::count(self, tuple) == 0 {
174+
if <Self as Leaper<Tuple, ()>>::count(self, tuple) == 0 {
175175
op(0, 0)
176176
} else {
177177
// we will "propose" the `()` value if the predicate applies
178178
op(0, 1)
179179
}
180180
}
181181

182-
fn propose(&mut self, _: &Tuple, min_index: usize, values: &mut Vec<&'leap ()>) {
182+
fn propose(&mut self, _: &Tuple, min_index: usize, values: &mut Vec<()>) {
183183
assert_eq!(min_index, 0);
184-
values.push(&());
184+
values.push(());
185185
}
186186

187-
fn intersect(&mut self, _: &Tuple, min_index: usize, values: &mut Vec<&'leap ()>) {
187+
fn intersect(&mut self, _: &Tuple, min_index: usize, values: &mut Vec<()>) {
188188
assert_eq!(min_index, 0);
189189
assert_eq!(values.len(), 1);
190190
}
@@ -202,17 +202,17 @@ pub(crate) mod filters {
202202
}
203203
}
204204

205-
impl<'leap, Tuple> Leaper<'leap, Tuple, ()> for Passthrough<Tuple> {
205+
impl<Tuple> Leaper<Tuple, ()> for Passthrough<Tuple> {
206206
/// Estimates the number of proposed values.
207207
fn count(&mut self, _prefix: &Tuple) -> usize {
208208
1
209209
}
210210
/// Populates `values` with proposed values.
211-
fn propose(&mut self, _prefix: &Tuple, values: &mut Vec<&'leap ()>) {
212-
values.push(&())
211+
fn propose(&mut self, _prefix: &Tuple, values: &mut Vec<()>) {
212+
values.push(())
213213
}
214214
/// Restricts `values` to proposed values.
215-
fn intersect(&mut self, _prefix: &Tuple, _values: &mut Vec<&'leap ()>) {
215+
fn intersect(&mut self, _prefix: &Tuple, _values: &mut Vec<()>) {
216216
// `Passthrough` never removes values (although if we're here it indicates that the user
217217
// didn't need a `Passthrough` in the first place)
218218
}
@@ -250,7 +250,7 @@ pub(crate) mod filters {
250250
predicate: Func,
251251
}
252252

253-
impl<'leap, Tuple, Val, Func> ValueFilter<Tuple, Val, Func>
253+
impl<Tuple, Val, Func> ValueFilter<Tuple, Val, Func>
254254
where
255255
Func: Fn(&Tuple, &Val) -> bool,
256256
{
@@ -263,7 +263,7 @@ pub(crate) mod filters {
263263
}
264264
}
265265

266-
impl<'leap, Tuple, Val, Func> Leaper<'leap, Tuple, Val> for ValueFilter<Tuple, Val, Func>
266+
impl<Tuple, Val, Func> Leaper<Tuple, Val> for ValueFilter<Tuple, Val, Func>
267267
where
268268
Func: Fn(&Tuple, &Val) -> bool,
269269
{
@@ -272,11 +272,11 @@ pub(crate) mod filters {
272272
usize::max_value()
273273
}
274274
/// Populates `values` with proposed values.
275-
fn propose(&mut self, _prefix: &Tuple, _values: &mut Vec<&'leap Val>) {
275+
fn propose(&mut self, _prefix: &Tuple, _values: &mut Vec<Val>) {
276276
panic!("PrefixFilter::propose(): variable apparently unbound");
277277
}
278278
/// Restricts `values` to proposed values.
279-
fn intersect(&mut self, prefix: &Tuple, values: &mut Vec<&'leap Val>) {
279+
fn intersect(&mut self, prefix: &Tuple, values: &mut Vec<Val>) {
280280
values.retain(|val| (self.predicate)(prefix, val));
281281
}
282282
}
@@ -372,11 +372,11 @@ pub(crate) mod extend_with {
372372
}
373373
}
374374

375-
impl<'leap, Key, Val, Tuple, Func> Leaper<'leap, Tuple, Val>
375+
impl<'leap, Key, Val, Tuple, Func> Leaper<Tuple, Val>
376376
for ExtendWith<'leap, Key, Val, Tuple, Func>
377377
where
378378
Key: Ord + 'leap,
379-
Val: Ord + 'leap,
379+
Val: Clone + Ord + 'leap,
380380
Tuple: Ord,
381381
Func: Fn(&Tuple) -> Key,
382382
{
@@ -393,11 +393,11 @@ pub(crate) mod extend_with {
393393

394394
self.end - self.start
395395
}
396-
fn propose(&mut self, _prefix: &Tuple, values: &mut Vec<&'leap Val>) {
396+
fn propose(&mut self, _prefix: &Tuple, values: &mut Vec<Val>) {
397397
let slice = &self.relation[self.start..self.end];
398-
values.extend(slice.iter().map(|&(_, ref val)| val));
398+
values.extend(slice.iter().map(|&(_, ref val)| val.clone()));
399399
}
400-
fn intersect(&mut self, _prefix: &Tuple, values: &mut Vec<&'leap Val>) {
400+
fn intersect(&mut self, _prefix: &Tuple, values: &mut Vec<Val>) {
401401
let mut slice = &self.relation[self.start..self.end];
402402
values.retain(|v| {
403403
slice = gallop(slice, |kv| &kv.1 < v);
@@ -406,24 +406,24 @@ pub(crate) mod extend_with {
406406
}
407407
}
408408

409-
impl<'leap, Key, Val, Tuple, Func> Leapers<'leap, Tuple, Val>
409+
impl<'leap, Key, Val, Tuple, Func> Leapers<Tuple, Val>
410410
for ExtendWith<'leap, Key, Val, Tuple, Func>
411411
where
412412
Key: Ord + 'leap,
413-
Val: Ord + 'leap,
413+
Val: Clone + Ord + 'leap,
414414
Tuple: Ord,
415415
Func: Fn(&Tuple) -> Key,
416416
{
417417
fn for_each_count(&mut self, tuple: &Tuple, mut op: impl FnMut(usize, usize)) {
418418
op(0, self.count(tuple))
419419
}
420420

421-
fn propose(&mut self, tuple: &Tuple, min_index: usize, values: &mut Vec<&'leap Val>) {
421+
fn propose(&mut self, tuple: &Tuple, min_index: usize, values: &mut Vec<Val>) {
422422
assert_eq!(min_index, 0);
423423
Leaper::propose(self, tuple, values);
424424
}
425425

426-
fn intersect(&mut self, _: &Tuple, min_index: usize, _: &mut Vec<&'leap Val>) {
426+
fn intersect(&mut self, _: &Tuple, min_index: usize, _: &mut Vec<Val>) {
427427
assert_eq!(min_index, 0);
428428
}
429429
}
@@ -467,7 +467,7 @@ pub(crate) mod extend_anti {
467467
}
468468
}
469469

470-
impl<'leap, Key: Ord, Val: Ord + 'leap, Tuple: Ord, Func> Leaper<'leap, Tuple, Val>
470+
impl<'leap, Key: Ord, Val: Ord + 'leap, Tuple: Ord, Func> Leaper<Tuple, Val>
471471
for ExtendAnti<'leap, Key, Val, Tuple, Func>
472472
where
473473
Key: Ord + 'leap,
@@ -478,10 +478,10 @@ pub(crate) mod extend_anti {
478478
fn count(&mut self, _prefix: &Tuple) -> usize {
479479
usize::max_value()
480480
}
481-
fn propose(&mut self, _prefix: &Tuple, _values: &mut Vec<&'leap Val>) {
481+
fn propose(&mut self, _prefix: &Tuple, _values: &mut Vec<Val>) {
482482
panic!("ExtendAnti::propose(): variable apparently unbound.");
483483
}
484-
fn intersect(&mut self, prefix: &Tuple, values: &mut Vec<&'leap Val>) {
484+
fn intersect(&mut self, prefix: &Tuple, values: &mut Vec<Val>) {
485485
let key = (self.key_func)(prefix);
486486

487487
let range = match self.old_key.as_ref() {
@@ -546,7 +546,7 @@ pub(crate) mod filter_with {
546546
}
547547
}
548548

549-
impl<'leap, Key, Val, Val2, Tuple, Func> Leaper<'leap, Tuple, Val2>
549+
impl<'leap, Key, Val, Val2, Tuple, Func> Leaper<Tuple, Val2>
550550
for FilterWith<'leap, Key, Val, Tuple, Func>
551551
where
552552
Key: Ord + 'leap,
@@ -567,15 +567,15 @@ pub(crate) mod filter_with {
567567
self.old_key_val = Some((key_val, is_present));
568568
if is_present { usize::MAX } else { 0 }
569569
}
570-
fn propose(&mut self, _prefix: &Tuple, _values: &mut Vec<&'leap Val2>) {
570+
fn propose(&mut self, _prefix: &Tuple, _values: &mut Vec<Val2>) {
571571
panic!("FilterWith::propose(): variable apparently unbound.");
572572
}
573-
fn intersect(&mut self, _prefix: &Tuple, _values: &mut Vec<&'leap Val2>) {
573+
fn intersect(&mut self, _prefix: &Tuple, _values: &mut Vec<Val2>) {
574574
// Only here because we didn't return zero above, right?
575575
}
576576
}
577577

578-
impl<'leap, Key, Val, Tuple, Func> Leapers<'leap, Tuple, ()>
578+
impl<'leap, Key, Val, Tuple, Func> Leapers<Tuple, ()>
579579
for FilterWith<'leap, Key, Val, Tuple, Func>
580580
where
581581
Key: Ord + 'leap,
@@ -591,12 +591,12 @@ pub(crate) mod filter_with {
591591
}
592592
}
593593

594-
fn propose(&mut self, _: &Tuple, min_index: usize, values: &mut Vec<&'leap ()>) {
594+
fn propose(&mut self, _: &Tuple, min_index: usize, values: &mut Vec<()>) {
595595
assert_eq!(min_index, 0);
596-
values.push(&());
596+
values.push(());
597597
}
598598

599-
fn intersect(&mut self, _: &Tuple, min_index: usize, values: &mut Vec<&'leap ()>) {
599+
fn intersect(&mut self, _: &Tuple, min_index: usize, values: &mut Vec<()>) {
600600
assert_eq!(min_index, 0);
601601
assert_eq!(values.len(), 1);
602602
}
@@ -639,7 +639,7 @@ pub(crate) mod filter_anti {
639639
}
640640
}
641641

642-
impl<'leap, Key: Ord, Val: Ord + 'leap, Val2, Tuple: Ord, Func> Leaper<'leap, Tuple, Val2>
642+
impl<'leap, Key: Ord, Val: Ord + 'leap, Val2, Tuple: Ord, Func> Leaper<Tuple, Val2>
643643
for FilterAnti<'leap, Key, Val, Tuple, Func>
644644
where
645645
Key: Ord + 'leap,
@@ -660,15 +660,15 @@ pub(crate) mod filter_anti {
660660
self.old_key_val = Some((key_val, is_present));
661661
if is_present { 0 } else { usize::MAX }
662662
}
663-
fn propose(&mut self, _prefix: &Tuple, _values: &mut Vec<&'leap Val2>) {
663+
fn propose(&mut self, _prefix: &Tuple, _values: &mut Vec<Val2>) {
664664
panic!("FilterAnti::propose(): variable apparently unbound.");
665665
}
666-
fn intersect(&mut self, _prefix: &Tuple, _values: &mut Vec<&'leap Val2>) {
666+
fn intersect(&mut self, _prefix: &Tuple, _values: &mut Vec<Val2>) {
667667
// Only here because we didn't return zero above, right?
668668
}
669669
}
670670

671-
impl<'leap, Key, Val, Tuple, Func> Leapers<'leap, Tuple, ()>
671+
impl<'leap, Key, Val, Tuple, Func> Leapers<Tuple, ()>
672672
for FilterAnti<'leap, Key, Val, Tuple, Func>
673673
where
674674
Key: Ord + 'leap,
@@ -684,13 +684,13 @@ pub(crate) mod filter_anti {
684684
}
685685
}
686686

687-
fn propose(&mut self, _: &Tuple, min_index: usize, values: &mut Vec<&'leap ()>) {
687+
fn propose(&mut self, _: &Tuple, min_index: usize, values: &mut Vec<()>) {
688688
// We only get here if `tuple` is *not* a member of `self.relation`
689689
assert_eq!(min_index, 0);
690-
values.push(&());
690+
values.push(());
691691
}
692692

693-
fn intersect(&mut self, _: &Tuple, min_index: usize, values: &mut Vec<&'leap ()>) {
693+
fn intersect(&mut self, _: &Tuple, min_index: usize, values: &mut Vec<()>) {
694694
// We only get here if `tuple` is not a member of `self.relation`
695695
assert_eq!(min_index, 0);
696696
assert_eq!(values.len(), 1);

src/variable.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,10 +241,10 @@ impl<Tuple: Ord> Variable<Tuple> {
241241
/// - Finally, you get a callback `logic` that accepts each `(SourceTuple, Val)`
242242
/// that was successfully joined (and not filtered) and which maps to the
243243
/// type of this variable.
244-
pub fn from_leapjoin<'leap, SourceTuple: Ord, Val: Ord + 'leap>(
244+
pub fn from_leapjoin<SourceTuple: Ord, Val: Ord>(
245245
&self,
246246
source: &Variable<SourceTuple>,
247-
leapers: impl Leapers<'leap, SourceTuple, Val>,
247+
leapers: impl Leapers<SourceTuple, Val>,
248248
logic: impl FnMut(&SourceTuple, &Val) -> Tuple,
249249
) {
250250
self.insert(treefrog::leapjoin(&source.recent.borrow(), leapers, logic));

0 commit comments

Comments
 (0)