about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMarijn Haverbeke <marijnh@gmail.com>2011-10-31 14:52:08 +0100
committerMarijn Haverbeke <marijnh@gmail.com>2011-10-31 14:52:08 +0100
commitb0d60a7108bf022f743501b7b2e127fbae695260 (patch)
tree1a291325e1405a716f4cf64d91ae6c45bf8cdcf8
parent7080ac15fb13c472985da692ca92c4a48b1f5575 (diff)
downloadrust-b0d60a7108bf022f743501b7b2e127fbae695260.tar.gz
rust-b0d60a7108bf022f743501b7b2e127fbae695260.zip
Add a way to iterate over a str's chars to std::str
-rw-r--r--src/lib/str.rs17
-rw-r--r--src/test/stdtest/str.rs13
2 files changed, 29 insertions, 1 deletions
diff --git a/src/lib/str.rs b/src/lib/str.rs
index 29ee1b9340f..74f85bf394a 100644
--- a/src/lib/str.rs
+++ b/src/lib/str.rs
@@ -11,7 +11,7 @@ export eq, lteq, hash, is_empty, is_not_empty, is_whitespace, byte_len, index,
        to_chars, char_len, char_at, bytes, is_ascii, shift_byte, pop_byte,
        unsafe_from_byte, unsafe_from_bytes, from_char, char_range_at,
        str_from_cstr, sbuf, as_buf, push_byte, utf8_char_width, safe_slice,
-       contains;
+       contains, chars;
 
 native "c-stack-cdecl" mod rustrt {
     fn rust_str_push(&s: str, ch: u8);
@@ -300,6 +300,21 @@ Pluck a character out of a string
 fn char_at(s: str, i: uint) -> char { ret char_range_at(s, i).ch; }
 
 /*
+Function: chars
+
+Iterate over the characters in a string
+*/
+
+fn chars(s: str, it: block(char)) {
+    let pos = 0u, len = byte_len(s);
+    while (pos < len) {
+        let {ch, next} = char_range_at(s, pos);
+        pos = next;
+        it(ch);
+    }
+}
+
+/*
 Function: char_len
 
 Count the number of unicode characters in a string
diff --git a/src/test/stdtest/str.rs b/src/test/stdtest/str.rs
index 470c8daee5e..c4923d5d2c3 100644
--- a/src/test/stdtest/str.rs
+++ b/src/test/stdtest/str.rs
@@ -315,3 +315,16 @@ fn contains() {
     assert !str::contains("abcde", "def");
     assert !str::contains("", "a");
 }
+
+#[test]
+fn chars() {
+    let i = 0;
+    str::chars("x\u03c0y") {|ch|
+        alt i {
+          0 { assert ch == 'x'; }
+          1 { assert ch == '\u03c0'; }
+          2 { assert ch == 'y'; }
+        }
+        i += 1;
+    }
+}