Skip to content

Commit 1f516dc

Browse files
committed
Auto merge of #30624 - Ticki:specialization, r=alexcrichton
Part of #30520. Completes #24214
2 parents 05aeeb3 + d026977 commit 1f516dc

File tree

2 files changed

+85
-0
lines changed

2 files changed

+85
-0
lines changed

src/libcore/char.rs

+45
Original file line numberDiff line numberDiff line change
@@ -537,4 +537,49 @@ 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+
match self.state {
552+
EscapeDefaultState::Backslash(c) if n == 0 => {
553+
self.state = EscapeDefaultState::Char(c);
554+
Some('\\')
555+
},
556+
EscapeDefaultState::Backslash(c) if n == 1 => {
557+
self.state = EscapeDefaultState::Done;
558+
Some(c)
559+
},
560+
EscapeDefaultState::Backslash(_) => {
561+
self.state = EscapeDefaultState::Done;
562+
None
563+
},
564+
EscapeDefaultState::Char(c) => {
565+
self.state = EscapeDefaultState::Done;
566+
567+
if n == 0 {
568+
Some(c)
569+
} else {
570+
None
571+
}
572+
},
573+
EscapeDefaultState::Done => return None,
574+
EscapeDefaultState::Unicode(ref mut i) => return i.nth(n),
575+
}
576+
}
577+
578+
fn last(self) -> Option<char> {
579+
match self.state {
580+
EscapeDefaultState::Unicode(iter) => iter.last(),
581+
EscapeDefaultState::Done => None,
582+
EscapeDefaultState::Backslash(c) | EscapeDefaultState::Char(c) => Some(c),
583+
}
584+
}
540585
}

src/libcoretest/char.rs

+40
Original file line numberDiff line numberDiff line change
@@ -216,3 +216,43 @@ fn test_decode_utf16() {
216216
check(&[0xD800, 0x41, 0x42], &[Err(0xD800), Ok('A'), Ok('B')]);
217217
check(&[0xD800, 0], &[Err(0xD800), Ok('\0')]);
218218
}
219+
220+
#[test]
221+
fn ed_iterator_specializations() {
222+
// Check counting
223+
assert_eq!('\n'.escape_default().count(), 2);
224+
assert_eq!('c'.escape_default().count(), 1);
225+
assert_eq!(' '.escape_default().count(), 1);
226+
assert_eq!('\\'.escape_default().count(), 2);
227+
assert_eq!('\''.escape_default().count(), 2);
228+
229+
// Check nth
230+
231+
// Check that OoB is handled correctly
232+
assert_eq!('\n'.escape_default().nth(2), None);
233+
assert_eq!('c'.escape_default().nth(1), None);
234+
assert_eq!(' '.escape_default().nth(1), None);
235+
assert_eq!('\\'.escape_default().nth(2), None);
236+
assert_eq!('\''.escape_default().nth(2), None);
237+
238+
// Check the first char
239+
assert_eq!('\n'.escape_default().nth(0), Some('\\'));
240+
assert_eq!('c'.escape_default().nth(0), Some('c'));
241+
assert_eq!(' '.escape_default().nth(0), Some(' '));
242+
assert_eq!('\\'.escape_default().nth(0), Some('\\'));
243+
assert_eq!('\''.escape_default().nth(0), Some('\\'));
244+
245+
// Check the second char
246+
assert_eq!('\n'.escape_default().nth(1), Some('n'));
247+
assert_eq!('\\'.escape_default().nth(1), Some('\\'));
248+
assert_eq!('\''.escape_default().nth(1), Some('\''));
249+
250+
// Check the last char
251+
assert_eq!('\n'.escape_default().last(), Some('n'));
252+
assert_eq!('c'.escape_default().last(), Some('c'));
253+
assert_eq!(' '.escape_default().last(), Some(' '));
254+
assert_eq!('\\'.escape_default().last(), Some('\\'));
255+
assert_eq!('\''.escape_default().last(), Some('\''));
256+
}
257+
258+

0 commit comments

Comments
 (0)