@@ -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