Skip to content

Commit 99ee087

Browse files
committed
Overide methods in iterator implementation for EscapeDefault, see #24214
1 parent 3324a14 commit 99ee087

File tree

1 file changed

+52
-0
lines changed

1 file changed

+52
-0
lines changed

src/libcore/char.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -537,4 +537,56 @@ impl Iterator for EscapeDefault {
537537
EscapeDefaultState::Done => (0, Some(0)),
538538
}
539539
}
540+
541+
fn count(self) -> usize {
542+
match self.state {
543+
EscapeDefaultState::Char(_) => 1,
544+
EscapeDefaultState::Unicode(iter) => iter.count(),
545+
EscapeDefaultState::Done => 0,
546+
EscapeDefaultState::Backslash(_) => 2,
547+
}
548+
}
549+
550+
fn nth(&mut self, n: usize) -> Option<char> {
551+
let ch = match self.state {
552+
EscapeDefaultState::Backslash(c) => c,
553+
EscapeDefaultState::Char(c) => c,
554+
EscapeDefaultState::Done => return None,
555+
EscapeDefaultState::Unicode(ref mut i) => return iter.nth(n),
556+
};
557+
558+
let start = self.get_offset();
559+
let idx = start + n;
560+
561+
// Update state
562+
self.state = match idx {
563+
0 => EscapeDefaultState::Char(c),
564+
_ => EscapeDefaultState::Done,
565+
};
566+
567+
match idx {
568+
0 => Some('\\'),
569+
1 => Some(c),
570+
_ => None,
571+
}
572+
}
573+
574+
fn last(self) -> Option<char> {
575+
match self.state {
576+
EscapeDefaultState::Unicode(iter) => iter.last(),
577+
EscapeDefaultState::Done => None,
578+
EscapeDefaultState::Backslash(c) | EscapeDefaultState::Char(c) => Some(c),
579+
}
580+
}
581+
}
582+
583+
impl EscapeDefault {
584+
fn get_offset(&self) -> Option<usize> {
585+
match self.state {
586+
EscapeDefaultState::Backslash(c) => Some(0),
587+
EscapeDefaultState::Char(c) => Some(1),
588+
EscapeDefaultState::Done => None,
589+
EscapeDefaultState::Unicode(ref mut iter) => None,
590+
}
591+
}
540592
}

0 commit comments

Comments
 (0)