1
0
mirror of https://github.com/BurntSushi/ripgrep.git synced 2024-12-12 19:18:24 +02:00

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.
This commit is contained in:
Andrew Gallant 2019-04-05 20:40:39 -04:00
parent 8e1d40ed7d
commit fb6cad7152
No known key found for this signature in database
GPG Key ID: B2E3A4923F8B0D44
2 changed files with 6 additions and 13 deletions

View File

@ -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
}

View File

@ -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 {
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..]),