提交 0294098d 编写于 作者: S Simon Mazur

Implement `size_hint` for `EscapeUnicode`

上级 d2d08721
......@@ -342,6 +342,22 @@ fn next(&mut self) -> Option<char> {
EscapeUnicodeState::Done => None,
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
let mut n = 0;
while (self.c as usize) >> (4 * (n + 1)) != 0 {
n += 1;
}
let n = match self.state {
EscapeUnicodeState::Backslash => n + 5,
EscapeUnicodeState::Type => n + 4,
EscapeUnicodeState::LeftBrace => n + 3,
EscapeUnicodeState::Value(offset) => offset + 2,
EscapeUnicodeState::RightBrace => 1,
EscapeUnicodeState::Done => 0,
};
(n, Some(n))
}
}
/// An iterator over the characters that represent a `char`, escaped
......@@ -375,7 +391,7 @@ fn next(&mut self) -> Option<char> {
Some(c)
}
EscapeDefaultState::Done => None,
EscapeDefaultState::Unicode(ref mut iter) => iter.next()
EscapeDefaultState::Unicode(ref mut iter) => iter.next(),
}
}
......@@ -383,8 +399,8 @@ fn size_hint(&self) -> (usize, Option<usize>) {
match self.state {
EscapeDefaultState::Char(_) => (1, Some(1)),
EscapeDefaultState::Backslash(_) => (2, Some(2)),
EscapeDefaultState::Unicode(_) => (0, Some(10)),
_ => (0, Some(0))
EscapeDefaultState::Unicode(ref iter) => iter.size_hint(),
EscapeDefaultState::Done => (0, Some(0)),
}
}
}
......@@ -1315,7 +1315,7 @@ fn fmt(&self, f: &mut Formatter) -> Result {
for (i, c) in self.char_indices() {
let esc = c.escape_default();
// If char needs escaping, flush backlog so far and write, else skip
if esc.size_hint().0 != 1 {
if esc.size_hint() != (1, Some(1)) {
try!(f.write_str(&self[from..i]));
for c in esc {
try!(f.write_char(c));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册