Skip to content

Commit 266da8e

Browse files
committed
Unify EscapeDefault::next and EscapeDefault::nth
by extracting a shared `step` function.
1 parent 90ddfc7 commit 266da8e

File tree

1 file changed

+32
-36
lines changed

1 file changed

+32
-36
lines changed

src/libcore/char.rs

+32-36
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)