about summary refs log tree commit diff
path: root/src/libcoretest
diff options
context:
space:
mode:
authorHuon Wilson <dbau.pp+github@gmail.com>2014-11-15 14:44:55 +1100
committerHuon Wilson <dbau.pp+github@gmail.com>2014-11-25 17:10:32 +1100
commitb86a7808c74fa0da1f1fcb9b7df760314f9e4104 (patch)
tree40bc88044c4b03681b4c67d2b4373e0649e8c95f /src/libcoretest
parentbb2168c5252adeda1dd35ccf7050df89655233d7 (diff)
downloadrust-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.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!([(),(),()]);
+}