mirror of
https://github.com/martinvonz/jj.git
synced 2025-05-13 19:24:25 +00:00
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.
This commit is contained in:
parent
84118e1edd
commit
bc49b6b190
@ -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<F> fmt::Debug for PurePredicateFn<F> {
|
||||
|
||||
impl<F> ToPredicateFn for PurePredicateFn<F>
|
||||
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: F) -> PurePredicateFn<F>
|
||||
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<dyn ToPredicateFn + 'a> {
|
||||
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<dyn Matcher> = if let Some(paths) = paths {
|
||||
Box::new(PrefixMatcher::new(paths))
|
||||
let matcher: Rc<dyn Matcher> = 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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user