]> git.lizzy.rs Git - rust.git/commitdiff
Implement `size_hint` for `EscapeUnicode`
authorSimon Mazur <semmaz.box@gmail.com>
Wed, 30 Sep 2015 17:31:41 +0000 (20:31 +0300)
committerSimon Mazur <semmaz.box@gmail.com>
Thu, 1 Oct 2015 17:33:43 +0000 (20:33 +0300)
src/libcore/char.rs
src/libcore/fmt/mod.rs

index 8d1af46691c70ed3a74b5d8d1c26514007787c28..ccce2ad22ddc283846f8bc2a7495141ca558853f 100644 (file)
@@ -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)),
         }
     }
 }
index 88b3963df8d9b5e2eb30b661cad2d19ba2a6351e..e226b5f2ca8fc09a7bf84e5ce8d9ff2079424f2c 100644 (file)
@@ -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));