about summary refs log tree commit diff
diff options
context:
space:
mode:
authorgifnksm <makoto.nksm+github@gmail.com>2013-05-12 07:56:08 +0900
committergifnksm <makoto.nksm+github@gmail.com>2013-05-12 08:06:31 +0900
commit82f963e347fa16ac3824e81c53f5d15155fe319b (patch)
treeac37842eaa85aafa4b1dc0ce77a77201206486aa
parent8ca64a423bea5dd9f4149fe343f7cec87e25316c (diff)
downloadrust-82f963e347fa16ac3824e81c53f5d15155fe319b.tar.gz
rust-82f963e347fa16ac3824e81c53f5d15155fe319b.zip
libcore: Change `each_val` to follow new for-loop protocol
-rw-r--r--src/libcore/old_iter.rs2
-rw-r--r--src/libcore/vec.rs25
2 files changed, 20 insertions, 7 deletions
diff --git a/src/libcore/old_iter.rs b/src/libcore/old_iter.rs
index 8e31bbfd878..a596b07dc78 100644
--- a/src/libcore/old_iter.rs
+++ b/src/libcore/old_iter.rs
@@ -93,7 +93,7 @@ pub trait CopyableNonstrictIter<A:Copy> {
     // Like "each", but copies out the value. If the receiver is mutated while
     // iterating over it, the semantics must not be memory-unsafe but are
     // otherwise undefined.
-    fn each_val(&const self, f: &fn(A) -> bool);
+    fn each_val(&const self, f: &fn(A) -> bool) -> bool;
 }
 
 // A trait for sequences that can be built by imperatively pushing elements
diff --git a/src/libcore/vec.rs b/src/libcore/vec.rs
index 741644af4aa..604f0297b64 100644
--- a/src/libcore/vec.rs
+++ b/src/libcore/vec.rs
@@ -2945,34 +2945,37 @@ impl<A:Copy + Ord> old_iter::CopyableOrderedIter<A> for @[A] {
 }
 
 impl<'self,A:Copy> old_iter::CopyableNonstrictIter<A> for &'self [A] {
-    fn each_val(&const self, f: &fn(A) -> bool) {
+    fn each_val(&const self, f: &fn(A) -> bool) -> bool {
         let mut i = 0;
         while i < self.len() {
-            if !f(copy self[i]) { break; }
+            if !f(copy self[i]) { return false; }
             i += 1;
         }
+        return true;
     }
 }
 
 // FIXME(#4148): This should be redundant
 impl<A:Copy> old_iter::CopyableNonstrictIter<A> for ~[A] {
-    fn each_val(&const self, f: &fn(A) -> bool) {
+    fn each_val(&const self, f: &fn(A) -> bool) -> bool {
         let mut i = 0;
         while i < uniq_len(self) {
-            if !f(copy self[i]) { break; }
+            if !f(copy self[i]) { return false; }
             i += 1;
         }
+        return true;
     }
 }
 
 // FIXME(#4148): This should be redundant
 impl<A:Copy> old_iter::CopyableNonstrictIter<A> for @[A] {
-    fn each_val(&const self, f: &fn(A) -> bool) {
+    fn each_val(&const self, f: &fn(A) -> bool) -> bool {
         let mut i = 0;
         while i < self.len() {
-            if !f(copy self[i]) { break; }
+            if !f(copy self[i]) { return false; }
             i += 1;
         }
+        return true;
     }
 }
 
@@ -4688,4 +4691,14 @@ mod tests {
             i += 1;
         }
     }
+
+    #[test]
+    fn test_each_val() {
+        use old_iter::CopyableNonstrictIter;
+        let mut i = 0;
+        for [1, 2, 3].each_val |v| {
+            i += v;
+        }
+        assert!(i == 6);
+    }
 }