Skip to content

Commit

Permalink
Add vec::each, vec::eachi, and list::each
Browse files Browse the repository at this point in the history
For use with the new for construct.

Issue rust-lang#1619
  • Loading branch information
marijnh committed Mar 27, 2012
1 parent 064f82d commit eec6383
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 1 deletion.
30 changes: 29 additions & 1 deletion src/libcore/vec.rs
Expand Up @@ -61,7 +61,7 @@ export zip;
export swap;
export reverse;
export reversed;
export iter;
export iter, each, eachi;
export iter2;
export iteri;
export riter;
Expand Down Expand Up @@ -786,6 +786,34 @@ fn iter_between<T>(v: [const T], start: uint, end: uint, f: fn(T)) {
}
}

#[doc = "
Iterates over a vector, with option to break
"]
#[inline(always)]
fn each<T>(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<T>(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
Expand Down
20 changes: 20 additions & 0 deletions src/libstd/list.rs
Expand Up @@ -125,6 +125,26 @@ fn iter<T>(l: list<T>, f: fn(T)) {
}
}

#[doc = "Iterate over a list"]
fn each<T>(l: list<T>, 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 {

Expand Down

0 comments on commit eec6383

Please sign in to comment.