diff options
author | Andrew Gallant <jamslam@gmail.com> | 2023-10-08 14:49:18 -0400 |
---|---|---|
committer | Andrew Gallant <jamslam@gmail.com> | 2023-10-09 20:29:52 -0400 |
commit | f7ff34fdf9d2853f9763aceb28f5dcb014728045 (patch) | |
tree | d7b4c8395b27274588d859fa906851c4fd385301 /crates | |
parent | b9de003f8125b7257e70dd72183ad6250facd3da (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.rs | 26 |
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)] |