@@ -582,17 +582,10 @@ impl Iterator for EscapeDefault {
582
582
type Item = char ;
583
583
584
584
fn next ( & mut self ) -> Option < char > {
585
- match self . state {
586
- EscapeDefaultState :: Backslash ( c) => {
587
- self . state = EscapeDefaultState :: Char ( c) ;
588
- Some ( '\\' )
589
- }
590
- EscapeDefaultState :: Char ( c) => {
591
- self . state = EscapeDefaultState :: Done ( c) ;
592
- Some ( c)
593
- }
594
- EscapeDefaultState :: Done ( _) => None ,
595
- EscapeDefaultState :: Unicode ( ref mut iter) => iter. next ( ) ,
585
+ if let EscapeDefaultState :: Unicode ( ref mut iter) = self . state {
586
+ iter. next ( )
587
+ } else {
588
+ self . step ( 0 )
596
589
}
597
590
}
598
591
@@ -608,31 +601,7 @@ impl Iterator for EscapeDefault {
608
601
}
609
602
610
603
fn nth ( & mut self , n : usize ) -> Option < char > {
611
- match self . state {
612
- EscapeDefaultState :: Backslash ( c) if n == 0 => {
613
- self . state = EscapeDefaultState :: Char ( c) ;
614
- Some ( '\\' )
615
- } ,
616
- EscapeDefaultState :: Backslash ( c) if n == 1 => {
617
- self . state = EscapeDefaultState :: Done ( c) ;
618
- Some ( c)
619
- } ,
620
- EscapeDefaultState :: Backslash ( c) => {
621
- self . state = EscapeDefaultState :: Done ( c) ;
622
- None
623
- } ,
624
- EscapeDefaultState :: Char ( c) => {
625
- self . state = EscapeDefaultState :: Done ( c) ;
626
-
627
- if n == 0 {
628
- Some ( c)
629
- } else {
630
- None
631
- }
632
- } ,
633
- EscapeDefaultState :: Done ( _) => return None ,
634
- EscapeDefaultState :: Unicode ( ref mut i) => return i. nth ( n) ,
635
- }
604
+ self . step ( n)
636
605
}
637
606
638
607
fn last ( self ) -> Option < char > {
@@ -655,3 +624,30 @@ impl ExactSizeIterator for EscapeDefault {
655
624
}
656
625
}
657
626
}
627
+
628
+ impl EscapeDefault {
629
+ #[ inline]
630
+ fn step ( & mut self , n : usize ) -> Option < char > {
631
+ let ( remaining, c) = match self . state {
632
+ EscapeDefaultState :: Done ( c) => ( 0usize , c) ,
633
+ EscapeDefaultState :: Char ( c) => ( 1 , c) ,
634
+ EscapeDefaultState :: Backslash ( c) => ( 2 , c) ,
635
+ EscapeDefaultState :: Unicode ( ref mut iter) => return iter. nth ( n) ,
636
+ } ;
637
+
638
+ match remaining. saturating_sub ( n) {
639
+ 2 => {
640
+ self . state = EscapeDefaultState :: Char ( c) ;
641
+ Some ( '\\' )
642
+ }
643
+ 1 => {
644
+ self . state = EscapeDefaultState :: Done ( c) ;
645
+ Some ( c)
646
+ }
647
+ _ => {
648
+ self . state = EscapeDefaultState :: Done ( c) ;
649
+ None
650
+ }
651
+ }
652
+ }
653
+ }
0 commit comments