@@ -582,17 +582,10 @@ impl Iterator for EscapeDefault {
582582 type Item = char ;
583583
584584 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 )
596589 }
597590 }
598591
@@ -608,31 +601,7 @@ impl Iterator for EscapeDefault {
608601 }
609602
610603 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)
636605 }
637606
638607 fn last ( self ) -> Option < char > {
@@ -655,3 +624,30 @@ impl ExactSizeIterator for EscapeDefault {
655624 }
656625 }
657626}
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