diff --git a/src/libcore/core.rs b/src/libcore/core.rs index 4c175490b418..4738574fdb47 100644 --- a/src/libcore/core.rs +++ b/src/libcore/core.rs @@ -10,22 +10,22 @@ import str::{extensions, str_slice, unique_str}; import vec::extensions; import vec::{const_vector, copyable_vector, immutable_vector}; import vec::{immutable_copyable_vector, iter_trait_extensions, vec_concat}; -import iter::{base_iter, extended_iter, copyable_iter, times}; +import iter::{base_iter, extended_iter, copyable_iter, times, timesi}; import option::extensions; import option_iter::extensions; import ptr::{extensions, ptr}; import rand::extensions; import result::extensions; -import int::{num, times}; -import i8::{num, times}; -import i16::{num, times}; -import i32::{num, times}; -import i64::{num, times}; -import uint::{num, times}; -import u8::{num, times}; -import u16::{num, times}; -import u32::{num, times}; -import u64::{num, times}; +import int::{num, times, timesi}; +import i8::{num, times, timesi}; +import i16::{num, times, timesi}; +import i32::{num, times, timesi}; +import i64::{num, times, timesi}; +import uint::{num, times, timesi}; +import u8::{num, times, timesi}; +import u16::{num, times, timesi}; +import u32::{num, times, timesi}; +import u64::{num, times, timesi}; import float::num; import f32::num; import f64::num; @@ -34,7 +34,7 @@ import num::num; export path, option, some, none, unreachable; export extensions; // The following exports are the extension impls for numeric types -export num, times; +export num, times, timesi; // The following exports are the common traits export str_slice, unique_str; export const_vector, copyable_vector, immutable_vector; diff --git a/src/libcore/int-template.rs b/src/libcore/int-template.rs index d9fb3dae846a..9986b22669d0 100644 --- a/src/libcore/int-template.rs +++ b/src/libcore/int-template.rs @@ -11,7 +11,7 @@ export range; export compl; export abs; export parse_buf, from_str, to_str, to_str_bytes, str; -export num, ord, eq, times; +export num, ord, eq, times, timesi; const min_value: T = -1 as T << (inst::bits - 1 as T); const max_value: T = min_value - 1 as T; @@ -155,6 +155,23 @@ impl times of iter::times for T { } } +impl timesi of iter::timesi for T { + #[inline(always)] + /// Like `times`, but provides an index + fn timesi(it: fn(uint) -> bool) { + let slf = self as uint; + if slf < 0u { + fail #fmt("The .timesi method expects a nonnegative number, \ + but found %?", self); + } + let mut i = 0u; + while i < slf { + if !it(i) { break } + i += 1u; + } + } +} + // FIXME: Has alignment issues on windows and 32-bit linux (#2609) #[test] #[ignore] diff --git a/src/libcore/iter.rs b/src/libcore/iter.rs index 2e0c778cd5a4..e4e57b7ec78f 100644 --- a/src/libcore/iter.rs +++ b/src/libcore/iter.rs @@ -16,6 +16,9 @@ trait extended_iter { iface times { fn times(it: fn() -> bool); } +iface timesi{ + fn timesi(it: fn(uint) -> bool); +} trait copyable_iter { fn filter_to_vec(pred: fn(A) -> bool) -> ~[A]; diff --git a/src/libcore/uint-template.rs b/src/libcore/uint-template.rs index 4f35f1a8756e..e3b4f08ddaa8 100644 --- a/src/libcore/uint-template.rs +++ b/src/libcore/uint-template.rs @@ -11,7 +11,7 @@ export range; export compl; export to_str, to_str_bytes; export from_str, from_str_radix, str, parse_buf; -export num, ord, eq, times; +export num, ord, eq, times, timesi; const min_value: T = 0 as T; const max_value: T = 0 as T - 1 as T; @@ -120,6 +120,19 @@ impl times of iter::times for T { } } +impl timesi of iter::timesi for T { + #[inline(always)] + /// Like `times`, but with an index, `eachi`-style. + fn timesi(it: fn(uint) -> bool) { + let slf = self as uint; + let mut i = 0u; + while i < slf { + if !it(i) { break } + i += 1u; + } + } +} + /// Parse a string to an int fn from_str(s: ~str) -> option { parse_buf(str::bytes(s), 10u) }