From fbb292f7c92dc845edf2aa891f1890a8d318fe48 Mon Sep 17 00:00:00 2001 From: Yuya Nishihara Date: Sat, 1 Apr 2023 19:27:14 +0900 Subject: [PATCH] revset: relax lifetime bound of ToPredicateFn We don't have to require that the input IndexEntry<'_> has 'index lifetime. --- lib/src/default_revset_engine.rs | 59 ++++++++++++++------------------ 1 file changed, 25 insertions(+), 34 deletions(-) diff --git a/lib/src/default_revset_engine.rs b/lib/src/default_revset_engine.rs index fa1394ad4..c55affe87 100644 --- a/lib/src/default_revset_engine.rs +++ b/lib/src/default_revset_engine.rs @@ -31,23 +31,20 @@ use crate::revset::{ use crate::store::Store; use crate::{backend, rewrite}; -trait ToPredicateFn<'index> { +trait ToPredicateFn { /// Creates function that tests if the given entry is included in the set. /// /// The predicate function is evaluated in order of `RevsetIterator`. - fn to_predicate_fn(&self) -> Box) -> bool + '_>; + fn to_predicate_fn(&self) -> Box) -> bool + '_>; } -impl<'index, T> ToPredicateFn<'index> for Box -where - T: ToPredicateFn<'index> + ?Sized, -{ - fn to_predicate_fn(&self) -> Box) -> bool + '_> { - >::to_predicate_fn(self) +impl ToPredicateFn for Box { + fn to_predicate_fn(&self) -> Box) -> bool + '_> { + ::to_predicate_fn(self) } } -trait InternalRevset<'index>: ToPredicateFn<'index> { +trait InternalRevset<'index>: ToPredicateFn { // All revsets currently iterate in order of descending index position fn iter(&self) -> Box> + '_>; } @@ -210,8 +207,8 @@ impl<'index> InternalRevset<'index> for EagerRevset<'index> { } } -impl<'index> ToPredicateFn<'index> for EagerRevset<'index> { - fn to_predicate_fn(&self) -> Box) -> bool + '_> { +impl ToPredicateFn for EagerRevset<'_> { + fn to_predicate_fn(&self) -> Box) -> bool + '_> { predicate_fn_from_iter(self.iter()) } } @@ -229,18 +226,18 @@ where } } -impl<'index, T> ToPredicateFn<'index> for RevWalkRevset +impl<'index, T> ToPredicateFn for RevWalkRevset where T: Iterator> + Clone, { - fn to_predicate_fn(&self) -> Box) -> bool + '_> { + fn to_predicate_fn(&self) -> Box) -> bool + '_> { predicate_fn_from_iter(self.walk.clone()) } } fn predicate_fn_from_iter<'index, 'iter>( iter: impl Iterator> + 'iter, -) -> Box) -> bool + 'iter> { +) -> Box) -> bool + 'iter> { let mut iter = iter.fuse().peekable(); Box::new(move |entry| { while iter.next_if(|e| e.position() > entry.position()).is_some() { @@ -274,8 +271,8 @@ impl<'index> InternalRevset<'index> for ChildrenRevset<'index> { } } -impl<'index> ToPredicateFn<'index> for ChildrenRevset<'index> { - fn to_predicate_fn(&self) -> Box) -> bool + '_> { +impl ToPredicateFn for ChildrenRevset<'_> { + fn to_predicate_fn(&self) -> Box) -> bool + '_> { // TODO: can be optimized if candidate_set contains all heads predicate_fn_from_iter(self.iter()) } @@ -286,21 +283,15 @@ struct FilterRevset<'index, P> { predicate: P, } -impl<'index, P> InternalRevset<'index> for FilterRevset<'index, P> -where - P: ToPredicateFn<'index>, -{ +impl<'index, P: ToPredicateFn> InternalRevset<'index> for FilterRevset<'index, P> { fn iter(&self) -> Box> + '_> { let p = self.predicate.to_predicate_fn(); Box::new(self.candidates.iter().filter(p)) } } -impl<'index, P> ToPredicateFn<'index> for FilterRevset<'index, P> -where - P: ToPredicateFn<'index>, -{ - fn to_predicate_fn(&self) -> Box) -> bool + '_> { +impl ToPredicateFn for FilterRevset<'_, P> { + fn to_predicate_fn(&self) -> Box) -> bool + '_> { // TODO: optimize 'p1' out if candidates = All let mut p1 = self.candidates.to_predicate_fn(); let mut p2 = self.predicate.to_predicate_fn(); @@ -322,8 +313,8 @@ impl<'index> InternalRevset<'index> for UnionRevset<'index> { } } -impl<'index> ToPredicateFn<'index> for UnionRevset<'index> { - fn to_predicate_fn(&self) -> Box) -> bool + '_> { +impl ToPredicateFn for UnionRevset<'_> { + fn to_predicate_fn(&self) -> Box) -> bool + '_> { let mut p1 = self.set1.to_predicate_fn(); let mut p2 = self.set2.to_predicate_fn(); Box::new(move |entry| p1(entry) || p2(entry)) @@ -374,8 +365,8 @@ impl<'index> InternalRevset<'index> for IntersectionRevset<'index> { } } -impl<'index> ToPredicateFn<'index> for IntersectionRevset<'index> { - fn to_predicate_fn(&self) -> Box) -> bool + '_> { +impl ToPredicateFn for IntersectionRevset<'_> { + fn to_predicate_fn(&self) -> Box) -> bool + '_> { let mut p1 = self.set1.to_predicate_fn(); let mut p2 = self.set2.to_predicate_fn(); Box::new(move |entry| p1(entry) && p2(entry)) @@ -438,8 +429,8 @@ impl<'index> InternalRevset<'index> for DifferenceRevset<'index> { } } -impl<'index> ToPredicateFn<'index> for DifferenceRevset<'index> { - fn to_predicate_fn(&self) -> Box) -> bool + '_> { +impl ToPredicateFn for DifferenceRevset<'_> { + fn to_predicate_fn(&self) -> Box) -> bool + '_> { // TODO: optimize 'p1' out for unary negate? let mut p1 = self.set1.to_predicate_fn(); let mut p2 = self.set2.to_predicate_fn(); @@ -732,10 +723,10 @@ impl<'index, 'heads> EvaluationContext<'index, 'heads> { } } -type PurePredicateFn<'index> = Box) -> bool + 'index>; +type PurePredicateFn<'index> = Box) -> bool + 'index>; -impl<'index> ToPredicateFn<'index> for PurePredicateFn<'index> { - fn to_predicate_fn(&self) -> Box) -> bool + '_> { +impl ToPredicateFn for PurePredicateFn<'_> { + fn to_predicate_fn(&self) -> Box) -> bool + '_> { Box::new(self) } }