Skip to content

Commit 1c47256

Browse files
committed
Add 5.timesi() |idx| { ... }
1 parent a57686d commit 1c47256

File tree

4 files changed

+47
-14
lines changed

4 files changed

+47
-14
lines changed

src/libcore/core.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,22 @@ import str::{extensions, str_slice, unique_str};
1010
import vec::extensions;
1111
import vec::{const_vector, copyable_vector, immutable_vector};
1212
import vec::{immutable_copyable_vector, iter_trait_extensions, vec_concat};
13-
import iter::{base_iter, extended_iter, copyable_iter, times};
13+
import iter::{base_iter, extended_iter, copyable_iter, times, timesi};
1414
import option::extensions;
1515
import option_iter::extensions;
1616
import ptr::{extensions, ptr};
1717
import rand::extensions;
1818
import result::extensions;
19-
import int::{num, times};
20-
import i8::{num, times};
21-
import i16::{num, times};
22-
import i32::{num, times};
23-
import i64::{num, times};
24-
import uint::{num, times};
25-
import u8::{num, times};
26-
import u16::{num, times};
27-
import u32::{num, times};
28-
import u64::{num, times};
19+
import int::{num, times, timesi};
20+
import i8::{num, times, timesi};
21+
import i16::{num, times, timesi};
22+
import i32::{num, times, timesi};
23+
import i64::{num, times, timesi};
24+
import uint::{num, times, timesi};
25+
import u8::{num, times, timesi};
26+
import u16::{num, times, timesi};
27+
import u32::{num, times, timesi};
28+
import u64::{num, times, timesi};
2929
import float::num;
3030
import f32::num;
3131
import f64::num;
@@ -34,7 +34,7 @@ import num::num;
3434
export path, option, some, none, unreachable;
3535
export extensions;
3636
// The following exports are the extension impls for numeric types
37-
export num, times;
37+
export num, times, timesi;
3838
// The following exports are the common traits
3939
export str_slice, unique_str;
4040
export const_vector, copyable_vector, immutable_vector;

src/libcore/int-template.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export range;
1111
export compl;
1212
export abs;
1313
export parse_buf, from_str, to_str, to_str_bytes, str;
14-
export num, ord, eq, times;
14+
export num, ord, eq, times, timesi;
1515

1616
const min_value: T = -1 as T << (inst::bits - 1 as T);
1717
const max_value: T = min_value - 1 as T;
@@ -155,6 +155,23 @@ impl times of iter::times for T {
155155
}
156156
}
157157

158+
impl timesi of iter::timesi for T {
159+
#[inline(always)]
160+
/// Like `times`, but provides an index
161+
fn timesi(it: fn(uint) -> bool) {
162+
let slf = self as uint;
163+
if slf < 0u {
164+
fail #fmt("The .timesi method expects a nonnegative number, \
165+
but found %?", self);
166+
}
167+
let mut i = 0u;
168+
while i < slf {
169+
if !it(i) { break }
170+
i += 1u;
171+
}
172+
}
173+
}
174+
158175
// FIXME: Has alignment issues on windows and 32-bit linux (#2609)
159176
#[test]
160177
#[ignore]

src/libcore/iter.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ trait extended_iter<A> {
1616
iface times {
1717
fn times(it: fn() -> bool);
1818
}
19+
iface timesi{
20+
fn timesi(it: fn(uint) -> bool);
21+
}
1922

2023
trait copyable_iter<A:copy> {
2124
fn filter_to_vec(pred: fn(A) -> bool) -> ~[A];

src/libcore/uint-template.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export range;
1111
export compl;
1212
export to_str, to_str_bytes;
1313
export from_str, from_str_radix, str, parse_buf;
14-
export num, ord, eq, times;
14+
export num, ord, eq, times, timesi;
1515

1616
const min_value: T = 0 as T;
1717
const max_value: T = 0 as T - 1 as T;
@@ -120,6 +120,19 @@ impl times of iter::times for T {
120120
}
121121
}
122122

123+
impl timesi of iter::timesi for T {
124+
#[inline(always)]
125+
/// Like `times`, but with an index, `eachi`-style.
126+
fn timesi(it: fn(uint) -> bool) {
127+
let slf = self as uint;
128+
let mut i = 0u;
129+
while i < slf {
130+
if !it(i) { break }
131+
i += 1u;
132+
}
133+
}
134+
}
135+
123136
/// Parse a string to an int
124137
fn from_str(s: ~str) -> option<T> { parse_buf(str::bytes(s), 10u) }
125138

0 commit comments

Comments
 (0)