diff options
| author | Paul Stansifer <paul.stansifer@gmail.com> | 2012-07-20 15:33:18 -0700 |
|---|---|---|
| committer | Paul Stansifer <paul.stansifer@gmail.com> | 2012-07-24 11:44:58 -0700 |
| commit | 1c472564e37567dda820062cfd117115113b9def (patch) | |
| tree | 06f475b12e937ab09febd74a27361da02ec8b87d /src/libcore | |
| parent | a57686d46d1fbdb3a8c6aec6761ff4791e6a9526 (diff) | |
Add `5.timesi() |idx| { ... }`
Diffstat (limited to 'src/libcore')
| -rw-r--r-- | src/libcore/core.rs | 24 | ||||
| -rw-r--r-- | src/libcore/int-template.rs | 19 | ||||
| -rw-r--r-- | src/libcore/iter.rs | 3 | ||||
| -rw-r--r-- | src/libcore/uint-template.rs | 15 |
4 files changed, 47 insertions, 14 deletions
diff --git a/src/libcore/core.rs b/src/libcore/core.rs index 4c175490b41..4738574fdb4 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 d9fb3dae846..9986b22669d 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 2e0c778cd5a..e4e57b7ec78 100644 --- a/src/libcore/iter.rs +++ b/src/libcore/iter.rs @@ -16,6 +16,9 @@ trait extended_iter<A> { iface times { fn times(it: fn() -> bool); } +iface timesi{ + fn timesi(it: fn(uint) -> bool); +} trait copyable_iter<A:copy> { fn filter_to_vec(pred: fn(A) -> bool) -> ~[A]; diff --git a/src/libcore/uint-template.rs b/src/libcore/uint-template.rs index 4f35f1a8756..e3b4f08ddaa 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<T> { parse_buf(str::bytes(s), 10u) } |
