Skip to content

Commit ef71210

Browse files
committed
perf: get_unchecked
1 parent fec461e commit ef71210

File tree

2 files changed

+17
-7
lines changed

2 files changed

+17
-7
lines changed

src/cached_source.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,11 @@ impl Source for CachedSource {
9393
std::mem::transmute::<Vec<&str>, Vec<&'static str>>(self.rope())
9494
}
9595
});
96-
SourceValue::String(Cow::Owned(rope.join("")))
96+
let mut string = String::with_capacity(self.size());
97+
for segment in rope {
98+
string.push_str(segment);
99+
}
100+
SourceValue::String(Cow::Owned(string))
97101
}
98102

99103
fn rope(&self) -> Vec<&str> {

src/replace_source.rs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -169,9 +169,10 @@ impl Source for ReplaceSource {
169169
}
170170
}
171171

172+
#[allow(unsafe_code)]
172173
fn rope(&self) -> Vec<&str> {
173174
let inner_rope = self.inner.rope();
174-
let mut rope =
175+
let mut rope: Vec<&str> =
175176
Vec::with_capacity(inner_rope.len() + self.replacements.len() * 2);
176177

177178
let mut pos: usize = 0;
@@ -206,13 +207,15 @@ impl Source for ReplaceSource {
206207
if next_replacement_pos > pos {
207208
// Emit chunk until replacement
208209
let offset = next_replacement_pos - pos;
209-
let chunk_slice = &chunk[chunk_pos..(chunk_pos + offset)];
210+
let chunk_slice =
211+
unsafe { &chunk.get_unchecked(chunk_pos..(chunk_pos + offset)) };
210212
rope.push(chunk_slice);
211213
chunk_pos += offset;
212214
pos = next_replacement_pos;
213215
}
214216
// Insert replacement content split into chunks by lines
215-
let replacement = &self.replacements[replacement_idx];
217+
let replacement =
218+
unsafe { &self.replacements.get_unchecked(replacement_idx) };
216219
rope.push(&replacement.content);
217220

218221
// Remove replaced content by settings this variable
@@ -225,7 +228,9 @@ impl Source for ReplaceSource {
225228
// Move to next replacement
226229
replacement_idx += 1;
227230
next_replacement = if replacement_idx < self.replacements.len() {
228-
Some(self.replacements[replacement_idx].start as usize)
231+
Some(unsafe {
232+
self.replacements.get_unchecked(replacement_idx).start as usize
233+
})
229234
} else {
230235
None
231236
};
@@ -251,14 +256,15 @@ impl Source for ReplaceSource {
251256

252257
// Emit remaining chunk
253258
if chunk_pos < chunk.len() {
254-
rope.push(&chunk[chunk_pos..]);
259+
rope.push(unsafe { &chunk.get_unchecked(chunk_pos..) });
255260
}
256261
pos = end_pos;
257262
}
258263

259264
// Handle remaining replacements one by one
260265
while replacement_idx < self.replacements.len() {
261-
let content = &self.replacements[replacement_idx].content;
266+
let content =
267+
unsafe { &self.replacements.get_unchecked(replacement_idx).content };
262268
rope.push(content);
263269
replacement_idx += 1;
264270
}

0 commit comments

Comments
 (0)