summaryrefslogtreecommitdiffstats
path: root/crates
diff options
context:
space:
mode:
authorAndrew Gallant <jamslam@gmail.com>2023-10-08 14:49:18 -0400
committerAndrew Gallant <jamslam@gmail.com>2023-10-09 20:29:52 -0400
commitf7ff34fdf9d2853f9763aceb28f5dcb014728045 (patch)
treed7b4c8395b27274588d859fa906851c4fd385301 /crates
parentb9de003f8125b7257e70dd72183ad6250facd3da (diff)
searcher: simplify 'replace_bytes' routine
I did this in the course of trying to optimize it. I don't believe I made it any faster, but the refactoring led to code that I think is more readable.
Diffstat (limited to 'crates')
-rw-r--r--crates/searcher/src/line_buffer.rs26
1 files changed, 14 insertions, 12 deletions
diff --git a/crates/searcher/src/line_buffer.rs b/crates/searcher/src/line_buffer.rs
index a09d4e17..badcc438 100644
--- a/crates/searcher/src/line_buffer.rs
+++ b/crates/searcher/src/line_buffer.rs
@@ -524,24 +524,26 @@ impl LineBuffer {
/// Replaces `src` with `replacement` in bytes, and return the offset of the
/// first replacement, if one exists.
-fn replace_bytes(bytes: &mut [u8], src: u8, replacement: u8) -> Option<usize> {
+fn replace_bytes(
+ mut bytes: &mut [u8],
+ src: u8,
+ replacement: u8,
+) -> Option<usize> {
if src == replacement {
return None;
}
- let mut first_pos = None;
- let mut pos = 0;
- while let Some(i) = bytes[pos..].find_byte(src).map(|i| pos + i) {
- if first_pos.is_none() {
- first_pos = Some(i);
- }
+ let first_pos = bytes.find_byte(src)?;
+ bytes[first_pos] = replacement;
+ bytes = &mut bytes[first_pos + 1..];
+ while let Some(i) = bytes.find_byte(src) {
bytes[i] = replacement;
- pos = i + 1;
- while bytes.get(pos) == Some(&src) {
- bytes[pos] = replacement;
- pos += 1;
+ bytes = &mut bytes[i + 1..];
+ while bytes.get(0) == Some(&src) {
+ bytes[0] = replacement;
+ bytes = &mut bytes[1..];
}
}
- first_pos
+ Some(first_pos)
}
#[cfg(test)]