about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2011-10-27 21:09:02 -0700
committerBrian Anderson <banderson@mozilla.com>2011-10-27 21:09:02 -0700
commit7a7940daca560d4471f5afa901579e1bd65dcaa6 (patch)
tree9acdec7f94be6e8c9dd5468ab25d184f7a8ebdbe
parentf1f0e6c06c9a208bbcbe48292b7a0ee31edbb114 (diff)
downloadrust-7a7940daca560d4471f5afa901579e1bd65dcaa6.tar.gz
rust-7a7940daca560d4471f5afa901579e1bd65dcaa6.zip
Add reverse iterators to std::vec
-rw-r--r--src/lib/vec.rs29
-rw-r--r--src/test/stdtest/vec.rs28
2 files changed, 57 insertions, 0 deletions
diff --git a/src/lib/vec.rs b/src/lib/vec.rs
index b6c47ac5c37..7ef0f525d74 100644
--- a/src/lib/vec.rs
+++ b/src/lib/vec.rs
@@ -664,6 +664,35 @@ fn iter2<T>(v: [mutable? T], f: block(uint, T)) {
 }
 
 /*
+Function: riter
+
+Iterates over a vector in reverse
+
+Iterates over vector `v` and, for each element, calls function `f` with the
+element's value.
+
+*/
+fn riter<T>(v: [mutable? T], f: block(T)) {
+    riter2(v) { |_i, v| f(v) }
+}
+
+/*
+Function: riter2
+
+Iterates over a vector's elements and indexes in reverse
+
+Iterates over vector `v` and, for each element, calls function `f` with the
+element's value and index.
+*/
+fn riter2<T>(v: [mutable? T], f: block(uint, T)) {
+    let i = len(v);
+    while 0u < i {
+        i -= 1u;
+        f(i, v[i]);
+    };
+}
+
+/*
 Function: to_ptr
 
 FIXME: We don't need this wrapper
diff --git a/src/test/stdtest/vec.rs b/src/test/stdtest/vec.rs
index 91220421a85..d281a697cbe 100644
--- a/src/test/stdtest/vec.rs
+++ b/src/test/stdtest/vec.rs
@@ -317,6 +317,34 @@ fn iter_nonempty() {
 }
 
 #[test]
+fn riter_empty() {
+    let i = 0;
+    vec::riter::<int>([], { |_v| i += 1 });
+    assert i == 0;
+}
+
+#[test]
+fn riter_nonempty() {
+    let i = 0;
+    vec::riter([1, 2, 3], { |v|
+        if i == 0 { assert v == 3; }
+        i += v
+                         });
+    assert i == 6;
+}
+
+#[test]
+fn riter2() {
+    let i = 0;
+    vec::riter2([0, 1, 2], { |j, v|
+        if i == 0 { assert v == 2; }
+        assert j == v as uint;
+        i += v;                   
+                          });
+    assert i == 3;
+}
+
+#[test]
 fn test_any_and_all() {
     assert (vec::any(is_three, [1u, 2u, 3u]));
     assert (!vec::any(is_three, [0u, 1u, 2u]));