diff options
author | Andrew Gallant <jamslam@gmail.com> | 2019-04-05 20:40:39 -0400 |
---|---|---|
committer | Andrew Gallant <jamslam@gmail.com> | 2019-04-05 23:24:08 -0400 |
commit | 254b8b67bbe0245a2f117c030d2c10a2dde2ed46 (patch) | |
tree | 2918bea7ece817382aac16b3ff5988f4e5418982 /globset | |
parent | 8a7f43b84dfd4b3e186804a29c66215b3cfeb8f7 (diff) |
globset: small perf improvements
This tweaks the path handling functions slightly to make them a hair
faster. In particular, `file_name` is called on every path that ripgrep
visits, and it was possible to remove a few branches without changing
behavior.
Diffstat (limited to 'globset')
-rw-r--r-- | globset/src/lib.rs | 3 | ||||
-rw-r--r-- | globset/src/pathutil.rs | 16 |
2 files changed, 6 insertions, 13 deletions
diff --git a/globset/src/lib.rs b/globset/src/lib.rs index de5948da..6b3ca85c 100644 --- a/globset/src/lib.rs +++ b/globset/src/lib.rs @@ -292,6 +292,7 @@ pub struct GlobSet { impl GlobSet { /// Create an empty `GlobSet`. An empty set matches nothing. + #[inline] pub fn empty() -> GlobSet { GlobSet { len: 0, @@ -300,11 +301,13 @@ impl GlobSet { } /// Returns true if this set is empty, and therefore matches nothing. + #[inline] pub fn is_empty(&self) -> bool { self.len == 0 } /// Returns the number of globs in this set. + #[inline] pub fn len(&self) -> usize { self.len } diff --git a/globset/src/pathutil.rs b/globset/src/pathutil.rs index 62a68322..6c2fb1e9 100644 --- a/globset/src/pathutil.rs +++ b/globset/src/pathutil.rs @@ -9,12 +9,8 @@ use bstr::BStr; pub fn file_name<'a>(path: &Cow<'a, BStr>) -> Option<Cow<'a, BStr>> { if path.is_empty() { return None; - } else if path.len() == 1 && path[0] == b'.' { - return None; } else if path.last() == Some(b'.') { return None; - } else if path.len() >= 2 && &path[path.len() - 2..] == ".." { - return None; } let last_slash = path.rfind_byte(b'/').map(|i| i + 1).unwrap_or(0); Some(match *path { @@ -47,15 +43,9 @@ pub fn file_name_ext<'a>(name: &Cow<'a, BStr>) -> Option<Cow<'a, BStr>> { if name.is_empty() { return None; } - let last_dot_at = { - let result = name - .bytes().enumerate().rev() - .find(|&(_, b)| b == b'.') - .map(|(i, _)| i); - match result { - None => return None, - Some(i) => i, - } + let last_dot_at = match name.rfind_byte(b'.') { + None => return None, + Some(i) => i, }; Some(match *name { Cow::Borrowed(name) => Cow::Borrowed(&name[last_dot_at..]), |