Skip to content

Commit 0294098

Browse files
committed
Implement size_hint for EscapeUnicode
1 parent d2d0872 commit 0294098

File tree

2 files changed

+20
-4
lines changed

2 files changed

+20
-4
lines changed

src/libcore/char.rs

+19-3
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,22 @@ impl Iterator for EscapeUnicode {
342342
EscapeUnicodeState::Done => None,
343343
}
344344
}
345+
346+
fn size_hint(&self) -> (usize, Option<usize>) {
347+
let mut n = 0;
348+
while (self.c as usize) >> (4 * (n + 1)) != 0 {
349+
n += 1;
350+
}
351+
let n = match self.state {
352+
EscapeUnicodeState::Backslash => n + 5,
353+
EscapeUnicodeState::Type => n + 4,
354+
EscapeUnicodeState::LeftBrace => n + 3,
355+
EscapeUnicodeState::Value(offset) => offset + 2,
356+
EscapeUnicodeState::RightBrace => 1,
357+
EscapeUnicodeState::Done => 0,
358+
};
359+
(n, Some(n))
360+
}
345361
}
346362

347363
/// An iterator over the characters that represent a `char`, escaped
@@ -375,16 +391,16 @@ impl Iterator for EscapeDefault {
375391
Some(c)
376392
}
377393
EscapeDefaultState::Done => None,
378-
EscapeDefaultState::Unicode(ref mut iter) => iter.next()
394+
EscapeDefaultState::Unicode(ref mut iter) => iter.next(),
379395
}
380396
}
381397

382398
fn size_hint(&self) -> (usize, Option<usize>) {
383399
match self.state {
384400
EscapeDefaultState::Char(_) => (1, Some(1)),
385401
EscapeDefaultState::Backslash(_) => (2, Some(2)),
386-
EscapeDefaultState::Unicode(_) => (0, Some(10)),
387-
_ => (0, Some(0))
402+
EscapeDefaultState::Unicode(ref iter) => iter.size_hint(),
403+
EscapeDefaultState::Done => (0, Some(0)),
388404
}
389405
}
390406
}

src/libcore/fmt/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1315,7 +1315,7 @@ impl Debug for str {
13151315
for (i, c) in self.char_indices() {
13161316
let esc = c.escape_default();
13171317
// If char needs escaping, flush backlog so far and write, else skip
1318-
if esc.size_hint().0 != 1 {
1318+
if esc.size_hint() != (1, Some(1)) {
13191319
try!(f.write_str(&self[from..i]));
13201320
for c in esc {
13211321
try!(f.write_char(c));

0 commit comments

Comments
 (0)