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