8
8
#![ allow( unused_imports) ]
9
9
10
10
use core:: borrow:: { Borrow , BorrowMut } ;
11
+ use core:: intrinsics:: unlikely;
11
12
use core:: iter:: FusedIterator ;
12
13
use core:: mem;
13
14
use core:: ptr;
@@ -375,14 +376,16 @@ impl str {
375
376
// Safety: We have written only valid ASCII to our vec
376
377
let mut s = unsafe { String :: from_utf8_unchecked ( out) } ;
377
378
378
- for ( i, c) in rest[ .. ] . char_indices ( ) {
379
- if c == 'Σ' {
379
+ for ( i, c) in rest. char_indices ( ) {
380
+ if unlikely ( c == 'Σ' ) {
380
381
// Σ maps to σ, except at the end of a word where it maps to ς.
381
382
// This is the only conditional (contextual) but language-independent mapping
382
383
// in `SpecialCasing.txt`,
383
384
// so hard-code it rather than have a generic "condition" mechanism.
384
385
// See https://github.com/rust-lang/rust/issues/26035
385
- map_uppercase_sigma ( rest, i, & mut s)
386
+ let out_len = self . len ( ) - rest. len ( ) ;
387
+ let sigma_lowercase = map_uppercase_sigma ( & self , i + out_len) ;
388
+ s. push ( sigma_lowercase) ;
386
389
} else {
387
390
match conversions:: to_lower ( c) {
388
391
[ a, '\0' , _] => s. push ( a) ,
@@ -400,13 +403,13 @@ impl str {
400
403
}
401
404
return s;
402
405
403
- fn map_uppercase_sigma ( from : & str , i : usize , to : & mut String ) {
406
+ fn map_uppercase_sigma ( from : & str , i : usize ) -> char {
404
407
// See https://www.unicode.org/versions/Unicode7.0.0/ch03.pdf#G33992
405
408
// for the definition of `Final_Sigma`.
406
409
debug_assert ! ( 'Σ' . len_utf8( ) == 2 ) ;
407
410
let is_word_final = case_ignorable_then_cased ( from[ ..i] . chars ( ) . rev ( ) )
408
411
&& !case_ignorable_then_cased ( from[ i + 2 ..] . chars ( ) ) ;
409
- to . push_str ( if is_word_final { "ς" } else { "σ" } ) ;
412
+ if is_word_final { 'ς' } else { 'σ' }
410
413
}
411
414
412
415
fn case_ignorable_then_cased < I : Iterator < Item = char > > ( iter : I ) -> bool {
0 commit comments