Skip to content
Browse files

Add vec::each, vec::eachi, and list::each

For use with the new for construct.

Issue #1619
  • Loading branch information...
1 parent 064f82d commit eec6383771de00bce75b0141e530d10ce5c1ac88 @marijnh marijnh committed Mar 27, 2012
Showing with 49 additions and 1 deletion.
  1. +29 −1 src/libcore/vec.rs
  2. +20 −0 src/libstd/list.rs
View
30 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;
@@ -787,6 +787,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
# Failure
View
20 src/libstd/list.rs
@@ -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 {

0 comments on commit eec6383

Please sign in to comment.
Something went wrong with that request. Please try again.