From 254b8b67bbe0245a2f117c030d2c10a2dde2ed46 Mon Sep 17 00:00:00 2001
From: Andrew Gallant <jamslam@gmail.com>
Date: Fri, 5 Apr 2019 20:40:39 -0400
Subject: [PATCH] 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.
---
 globset/src/lib.rs      |  3 +++
 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..]),