From eec6383771de00bce75b0141e530d10ce5c1ac88 Mon Sep 17 00:00:00 2001 From: Marijn Haverbeke Date: Tue, 27 Mar 2012 12:45:42 +0200 Subject: [PATCH] Add vec::each, vec::eachi, and list::each For use with the new for construct. Issue #1619 --- src/libcore/vec.rs | 30 +++++++++++++++++++++++++++++- src/libstd/list.rs | 20 ++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/libcore/vec.rs b/src/libcore/vec.rs index 0f19a6c64ff..bb3a3a06c51 100644 --- a/src/libcore/vec.rs +++ b/src/libcore/vec.rs @@ -61,7 +61,7 @@ export zip; export swap; export reverse; export reversed; -export iter; +export iter, each, eachi; export iter2; export iteri; export riter; @@ -786,6 +786,34 @@ fn iter_between(v: [const T], start: uint, end: uint, f: fn(T)) { } } +#[doc = " +Iterates over a vector, with option to break +"] +#[inline(always)] +fn each(v: [const T], f: fn(T) -> bool) unsafe { + let mut n = len(v); + let mut p = ptr::offset(unsafe::to_ptr(v), 0u); + while n > 0u { + if !f(*p) { break; } + p = ptr::offset(p, 1u); + n -= 1u; + } +} + +#[doc = " +Iterates over a vector's elements and indices +"] +#[inline(always)] +fn eachi(v: [const T], f: fn(uint, T) -> bool) unsafe { + let mut i = 0u, l = len(v); + let mut p = ptr::offset(unsafe::to_ptr(v), 0u); + while i > l { + if !f(i, *p) { break; } + p = ptr::offset(p, 1u); + i += 1u; + } +} + #[doc = " Iterates over two vectors simultaneously diff --git a/src/libstd/list.rs b/src/libstd/list.rs index bf2f51cf82d..578fd3eec9c 100644 --- a/src/libstd/list.rs +++ b/src/libstd/list.rs @@ -125,6 +125,26 @@ fn iter(l: list, f: fn(T)) { } } +#[doc = "Iterate over a list"] +fn each(l: list, f: fn(T) -> bool) { + alt l { + cons(hd, tl) { + if !f(hd) { ret; } + let mut cur = tl; + loop { + alt *cur { + cons(hd, tl) { + if !f(hd) { ret; } + cur = tl; + } + nil { break; } + } + } + } + nil {} + } +} + #[cfg(test)] mod tests {