Skip to content

Commit 2be9e2c

Browse files
committed
perf: unsafe get_unchecked
1 parent f03f3e1 commit 2be9e2c

File tree

1 file changed

+17
-12
lines changed

1 file changed

+17
-12
lines changed

src/replace_source.rs

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ impl Source for ReplaceSource {
172172
SourceValue::String(Cow::Owned(string))
173173
}
174174

175+
#[allow(unsafe_code)]
175176
fn rope<'a>(&'a self, on_chunk: &mut dyn FnMut(&'a str)) {
176177
if self.replacements.is_empty() {
177178
return self.inner.rope(on_chunk);
@@ -180,9 +181,10 @@ impl Source for ReplaceSource {
180181
let mut pos: usize = 0;
181182
let mut replacement_idx: usize = 0;
182183
let mut replacement_end: Option<usize> = None;
183-
let mut next_replacement: Option<usize> = (replacement_idx
184-
< self.replacements.len())
185-
.then(|| self.replacements[replacement_idx].start as usize);
184+
let mut next_replacement: Option<usize> = self
185+
.replacements
186+
.get(replacement_idx)
187+
.map(|repl| repl.start as usize);
186188

187189
self.inner.rope(&mut |chunk| {
188190
let mut chunk_pos = 0;
@@ -209,13 +211,15 @@ impl Source for ReplaceSource {
209211
if next_replacement_pos > pos {
210212
// Emit chunk until replacement
211213
let offset = next_replacement_pos - pos;
212-
let chunk_slice = &chunk[chunk_pos..(chunk_pos + offset)];
214+
let chunk_slice =
215+
unsafe { chunk.get_unchecked(chunk_pos..(chunk_pos + offset)) };
213216
on_chunk(chunk_slice);
214217
chunk_pos += offset;
215218
pos = next_replacement_pos;
216219
}
217220
// Insert replacement content split into chunks by lines
218-
let replacement = &self.replacements[replacement_idx];
221+
let replacement =
222+
unsafe { self.replacements.get_unchecked(replacement_idx) };
219223
on_chunk(&replacement.content);
220224

221225
// Remove replaced content by settings this variable
@@ -227,11 +231,10 @@ impl Source for ReplaceSource {
227231

228232
// Move to next replacement
229233
replacement_idx += 1;
230-
next_replacement = if replacement_idx < self.replacements.len() {
231-
Some(self.replacements[replacement_idx].start as usize)
232-
} else {
233-
None
234-
};
234+
next_replacement = self
235+
.replacements
236+
.get(replacement_idx)
237+
.map(|repl| repl.start as usize);
235238

236239
// Skip over when it has been replaced
237240
let offset = chunk.len() as i64 - end_pos as i64
@@ -254,14 +257,16 @@ impl Source for ReplaceSource {
254257

255258
// Emit remaining chunk
256259
if chunk_pos < chunk.len() {
257-
on_chunk(&chunk[chunk_pos..]);
260+
on_chunk(unsafe { chunk.get_unchecked(chunk_pos..) });
258261
}
259262
pos = end_pos;
260263
});
261264

262265
// Handle remaining replacements one by one
263266
while replacement_idx < self.replacements.len() {
264-
let content = &self.replacements[replacement_idx].content;
267+
let replacement =
268+
unsafe { self.replacements.get_unchecked(replacement_idx) };
269+
let content = &replacement.content;
265270
on_chunk(content);
266271
replacement_idx += 1;
267272
}

0 commit comments

Comments
 (0)