Skip to content

Commit adcbd42

Browse files
committed
perf: unsafe get_unchecked
1 parent f03f3e1 commit adcbd42

File tree

1 file changed

+18
-12
lines changed

1 file changed

+18
-12
lines changed

src/replace_source.rs

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

175+
#[allow(unsafe_code)]
176+
#[inline]
175177
fn rope<'a>(&'a self, on_chunk: &mut dyn FnMut(&'a str)) {
176178
if self.replacements.is_empty() {
177179
return self.inner.rope(on_chunk);
@@ -180,9 +182,10 @@ impl Source for ReplaceSource {
180182
let mut pos: usize = 0;
181183
let mut replacement_idx: usize = 0;
182184
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);
185+
let mut next_replacement: Option<usize> = self
186+
.replacements
187+
.get(replacement_idx)
188+
.map(|repl| repl.start as usize);
186189

187190
self.inner.rope(&mut |chunk| {
188191
let mut chunk_pos = 0;
@@ -209,13 +212,15 @@ impl Source for ReplaceSource {
209212
if next_replacement_pos > pos {
210213
// Emit chunk until replacement
211214
let offset = next_replacement_pos - pos;
212-
let chunk_slice = &chunk[chunk_pos..(chunk_pos + offset)];
215+
let chunk_slice =
216+
unsafe { chunk.get_unchecked(chunk_pos..(chunk_pos + offset)) };
213217
on_chunk(chunk_slice);
214218
chunk_pos += offset;
215219
pos = next_replacement_pos;
216220
}
217221
// Insert replacement content split into chunks by lines
218-
let replacement = &self.replacements[replacement_idx];
222+
let replacement =
223+
unsafe { self.replacements.get_unchecked(replacement_idx) };
219224
on_chunk(&replacement.content);
220225

221226
// Remove replaced content by settings this variable
@@ -227,11 +232,10 @@ impl Source for ReplaceSource {
227232

228233
// Move to next replacement
229234
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-
};
235+
next_replacement = self
236+
.replacements
237+
.get(replacement_idx)
238+
.map(|repl| repl.start as usize);
235239

236240
// Skip over when it has been replaced
237241
let offset = chunk.len() as i64 - end_pos as i64
@@ -254,14 +258,16 @@ impl Source for ReplaceSource {
254258

255259
// Emit remaining chunk
256260
if chunk_pos < chunk.len() {
257-
on_chunk(&chunk[chunk_pos..]);
261+
on_chunk(unsafe { chunk.get_unchecked(chunk_pos..) });
258262
}
259263
pos = end_pos;
260264
});
261265

262266
// Handle remaining replacements one by one
263267
while replacement_idx < self.replacements.len() {
264-
let content = &self.replacements[replacement_idx].content;
268+
let replacement =
269+
unsafe { self.replacements.get_unchecked(replacement_idx) };
270+
let content = &replacement.content;
265271
on_chunk(content);
266272
replacement_idx += 1;
267273
}

0 commit comments

Comments
 (0)