From bc49b6b1908290ed547794df33410cc878dbde9c Mon Sep 17 00:00:00 2001 From: Yuya Nishihara Date: Sun, 10 Mar 2024 14:54:30 +0900 Subject: [PATCH] revset: make PurePredicateFn clonable Prepares for dropping &self lifetime from to_predicate_fn(). All predicate functions could be wrapped as Box::new(PurePredicateFn(Rc::new(f))) instead, but I don't think the .clone() cost matters. --- lib/src/default_index/revset_engine.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/src/default_index/revset_engine.rs b/lib/src/default_index/revset_engine.rs index 208b46343..140d89ce0 100644 --- a/lib/src/default_index/revset_engine.rs +++ b/lib/src/default_index/revset_engine.rs @@ -19,6 +19,7 @@ use std::cmp::{Ordering, Reverse}; use std::collections::{BTreeSet, BinaryHeap, HashSet}; use std::fmt; use std::ops::Range; +use std::rc::Rc; use std::sync::Arc; use itertools::Itertools; @@ -909,22 +910,22 @@ impl fmt::Debug for PurePredicateFn { impl ToPredicateFn for PurePredicateFn where - F: Fn(&CompositeIndex, IndexPosition) -> bool, + F: Fn(&CompositeIndex, IndexPosition) -> bool + Clone, { fn to_predicate_fn(&self) -> BoxedPredicateFn<'_> { - Box::new(&self.0) + Box::new(self.0.clone()) } } fn as_pure_predicate_fn(f: F) -> PurePredicateFn where - F: Fn(&CompositeIndex, IndexPosition) -> bool, + F: Fn(&CompositeIndex, IndexPosition) -> bool + Clone, { PurePredicateFn(f) } fn box_pure_predicate_fn<'a>( - f: impl Fn(&CompositeIndex, IndexPosition) -> bool + 'a, + f: impl Fn(&CompositeIndex, IndexPosition) -> bool + Clone + 'a, ) -> Box { Box::new(PurePredicateFn(f)) } @@ -971,10 +972,10 @@ fn build_predicate_fn( } RevsetFilterPredicate::File(paths) => { // TODO: Add support for globs and other formats - let matcher: Box = if let Some(paths) = paths { - Box::new(PrefixMatcher::new(paths)) + let matcher: Rc = if let Some(paths) = paths { + Rc::new(PrefixMatcher::new(paths)) } else { - Box::new(EverythingMatcher) + Rc::new(EverythingMatcher) }; box_pure_predicate_fn(move |index, pos| { let entry = index.entry_by_pos(pos);