about summary refs log tree commit diff
path: root/src/libcoretest
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2014-11-25 06:51:38 +0000
committerbors <bors@rust-lang.org>2014-11-25 06:51:38 +0000
commit0c1d853fba0068f9fd34b43a565ded01b199506c (patch)
tree1e52456012532a6ea65567f521bbc655c27be763 /src/libcoretest
parent5f9741e62d7cfe26ca94a28716a95bc03d74e87a (diff)
parentb86a7808c74fa0da1f1fcb9b7df760314f9e4104 (diff)
downloadrust-0c1d853fba0068f9fd34b43a565ded01b199506c.tar.gz
rust-0c1d853fba0068f9fd34b43a565ded01b199506c.zip
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
Diffstat (limited to 'src/libcoretest')
-rw-r--r--src/libcoretest/slice.rs49
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!([(),(),()]);
+}