Skip to content

Commit

Permalink
Auto merge of #33103 - ranma42:escape-unicode-last, r=alexcrichton
Browse files Browse the repository at this point in the history
Implement `last` for `EscapeUnicode`

The implementation is quite trivial as the last character is always `'{'`.
As a side-effect it also improves the implementation of `last` for `EscapeUnicode`.

Part of #24214, split from #31049.

Maybe this (and the other changes that I will split from #31049) should wait for a test like `ed_iterator_specializations` to be added. Would it be sufficient to do the same for each possible escape length?
  • Loading branch information
bors committed May 19, 2016
2 parents 764ef92 + 8169fa2 commit 1ec80f6
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 0 deletions.
12 changes: 12 additions & 0 deletions src/libcore/char.rs
Original file line number Diff line number Diff line change
Expand Up @@ -471,6 +471,18 @@ impl Iterator for EscapeUnicode {
let n = n + self.hex_digit_idx;
(n, Some(n))
}

fn last(self) -> Option<char> {
match self.state {
EscapeUnicodeState::Done => None,

EscapeUnicodeState::RightBrace |
EscapeUnicodeState::Value |
EscapeUnicodeState::LeftBrace |
EscapeUnicodeState::Type |
EscapeUnicodeState::Backslash => Some('}'),
}
}
}

/// An iterator that yields the literal escape code of a `char`.
Expand Down
33 changes: 33 additions & 0 deletions src/libcoretest/char.rs
Original file line number Diff line number Diff line change
Expand Up @@ -262,4 +262,37 @@ fn ed_iterator_specializations() {
assert_eq!('\''.escape_default().last(), Some('\''));
}

#[test]
fn eu_iterator_specializations() {
fn check(c: char) {
let len = c.escape_unicode().count();

// Check OoB
assert_eq!(c.escape_unicode().nth(len), None);

// For all possible in-bound offsets
let mut iter = c.escape_unicode();
for offset in 0..len {
// Check last
assert_eq!(iter.clone().last(), Some('}'));

// Check counting
assert_eq!(iter.clone().count(), len - offset);

// Check nth
assert_eq!(c.escape_unicode().nth(offset), iter.next());
}

// Check post-last
assert_eq!(iter.clone().last(), None);
assert_eq!(iter.clone().count(), 0);
}

check('\u{0}');
check('\u{1}');
check('\u{12}');
check('\u{123}');
check('\u{1234}');
check('\u{12340}');
check('\u{10FFFF}');
}

0 comments on commit 1ec80f6

Please sign in to comment.