Mercurial > hg
changeset 43832:1bb4e9b02984
rust-matchers: improve `Matcher` trait ergonomics
`VisitChildrenSet` has no need to own the set, this will save allocations.
The `file_set` return type change is motivated by both ergonomics and... being
able to compile code.
The `AlwaysMatcher` does not store a `file_set`, which requires it to return an
owned `HashSet`, which in turn would change our return type to `Cow<&HgPath>`
(lifetimes omitted). This is both un-ergonomic and troublesome for more
complex lifetime issues (especially with the upcoming `FileMatcher` in the
following patch).
Differential Revision: https://phab.mercurial-scm.org/D7525
author | Raphaël Gomès <rgomes@octobus.net> |
---|---|
date | Fri, 29 Nov 2019 18:33:56 +0100 |
parents | 088ba9d94079 |
children | 4f1543a2f5c3 |
files | rust/hg-core/src/matchers.rs |
diffstat | 1 files changed, 5 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/rust/hg-core/src/matchers.rs Fri Nov 29 17:19:34 2019 +0100 +++ b/rust/hg-core/src/matchers.rs Fri Nov 29 18:33:56 2019 +0100 @@ -10,21 +10,21 @@ use crate::utils::hg_path::{HgPath, HgPathBuf}; use std::collections::HashSet; -pub enum VisitChildrenSet { +pub enum VisitChildrenSet<'a> { /// Don't visit anything Empty, /// Only visit this directory This, /// Visit this directory and these subdirectories /// TODO Should we implement a `NonEmptyHashSet`? - Set(HashSet<HgPathBuf>), + Set(HashSet<&'a HgPath>), /// Visit this directory and all subdirectories Recursive, } pub trait Matcher { /// Explicitly listed files - fn file_set(&self) -> HashSet<&HgPath>; + fn file_set(&self) -> Option<&HashSet<&HgPath>>; /// Returns whether `filename` is in `file_set` fn exact_match(&self, filename: impl AsRef<HgPath>) -> bool; /// Returns whether `filename` is matched by this matcher @@ -82,8 +82,8 @@ pub struct AlwaysMatcher; impl Matcher for AlwaysMatcher { - fn file_set(&self) -> HashSet<&HgPath> { - HashSet::new() + fn file_set(&self) -> Option<&HashSet<&HgPath>> { + None } fn exact_match(&self, _filename: impl AsRef<HgPath>) -> bool { false