From 7a7940daca560d4471f5afa901579e1bd65dcaa6 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Thu, 27 Oct 2011 21:09:02 -0700 Subject: [PATCH] Add reverse iterators to std::vec --- src/lib/vec.rs | 29 +++++++++++++++++++++++++++++ src/test/stdtest/vec.rs | 28 ++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) 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 @@ -663,6 +663,35 @@ fn iter2(v: [mutable? T], f: block(uint, T)) { for x in v { f(i, x); i += 1u; } } +/* +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(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(v: [mutable? T], f: block(uint, T)) { + let i = len(v); + while 0u < i { + i -= 1u; + f(i, v[i]); + }; +} + /* Function: to_ptr 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 @@ -316,6 +316,34 @@ fn iter_nonempty() { assert i == 6; } +#[test] +fn riter_empty() { + let i = 0; + vec::riter::([], { |_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]));