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:
@@ -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!([(),(),()]);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user