diff options
| author | Huon Wilson <dbau.pp+github@gmail.com> | 2014-11-15 14:44:55 +1100 |
|---|---|---|
| committer | Huon Wilson <dbau.pp+github@gmail.com> | 2014-11-25 17:10:32 +1100 |
| commit | b86a7808c74fa0da1f1fcb9b7df760314f9e4104 (patch) | |
| tree | 40bc88044c4b03681b4c67d2b4373e0649e8c95f /src/libcoretest | |
| parent | bb2168c5252adeda1dd35ccf7050df89655233d7 (diff) | |
| download | rust-b86a7808c74fa0da1f1fcb9b7df760314f9e4104.tar.gz rust-b86a7808c74fa0da1f1fcb9b7df760314f9e4104.zip | |
Add methods to go from a slice iterators to a slice.
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`.
Diffstat (limited to 'src/libcoretest')
| -rw-r--r-- | src/libcoretest/slice.rs | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/libcoretest/slice.rs b/src/libcoretest/slice.rs index 1288756dea4..29253c50ed0 100644 --- a/src/libcoretest/slice.rs +++ b/src/libcoretest/slice.rs @@ -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!([(),(),()]); +} |
