From 001397da3ced1065b254a0e87ae071e17d0b16ba Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Mon, 4 Jul 2011 23:52:47 -0700 Subject: [PATCH] stdlib: Add ivec::any() and ivec::all(); put out burning tinderbox --- src/lib/ivec.rs | 10 ++++++++++ src/test/run-pass/lib-ivec.rs | 21 +++++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/lib/ivec.rs b/src/lib/ivec.rs index 676bb65841a8..fcc5667cdb30 100644 --- a/src/lib/ivec.rs +++ b/src/lib/ivec.rs @@ -171,6 +171,16 @@ fn map[T,U](fn(&T)->U f, &mutable T[mutable?] v) -> U[] { ret result; } +fn any[T](fn(&T)->bool f, &T[] v) -> bool { + for (T elem in v) { if (f(elem)) { ret true; } } + ret false; +} + +fn all[T](fn(&T)->bool f, &T[] v) -> bool { + for (T elem in v) { if (!f(elem)) { ret false; } } + ret true; +} + mod unsafe { fn copy_from_buf[T](&mutable T[] v, *T ptr, uint count) { diff --git a/src/test/run-pass/lib-ivec.rs b/src/test/run-pass/lib-ivec.rs index 19d5308471d2..3653ffb4db55 100644 --- a/src/test/run-pass/lib-ivec.rs +++ b/src/test/run-pass/lib-ivec.rs @@ -7,6 +7,10 @@ import std::option::some; fn square(uint n) -> uint { ret n * n; } +fn square_alias(&uint n) -> uint { ret n * n; } + +pred is_three(&uint n) -> bool { ret n == 3u; } + fn test_reserve_and_on_heap() { let int[] v = ~[ 1, 2 ]; assert (!ivec::on_heap(v)); @@ -167,7 +171,7 @@ fn test_grow_set() { fn test_map() { // Test on-stack map. auto v = ~[ 1u, 2u, 3u ]; - auto w = ivec::map(square, v); + auto w = ivec::map(square_alias, v); assert (ivec::len(w) == 3u); assert (w.(0) == 1u); assert (w.(1) == 4u); @@ -175,7 +179,7 @@ fn test_map() { // Test on-heap map. v = ~[ 1u, 2u, 3u, 4u, 5u ]; - w = ivec::map(square, v); + w = ivec::map(square_alias, v); assert (ivec::len(w) == 5u); assert (w.(0) == 1u); assert (w.(1) == 4u); @@ -184,6 +188,18 @@ fn test_map() { assert (w.(4) == 25u); } +fn test_any_and_all() { + assert (ivec::any(is_three, ~[ 1u, 2u, 3u ])); + assert (!ivec::any(is_three, ~[ 0u, 1u, 2u ])); + assert (ivec::any(is_three, ~[ 1u, 2u, 3u, 4u, 5u ])); + assert (!ivec::any(is_three, ~[ 1u, 2u, 4u, 5u, 6u ])); + + assert (ivec::all(is_three, ~[ 3u, 3u, 3u ])); + assert (!ivec::all(is_three, ~[ 3u, 3u, 2u ])); + assert (ivec::all(is_three, ~[ 3u, 3u, 3u, 3u, 3u ])); + assert (!ivec::all(is_three, ~[ 3u, 3u, 0u, 1u, 2u ])); +} + fn main() { test_reserve_and_on_heap(); test_unsafe_ptrs(); @@ -204,5 +220,6 @@ fn main() { // Functional utilities test_map(); + test_any_and_all(); }