auto merge of #18966 : huonw/rust/iter2slice, r=aturon

A slice iterator is isomorphic to a slice, just with a slightly
different form: storing start and end pointers rather than start pointer
and length. This patch reflects this by making converting between them
as easy as `iter.as_slice()` (or even `iter[]` if the shorter lifetime
is ok). That is, `slice.iter().as_slice() == slice`.

r? @aturon
This commit is contained in:
bors
2014-11-25 06:51:38 +00:00
2 changed files with 145 additions and 0 deletions

View File

@@ -33,3 +33,52 @@ fn binary_search_not_found() {
let b = [1i, 2, 4, 5, 6, 8];
assert!(b.binary_search(|v| v.cmp(&9)) == NotFound(6));
}
#[test]
fn iterator_to_slice() {
macro_rules! test {
($data: expr) => {{
let data: &mut [_] = &mut $data;
let other_data: &mut [_] = &mut $data;
{
let mut iter = data.iter();
assert_eq!(iter[], other_data[]);
iter.next();
assert_eq!(iter[], other_data[1..]);
iter.next_back();
assert_eq!(iter[], other_data[1..2]);
let s = iter.as_slice();
iter.next();
assert_eq!(s, other_data[1..2]);
}
{
let mut iter = data.iter_mut();
assert_eq!(iter[], other_data[]);
// mutability:
assert!(iter[mut] == other_data);
iter.next();
assert_eq!(iter[], other_data[1..]);
assert!(iter[mut] == other_data[mut 1..]);
iter.next_back();
assert_eq!(iter[], other_data[1..2]);
assert!(iter[mut] == other_data[mut 1..2]);
let s = iter.into_slice();
assert!(s == other_data[mut 1..2]);
}
}}
}
// try types of a variety of sizes
test!([(1u64, 1u64, 1u8), (2, 2, 2), (3, 3, 3)]);
test!([1u64,2,3]);
test!([1u8,2,3]);
test!([(),(),()]);
}