summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Gallant <jamslam@gmail.com>2019-04-05 20:40:39 -0400
committerAndrew Gallant <jamslam@gmail.com>2019-04-05 22:58:58 -0400
commitfb6cad7152b5cfe5d8997c5dd32438d8e9069517 (patch)
tree2918bea7ece817382aac16b3ff5988f4e5418982
parent8e1d40ed7d27fdd81488889a809fbff6cc8ea76d (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.
-rw-r--r--globset/src/lib.rs3
-rw-r--r--globset/src/pathutil.rs16
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..]),