Skip to content

Commit b5a4fa9

Browse files
committed
Move some code over to iterator-for to see how it performs.
1 parent cbad692 commit b5a4fa9

27 files changed

+194
-180
lines changed

src/libcore/either.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ fn lefts<T: copy, U>(eithers: [either<T, U>]) -> [T] {
2525
#[doc = "Extracts from a vector of either all the left values"];
2626

2727
let mut result: [T] = [];
28-
for elt: either<T, U> in eithers {
28+
for vec::each(eithers) {|elt|
2929
alt elt { left(l) { result += [l]; } _ {/* fallthrough */ } }
3030
}
3131
ret result;
@@ -35,7 +35,7 @@ fn rights<T, U: copy>(eithers: [either<T, U>]) -> [U] {
3535
#[doc = "Extracts from a vector of either all the right values"];
3636

3737
let mut result: [U] = [];
38-
for elt: either<T, U> in eithers {
38+
for vec::each(eithers) {|elt|
3939
alt elt { right(r) { result += [r]; } _ {/* fallthrough */ } }
4040
}
4141
ret result;
@@ -52,7 +52,7 @@ fn partition<T: copy, U: copy>(eithers: [either<T, U>])
5252

5353
let mut lefts: [T] = [];
5454
let mut rights: [U] = [];
55-
for elt: either<T, U> in eithers {
55+
for vec::each(eithers) {|elt|
5656
alt elt { left(l) { lefts += [l]; } right(r) { rights += [r]; } }
5757
}
5858
ret {lefts: lefts, rights: rights};

src/libcore/extfmt.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ mod rt {
429429
ret padstr + s;
430430
}
431431
fn have_flag(flags: [flag], f: flag) -> bool {
432-
for candidate: flag in flags { if candidate == f { ret true; } }
432+
for vec::each(flags) {|candidate| if candidate == f { ret true; } }
433433
ret false;
434434
}
435435
}

src/libcore/io.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ fn mk_file_writer(path: str, flags: [fileflag])
389389
fn wb() -> c_int { O_WRONLY as c_int }
390390

391391
let mut fflags: c_int = wb();
392-
for f: fileflag in flags {
392+
for vec::each(flags) {|f|
393393
alt f {
394394
append { fflags |= O_APPEND as c_int; }
395395
create { fflags |= O_CREAT as c_int; }
@@ -521,7 +521,7 @@ impl of writer for mem_buffer {
521521
fn write(v: [const u8]) {
522522
// Fast path.
523523
if self.pos == vec::len(self.buf) {
524-
for b: u8 in v { self.buf += [mut b]; }
524+
for vec::each(v) {|b| self.buf += [mut b]; }
525525
self.pos += vec::len(v);
526526
ret;
527527
}

src/libcore/os.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ native mod rustrt {
4747

4848
fn env() -> [(str,str)] {
4949
let mut pairs = [];
50-
for p in rustrt::rust_env_pairs() {
50+
for vec::each(rustrt::rust_env_pairs()) {|p|
5151
let vs = str::splitn_char(p, '=', 1u);
5252
assert vec::len(vs) == 2u;
5353
pairs += [(vs[0], vs[1])];
@@ -464,7 +464,7 @@ fn list_dir(p: path) -> [str] {
464464
p += path::path_sep();
465465
}
466466
let mut full_paths: [str] = [];
467-
for filename: str in rustrt::rust_list_files(p + star()) {
467+
for vec::each(rustrt::rust_list_files(p + star())) {|filename|
468468
if !str::eq(filename, ".") {
469469
if !str::eq(filename, "..") {
470470
full_paths += [p + filename];
@@ -645,7 +645,8 @@ mod tests {
645645
fn test_env_getenv() {
646646
let e = env();
647647
assert vec::len(e) > 0u;
648-
for (n, v) in e {
648+
for vec::each(e) {|p|
649+
let (n, v) = p;
649650
log(debug, n);
650651
let v2 = getenv(n);
651652
// MingW seems to set some funky environment variables like
@@ -734,7 +735,7 @@ mod tests {
734735
// Just assuming that we've got some contents in the current directory
735736
assert (vec::len(dirs) > 0u);
736737

737-
for dir in dirs { log(debug, dir); }
738+
for vec::each(dirs) {|dir| log(debug, dir); }
738739
}
739740

740741
#[test]

src/libcore/result.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ checking for overflow:
139139
fn map<T,U:copy,V:copy>(ts: [T], op: fn(T) -> result<V,U>) -> result<[V],U> {
140140
let mut vs: [V] = [];
141141
vec::reserve(vs, vec::len(ts));
142-
for t in ts {
142+
for vec::each(ts) {|t|
143143
alt op(t) {
144144
ok(v) { vs += [v]; }
145145
err(u) { ret err(u); }

src/libcore/run.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ fn with_argv<T>(prog: str, args: [str],
8181
cb: fn(**libc::c_char) -> T) -> T unsafe {
8282
let mut argptrs = str::as_c_str(prog) {|b| [b] };
8383
let mut tmps = [];
84-
for arg in args {
84+
for vec::each(args) {|arg|
8585
let t = @arg;
8686
tmps += [t];
8787
argptrs += str::as_c_str(*t) {|b| [b] };
@@ -102,7 +102,8 @@ fn with_envp<T>(env: option<[(str,str)]>,
102102
let mut tmps = [];
103103
let mut ptrs = [];
104104

105-
for (k,v) in es {
105+
for vec::each(es) {|e|
106+
let (k,v) = e;
106107
let t = @(#fmt("%s=%s", k, v));
107108
vec::push(tmps, t);
108109
ptrs += str::as_c_str(*t) {|b| [b]};
@@ -125,7 +126,8 @@ fn with_envp<T>(env: option<[(str,str)]>,
125126
alt env {
126127
some (es) {
127128
let mut blk : [u8] = [];
128-
for (k,v) in es {
129+
for vec::each(es) {|e|
130+
let (k,v) = e;
129131
let t = #fmt("%s=%s", k, v);
130132
let mut v : [u8] = ::unsafe::reinterpret_cast(t);
131133
blk += v;

src/libcore/str.rs

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ export
5555
all, any,
5656
all_between, any_between,
5757
map,
58+
each,
5859
bytes_iter,
5960
chars_iter,
6061
split_char_iter,
@@ -176,14 +177,14 @@ fn from_char(ch: char) -> str {
176177
fn from_chars(chs: [char]) -> str {
177178
let mut buf = "";
178179
reserve(buf, chs.len());
179-
for ch in chs { push_char(buf, ch); }
180+
for vec::each(chs) {|ch| push_char(buf, ch); }
180181
ret buf;
181182
}
182183

183184
#[doc = "Concatenate a vector of strings"]
184185
fn concat(v: [str]) -> str {
185186
let mut s: str = "";
186-
for ss: str in v { s += ss; }
187+
for vec::each(v) {|ss| s += ss; }
187188
ret s;
188189
}
189190

@@ -192,7 +193,7 @@ Concatenate a vector of strings, placing a given separator between each
192193
"]
193194
fn connect(v: [str], sep: str) -> str {
194195
let mut s = "", first = true;
195-
for ss: str in v {
196+
for vec::each(v) {|ss|
196197
if first { first = false; } else { s += sep; }
197198
s += ss;
198199
}
@@ -538,7 +539,7 @@ fn hash(&&s: str) -> uint {
538539
// djb hash.
539540
// FIXME: replace with murmur.
540541
let mut u: uint = 5381u;
541-
for c: u8 in s { u *= 33u; u += c as uint; }
542+
for each(s) {|c| u *= 33u; u += c as uint; }
542543
ret u;
543544
}
544545

@@ -581,6 +582,16 @@ fn bytes_iter(ss: str, it: fn(u8)) {
581582
}
582583
}
583584

585+
#[doc = "Iterate over the bytes in a string"]
586+
#[inline(always)]
587+
fn each(s: str, it: fn(u8) -> bool) {
588+
let mut i = 0u, l = len(s);
589+
while (i < l) {
590+
if !it(s[i]) { break; }
591+
i += 1u;
592+
}
593+
}
594+
584595
#[doc = "Iterate over the characters in a string"]
585596
fn chars_iter(s: str, it: fn(char)) {
586597
let mut pos = 0u;
@@ -938,7 +949,7 @@ fn rfind_between(s: str, start: uint, end: uint, f: fn(char) -> bool)
938949
// Utility used by various searching functions
939950
fn match_at(haystack: str, needle: str, at: uint) -> bool {
940951
let mut i = at;
941-
for c in needle { if haystack[i] != c { ret false; } i += 1u; }
952+
for each(needle) {|c| if haystack[i] != c { ret false; } i += 1u; }
942953
ret true;
943954
}
944955

@@ -1074,7 +1085,7 @@ fn is_ascii(s: str) -> bool {
10741085
}
10751086

10761087
#[doc = "Returns true if the string has length 0"]
1077-
pure fn is_empty(s: str) -> bool { for c: u8 in s { ret false; } ret true; }
1088+
pure fn is_empty(s: str) -> bool { len(s) == 0u }
10781089

10791090
#[doc = "Returns true if the string has length greater than 0"]
10801091
pure fn is_not_empty(s: str) -> bool { !is_empty(s) }
@@ -1588,7 +1599,7 @@ mod unsafe {
15881599

15891600
#[doc = "Appends a vector of bytes to a string. (Not UTF-8 safe)."]
15901601
unsafe fn push_bytes(&s: str, bytes: [u8]) {
1591-
for byte in bytes { rustrt::rust_str_push(s, byte); }
1602+
for vec::each(bytes) {|byte| rustrt::rust_str_push(s, byte); }
15921603
}
15931604

15941605
#[doc = "
@@ -2472,7 +2483,8 @@ mod tests {
24722483
0xd801_u16, 0xdc95_u16, 0xd801_u16, 0xdc86_u16,
24732484
0x000a_u16 ]) ];
24742485

2475-
for (s, u) in pairs {
2486+
for vec::each(pairs) {|p|
2487+
let (s, u) = p;
24762488
assert to_utf16(s) == u;
24772489
assert from_utf16(u) == s;
24782490
assert from_utf16(to_utf16(s)) == s;

src/libcore/to_str.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ impl <A: to_str copy, B: to_str copy, C: to_str copy> of to_str for (A, B, C){
3838
impl <A: to_str> of to_str for [A] {
3939
fn to_str() -> str {
4040
let mut acc = "[", first = true;
41-
for elt in self {
41+
for vec::each(self) {|elt|
4242
if first { first = false; }
4343
else { acc += ", "; }
4444
acc += elt.to_str();

src/libcore/vec.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ Apply a function to each element of a vector and return the results
410410
fn map<T, U>(v: [T], f: fn(T) -> U) -> [U] {
411411
let mut result = [];
412412
reserve(result, len(v));
413-
for elem: T in v { result += [f(elem)]; }
413+
for each(v) {|elem| result += [f(elem)]; }
414414
ret result;
415415
}
416416

@@ -420,7 +420,7 @@ of each result vector
420420
"]
421421
fn flat_map<T, U>(v: [T], f: fn(T) -> [U]) -> [U] {
422422
let mut result = [];
423-
for elem: T in v { result += f(elem); }
423+
for each(v) {|elem| result += f(elem); }
424424
ret result;
425425
}
426426

@@ -446,7 +446,7 @@ the resulting vector.
446446
fn filter_map<T, U: copy>(v: [T], f: fn(T) -> option<U>)
447447
-> [U] {
448448
let mut result = [];
449-
for elem: T in v {
449+
for each(v) {|elem|
450450
alt f(elem) {
451451
none {/* no-op */ }
452452
some(result_elem) { result += [result_elem]; }
@@ -464,7 +464,7 @@ only those elements for which `f` returned true.
464464
"]
465465
fn filter<T: copy>(v: [T], f: fn(T) -> bool) -> [T] {
466466
let mut result = [];
467-
for elem: T in v {
467+
for each(v) {|elem|
468468
if f(elem) { result += [elem]; }
469469
}
470470
ret result;
@@ -477,7 +477,7 @@ Flattens a vector of vectors of T into a single vector of T.
477477
"]
478478
fn concat<T: copy>(v: [const [const T]]) -> [T] {
479479
let mut r = [];
480-
for inner in v { r += from_const(inner); }
480+
for each(v) {|inner| r += from_const(inner); }
481481
ret r;
482482
}
483483

@@ -487,7 +487,7 @@ Concatenate a vector of vectors, placing a given separator between each
487487
fn connect<T: copy>(v: [const [const T]], sep: T) -> [T] {
488488
let mut r: [T] = [];
489489
let mut first = true;
490-
for inner in v {
490+
for each(v) {|inner|
491491
if first { first = false; } else { push(r, sep); }
492492
r += from_const(inner);
493493
}
@@ -518,7 +518,7 @@ Return true if a predicate matches any elements
518518
If the vector contains no elements then false is returned.
519519
"]
520520
fn any<T>(v: [T], f: fn(T) -> bool) -> bool {
521-
for elem: T in v { if f(elem) { ret true; } }
521+
for each(v) {|elem| if f(elem) { ret true; } }
522522
ret false;
523523
}
524524

@@ -544,7 +544,7 @@ Return true if a predicate matches all elements
544544
If the vector contains no elements then true is returned.
545545
"]
546546
fn all<T>(v: [T], f: fn(T) -> bool) -> bool {
547-
for elem: T in v { if !f(elem) { ret false; } }
547+
for each(v) {|elem| if !f(elem) { ret false; } }
548548
ret true;
549549
}
550550

@@ -563,14 +563,14 @@ fn all2<T, U>(v0: [const T], v1: [const U], f: fn(T, U) -> bool) -> bool {
563563

564564
#[doc = "Return true if a vector contains an element with the given value"]
565565
fn contains<T>(v: [const T], x: T) -> bool {
566-
for elt: T in v { if x == elt { ret true; } }
566+
for each(v) {|elt| if x == elt { ret true; } }
567567
ret false;
568568
}
569569

570570
#[doc = "Returns the number of elements that are equal to a given value"]
571571
fn count<T>(v: [const T], x: T) -> uint {
572572
let mut cnt = 0u;
573-
for elt: T in v { if x == elt { cnt += 1u; } }
573+
for each(v) {|elt| if x == elt { cnt += 1u; } }
574574
ret cnt;
575575
}
576576

@@ -701,7 +701,7 @@ of the i-th tuple of the input vector.
701701
"]
702702
fn unzip<T: copy, U: copy>(v: [const (T, U)]) -> ([T], [U]) {
703703
let mut as = [], bs = [];
704-
for (a, b) in v { as += [a]; bs += [b]; }
704+
for each(v) {|p| let (a, b) = p; as += [a]; bs += [b]; }
705705
ret (as, bs);
706706
}
707707

@@ -807,7 +807,7 @@ Iterates over a vector's elements and indices
807807
fn eachi<T>(v: [const T], f: fn(uint, T) -> bool) unsafe {
808808
let mut i = 0u, l = len(v);
809809
let mut p = ptr::offset(unsafe::to_ptr(v), 0u);
810-
while i > l {
810+
while i < l {
811811
if !f(i, *p) { break; }
812812
p = ptr::offset(p, 1u);
813813
i += 1u;

src/libstd/bitv.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,14 +173,14 @@ fn set(v: bitv, i: uint, x: bool) {
173173

174174
#[doc = "Returns true if all bits are 1"]
175175
fn is_true(v: bitv) -> bool {
176-
for i: uint in to_vec(v) { if i != 1u { ret false; } }
176+
for each(v) {|i| if !i { ret false; } }
177177
ret true;
178178
}
179179

180180

181181
#[doc = "Returns true if all bits are 0"]
182182
fn is_false(v: bitv) -> bool {
183-
for i: uint in to_vec(v) { if i == 1u { ret false; } }
183+
for each(v) {|i| if i { ret false; } }
184184
ret true;
185185
}
186186

@@ -198,6 +198,12 @@ fn to_vec(v: bitv) -> [uint] {
198198
ret vec::from_fn::<uint>(v.nbits, sub);
199199
}
200200

201+
fn each(v: bitv, f: fn(bool) -> bool) {
202+
let mut i = 0u;
203+
while i < v.nbits {
204+
if !f(get(v, i)) { break; }
205+
}
206+
}
201207

202208
#[doc = "
203209
Converts the bitvector to a string.
@@ -207,7 +213,7 @@ is either '0' or '1'.
207213
"]
208214
fn to_str(v: bitv) -> str {
209215
let mut rs = "";
210-
for i: uint in to_vec(v) { if i == 1u { rs += "1"; } else { rs += "0"; } }
216+
for each(v) {|i| if i { rs += "1"; } else { rs += "0"; } }
211217
ret rs;
212218
}
213219

0 commit comments

Comments
 (0)