Skip to content

Commit

Permalink
FindSubstring<&[u8]>: make use of memchr::memmem
Browse files Browse the repository at this point in the history
  • Loading branch information
homersimpsons committed Oct 22, 2021
1 parent db9d5f8 commit a33987b
Show file tree
Hide file tree
Showing 2 changed files with 2 additions and 30 deletions.
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ version = "0.2.0"
default-features = false

[dependencies.memchr]
version = "2.3"
version = "2.4"
default-features = false

[dev-dependencies]
Expand Down
30 changes: 1 addition & 29 deletions src/traits.rs
Original file line number Diff line number Diff line change
Expand Up @@ -922,35 +922,7 @@ pub trait FindSubstring<T> {

impl<'a, 'b> FindSubstring<&'b [u8]> for &'a [u8] {
fn find_substring(&self, substr: &'b [u8]) -> Option<usize> {
if substr.len() > self.len() {
return None;
}

let (&substr_first, substr_rest) = match substr.split_first() {
Some(split) => split,
// an empty substring is found at position 0
// This matches the behavior of str.find("").
None => return Some(0),
};

if substr_rest.is_empty() {
return memchr::memchr(substr_first, self);
}

let mut offset = 0;
let haystack = &self[..self.len() - substr_rest.len()];

while let Some(position) = memchr::memchr(substr_first, &haystack[offset..]) {
offset += position;
let next_offset = offset + 1;
if &self[next_offset..][..substr_rest.len()] == substr_rest {
return Some(offset);
}

offset = next_offset;
}

None
memchr::memmem::find(&self, substr)
}
}

Expand Down

0 comments on commit a33987b

Please sign in to comment.