auto merge of #7015 : huonw/rust/each-fn-kill, r=thestinger

Continuation of #6995/#6999.
This commit is contained in:
bors 2013-06-08 10:25:15 -07:00
commit b8fa9d3be1
79 changed files with 450 additions and 953 deletions

View file

@ -351,10 +351,11 @@ a single large vector of floats. Each task needs the full vector to perform its
# use std::vec;
# use std::uint;
# use std::rand;
# use std::iterator::IteratorUtil;
use extra::arc::ARC;
fn pnorm(nums: &~[float], p: uint) -> float {
(vec::foldl(0.0, *nums, |a,b| a+(*b).pow(p as float) )).pow(1f / (p as float))
nums.iter().fold(0.0, |a,b| a+(*b).pow(p as float) ).pow(1f / (p as float))
}
fn main() {

View file

@ -10,14 +10,9 @@
use core::prelude::*;
use core::comm;
use core::io;
use core::libc::c_int;
use core::os;
use core::run;
use core::str;
use core::task;
use core::vec;
#[cfg(target_os = "win32")]
fn target_env(lib_path: &str, prog: &str) -> ~[(~str,~str)] {
@ -74,4 +69,3 @@ pub fn run(lib_path: &str,
err: str::from_bytes(output.error)
}
}

View file

@ -22,6 +22,7 @@ use procsrv;
use util;
use util::logv;
use core::iterator::IteratorUtil;
use core::io;
use core::os;
use core::str;
@ -780,7 +781,7 @@ fn _arm_exec_compiled_test(config: &config, props: &TestProps,
Some(~""));
let mut exitcode : int = 0;
for str::each_char(exitcode_out) |c| {
for exitcode_out.iter().advance |c| {
if !c.is_digit() { break; }
exitcode = exitcode * 10 + match c {
'0' .. '9' => c as int - ('0' as int),

View file

@ -20,6 +20,7 @@ Do not use ==, !=, <, etc on doubly-linked lists -- it may not terminate.
use core::prelude::*;
use core::iterator::IteratorUtil;
use core::managed;
use core::old_iter;
use core::vec;
@ -110,7 +111,7 @@ pub fn from_elem<T>(data: T) -> @mut DList<T> {
/// Creates a new dlist from a vector of elements, maintaining the same order
pub fn from_vec<T:Copy>(vec: &[T]) -> @mut DList<T> {
do vec::foldl(DList(), vec) |list,data| {
do vec.iter().fold(DList()) |list,data| {
list.push(*data); // Iterating left-to-right -- add newly to the tail.
list
}

View file

@ -414,6 +414,7 @@ mod test {
use super::{FileInput, pathify, input_vec, input_vec_state};
use core::iterator::IteratorUtil;
use core::io;
use core::str;
use core::uint;
@ -455,7 +456,7 @@ mod test {
let fi = FileInput::from_vec(copy filenames);
for "012".each_chari |line, c| {
for "012".iter().enumerate().advance |(line, c)| {
assert_eq!(fi.read_byte(), c as int);
assert_eq!(fi.state().line_num, line);
assert_eq!(fi.state().line_num_file, 0);

View file

@ -16,8 +16,6 @@ Simple compression
#[allow(missing_doc)];
use core::prelude::*;
use core::libc::{c_void, size_t, c_int};
use core::libc;
use core::vec;
@ -87,6 +85,7 @@ mod tests {
use super::*;
use core::rand;
use core::rand::RngUtil;
use core::prelude::*;
#[test]
#[allow(non_implicitly_copyable_typarams)]

View file

@ -654,7 +654,6 @@ mod test {
use core::int;
use core::io::BytesWriter;
use core::result;
use core::sys;
use core::task;
#[test]

View file

@ -18,6 +18,7 @@
use core::prelude::*;
use core::iterator::IteratorUtil;
use core::char;
use core::float;
use core::hashmap::HashMap;
@ -58,7 +59,7 @@ pub struct Error {
fn escape_str(s: &str) -> ~str {
let mut escaped = ~"\"";
for str::each_char(s) |c| {
for s.iter().advance |c| {
match c {
'"' => escaped += "\\\"",
'\\' => escaped += "\\\\",
@ -913,7 +914,8 @@ impl serialize::Decoder for Decoder {
fn read_char(&mut self) -> char {
let mut v = ~[];
for str::each_char(self.read_str()) |c| { v.push(c) }
let s = self.read_str();
for s.iter().advance |c| { v.push(c) }
if v.len() != 1 { fail!("string must have one character") }
v[0]
}

View file

@ -12,7 +12,7 @@
use core::prelude::*;
use core::vec;
use core::iterator::IteratorUtil;
#[deriving(Eq)]
pub enum List<T> {
@ -28,7 +28,7 @@ pub enum MutList<T> {
/// Create a list from a vector
pub fn from_vec<T:Copy>(v: &[T]) -> @List<T> {
vec::foldr(v, @Nil::<T>, |h, t| @Cons(*h, t))
v.rev_iter().fold(@Nil::<T>, |t, h| @Cons(*h, t))
}
/**

View file

@ -14,6 +14,7 @@
use core::prelude::*;
use core::iterator::IteratorUtil;
use core::cmp::Eq;
use core::io::{Reader, ReaderUtil};
use core::io;
@ -358,7 +359,7 @@ pub fn query_to_str(query: &Query) -> ~str {
// returns the scheme and the rest of the url, or a parsing error
pub fn get_scheme(rawurl: &str) -> Result<(~str, ~str), ~str> {
for str::each_chari(rawurl) |i,c| {
for rawurl.iter().enumerate().advance |(i,c)| {
match c {
'A' .. 'Z' | 'a' .. 'z' => loop,
'0' .. '9' | '+' | '-' | '.' => {
@ -418,7 +419,7 @@ fn get_authority(rawurl: &str) ->
let mut colon_count = 0;
let mut (pos, begin, end) = (0, 2, len);
for str::each_chari(rawurl) |i,c| {
for rawurl.iter().enumerate().advance |(i,c)| {
if i < 2 { loop; } // ignore the leading //
// deal with input class first
@ -562,7 +563,7 @@ fn get_path(rawurl: &str, authority: bool) ->
Result<(~str, ~str), ~str> {
let len = str::len(rawurl);
let mut end = len;
for str::each_chari(rawurl) |i,c| {
for rawurl.iter().enumerate().advance |(i,c)| {
match c {
'A' .. 'Z' | 'a' .. 'z' | '0' .. '9' | '&' |'\'' | '(' | ')' | '.'
| '@' | ':' | '%' | '/' | '+' | '!' | '*' | ',' | ';' | '='

View file

@ -19,7 +19,7 @@ A BigInt is a combination of BigUint and Sign.
#[allow(missing_doc)];
use core::prelude::*;
use core::iterator::IteratorUtil;
use core::cmp::{Eq, Ord, TotalEq, TotalOrd, Ordering, Less, Equal, Greater};
use core::int;
use core::num::{IntConvertible, Zero, One, ToStrRadix, FromStrRadix, Orderable};
@ -129,12 +129,9 @@ impl TotalOrd for BigUint {
if s_len < o_len { return Less; }
if s_len > o_len { return Greater; }
for self.data.eachi_reverse |i, elm| {
match (*elm, other.data[i]) {
(l, r) if l < r => return Less,
(l, r) if l > r => return Greater,
_ => loop
};
for self.data.rev_iter().zip(other.data.rev_iter()).advance |(&self_i, &other_i)| {
cond!((self_i < other_i) { return Less; }
(self_i > other_i) { return Greater; })
}
return Equal;
}
@ -421,7 +418,7 @@ impl Integer for BigUint {
let bn = *b.data.last();
let mut d = ~[];
let mut carry = 0;
for an.each_reverse |elt| {
for an.rev_iter().advance |elt| {
let ai = BigDigit::to_uint(carry, *elt);
let di = ai / (bn as uint);
assert!(di < BigDigit::base);
@ -648,7 +645,7 @@ impl BigUint {
let mut borrow = 0;
let mut shifted = ~[];
for self.data.each_reverse |elem| {
for self.data.rev_iter().advance |elem| {
shifted = ~[(*elem >> n_bits) | borrow] + shifted;
borrow = *elem << (BigDigit::bits - n_bits);
}

View file

@ -10,6 +10,7 @@
use core::prelude::*;
use core::iterator::IteratorUtil;
use core::cast;
use core::ptr;
use core::sys;
@ -122,25 +123,24 @@ pub fn alli<A:Copy + Owned>(
xs: &[A],
fn_factory: &fn() -> ~fn(uint, &A) -> bool) -> bool
{
do vec::all(map_slices(xs, || {
let mapped = map_slices(xs, || {
let f = fn_factory();
let result: ~fn(uint, &[A]) -> bool = |base, slice| {
vec::alli(slice, |i, x| {
f(i + base, x)
})
slice.iter().enumerate().all(|(i, x)| f(i + base, x))
};
result
})) |x| { *x }
});
mapped.iter().all(|&x| x)
}
/// Returns true if the function holds for any elements in the vector.
pub fn any<A:Copy + Owned>(
xs: &[A],
fn_factory: &fn() -> ~fn(&A) -> bool) -> bool {
do vec::any(map_slices(xs, || {
let mapped = map_slices(xs, || {
let f = fn_factory();
let result: ~fn(uint, &[A]) -> bool =
|_, slice| vec::any(slice, |x| f(x));
let result: ~fn(uint, &[A]) -> bool = |_, slice| slice.iter().any(f);
result
})) |x| { *x }
});
mapped.iter().any(|&x| x)
}

View file

@ -929,11 +929,8 @@ mod test_tim_sort {
use core::prelude::*;
use sort::tim_sort;
use core::local_data;
use core::rand::RngUtil;
use core::rand;
use core::uint;
use core::vec;
struct CVal {

View file

@ -12,6 +12,7 @@
use core::prelude::*;
use core::iterator::*;
use core::vec;
use core::f64;
use core::cmp;
@ -36,17 +37,17 @@ pub trait Stats {
impl<'self> Stats for &'self [f64] {
fn sum(self) -> f64 {
vec::foldl(0.0, self, |p,q| p + *q)
self.iter().fold(0.0, |p,q| p + *q)
}
fn min(self) -> f64 {
assert!(self.len() != 0);
vec::foldl(self[0], self, |p,q| cmp::min(p, *q))
self.iter().fold(self[0], |p,q| cmp::min(p, *q))
}
fn max(self) -> f64 {
assert!(self.len() != 0);
vec::foldl(self[0], self, |p,q| cmp::max(p, *q))
self.iter().fold(self[0], |p,q| cmp::max(p, *q))
}
fn mean(self) -> f64 {

View file

@ -148,4 +148,3 @@ pub mod extra {
pub use serialize;
pub use test;
}

View file

@ -731,7 +731,6 @@ mod tests {
use core::cast;
use core::cell::Cell;
use core::comm;
use core::ptr;
use core::result;
use core::task;
use core::vec;

View file

@ -34,7 +34,6 @@ mod tests {
use core::prelude::*;
use tempfile::mkdtemp;
use tempfile;
use core::os;
use core::str;

View file

@ -16,6 +16,7 @@ use core::i32;
use core::int;
use core::io;
use core::str;
use core::iterator::IteratorUtil;
static NSEC_PER_SEC: i32 = 1_000_000_000_i32;
@ -261,7 +262,7 @@ impl Tm {
priv fn do_strptime(s: &str, format: &str) -> Result<Tm, ~str> {
fn match_str(s: &str, pos: uint, needle: &str) -> bool {
let mut i = pos;
for str::each(needle) |ch| {
for needle.bytes_iter().advance |ch| {
if s[i] != ch {
return false;
}

View file

@ -1034,8 +1034,6 @@ mod test_set {
use super::*;
use core::vec;
#[test]
fn test_clear() {
let mut s = TreeSet::new();

View file

@ -1234,7 +1234,6 @@ mod test {
use core::comm::{SharedChan, stream, GenericChan, GenericPort};
use core::libc;
use core::result;
use core::str;
use core::sys;
use core::task;

View file

@ -22,6 +22,7 @@ use middle::trans::common::CrateContext;
use middle::ty;
use util::ppaux;
use core::iterator::IteratorUtil;
use core::char;
use core::hash::Streaming;
use core::hash;
@ -636,7 +637,7 @@ pub fn get_symbol_hash(ccx: @CrateContext, t: ty::t) -> @str {
// gas accepts the following characters in symbols: a-z, A-Z, 0-9, ., _, $
pub fn sanitize(s: &str) -> ~str {
let mut result = ~"";
for str::each_char(s) |c| {
for s.iter().advance |c| {
match c {
// Escape these with $ sequences
'@' => result += "$SP$",

View file

@ -22,7 +22,6 @@ use syntax::codemap::{dummy_sp, span, ExpandedFrom, CallInfo, NameAndSpan};
use syntax::codemap;
use syntax::ext::base::ExtCtxt;
use syntax::fold;
use syntax::parse::token;
use syntax::print::pprust;
use syntax::{ast, ast_util};

View file

@ -19,6 +19,7 @@ use middle::typeck::method_map;
use middle::moves;
use util::ppaux::ty_to_str;
use core::iterator::IteratorUtil;
use core::uint;
use core::vec;
use extra::sort;
@ -242,7 +243,7 @@ pub fn is_useful(cx: @MatchCheckCtxt, m: &matrix, v: &[@pat]) -> useful {
not_useful
}
ty::ty_unboxed_vec(*) | ty::ty_evec(*) => {
let max_len = do m.foldr(0) |r, max_len| {
let max_len = do m.rev_iter().fold(0) |max_len, r| {
match r[0].node {
pat_vec(ref before, _, ref after) => {
uint::max(before.len() + after.len(), max_len)

View file

@ -18,6 +18,7 @@ use middle;
use syntax::{ast, ast_map, ast_util, visit};
use syntax::ast::*;
use core::iterator::IteratorUtil;
use core::float;
use core::hashmap::{HashMap, HashSet};
use core::vec;
@ -72,7 +73,7 @@ pub fn join(a: constness, b: constness) -> constness {
}
pub fn join_all(cs: &[constness]) -> constness {
vec::foldl(integral_const, cs, |a, b| join(a, *b))
cs.iter().fold(integral_const, |a, b| join(a, *b))
}
pub fn classify(e: @expr,

View file

@ -110,6 +110,7 @@ use middle::ty;
use middle::typeck;
use middle::moves;
use core::iterator::IteratorUtil;
use core::cast::transmute;
use core::hashmap::HashMap;
use core::io;
@ -923,7 +924,7 @@ impl Liveness {
pub fn propagate_through_block(&self, blk: &blk, succ: LiveNode)
-> LiveNode {
let succ = self.propagate_through_opt_expr(blk.node.expr, succ);
do blk.node.stmts.foldr(succ) |stmt, succ| {
do blk.node.stmts.rev_iter().fold(succ) |succ, stmt| {
self.propagate_through_stmt(*stmt, succ)
}
}
@ -977,7 +978,7 @@ impl Liveness {
pub fn propagate_through_exprs(&self, exprs: &[@expr], succ: LiveNode)
-> LiveNode {
do exprs.foldr(succ) |expr, succ| {
do exprs.rev_iter().fold(succ) |succ, expr| {
self.propagate_through_expr(*expr, succ)
}
}
@ -1021,7 +1022,7 @@ impl Liveness {
// the construction of a closure itself is not important,
// but we have to consider the closed over variables.
let caps = self.ir.captures(expr);
do caps.foldr(succ) |cap, succ| {
do caps.rev_iter().fold(succ) |succ, cap| {
self.init_from_succ(cap.ln, succ);
let var = self.variable(cap.var_nid, expr.span);
self.acc(cap.ln, var, ACC_READ | ACC_USE);
@ -1159,7 +1160,7 @@ impl Liveness {
expr_struct(_, ref fields, with_expr) => {
let succ = self.propagate_through_opt_expr(with_expr, succ);
do (*fields).foldr(succ) |field, succ| {
do fields.rev_iter().fold(succ) |succ, field| {
self.propagate_through_expr(field.node.expr, succ)
}
}
@ -1215,10 +1216,10 @@ impl Liveness {
}
expr_inline_asm(ref ia) =>{
let succ = do ia.inputs.foldr(succ) |&(_, expr), succ| {
let succ = do ia.inputs.rev_iter().fold(succ) |succ, &(_, expr)| {
self.propagate_through_expr(expr, succ)
};
do ia.outputs.foldr(succ) |&(_, expr), succ| {
do ia.outputs.rev_iter().fold(succ) |succ, &(_, expr)| {
self.propagate_through_expr(expr, succ)
}
}

View file

@ -172,6 +172,7 @@ use middle::trans::type_of;
use middle::ty;
use util::common::indenter;
use core::iterator::IteratorUtil;
use core::hashmap::HashMap;
use core::vec;
use syntax::ast;
@ -798,7 +799,7 @@ pub fn enter_region<'r>(bcx: block,
pub fn get_options(bcx: block, m: &[@Match], col: uint) -> ~[Opt] {
let ccx = bcx.ccx();
fn add_to_set(tcx: ty::ctxt, set: &mut ~[Opt], val: Opt) {
if set.any(|l| opt_eq(tcx, l, &val)) {return;}
if set.iter().any(|l| opt_eq(tcx, l, &val)) {return;}
set.push(val);
}
@ -965,7 +966,7 @@ pub fn collect_record_or_struct_fields(bcx: block,
fn extend(idents: &mut ~[ast::ident], field_pats: &[ast::field_pat]) {
for field_pats.each |field_pat| {
let field_ident = field_pat.ident;
if !vec::any(*idents, |x| *x == field_ident) {
if !idents.iter().any(|x| *x == field_ident) {
idents.push(field_ident);
}
}
@ -976,11 +977,11 @@ pub fn pats_require_rooting(bcx: block,
m: &[@Match],
col: uint)
-> bool {
vec::any(m, |br| {
do m.iter().any |br| {
let pat_id = br.pats[col].id;
let key = root_map_key {id: pat_id, derefs: 0u };
bcx.ccx().maps.root_map.contains_key(&key)
})
}
}
pub fn root_pats_as_necessary(mut bcx: block,
@ -1005,12 +1006,12 @@ pub fn root_pats_as_necessary(mut bcx: block,
// matches may be wildcards like _ or identifiers).
macro_rules! any_pat (
($m:expr, $pattern:pat) => (
vec::any($m, |br| {
do ($m).iter().any |br| {
match br.pats[col].node {
$pattern => true,
_ => false
}
})
}
)
)
@ -1031,7 +1032,7 @@ pub fn any_tup_pat(m: &[@Match], col: uint) -> bool {
}
pub fn any_tuple_struct_pat(bcx: block, m: &[@Match], col: uint) -> bool {
vec::any(m, |br| {
do m.iter().any |br| {
let pat = br.pats[col];
match pat.node {
ast::pat_enum(_, Some(_)) => {
@ -1043,7 +1044,7 @@ pub fn any_tuple_struct_pat(bcx: block, m: &[@Match], col: uint) -> bool {
}
_ => false
}
})
}
}
pub type mk_fail = @fn() -> BasicBlockRef;

View file

@ -44,6 +44,7 @@
* taken to it, implementing them for Rust seems difficult.
*/
use core::iterator::IteratorUtil;
use core::container::Map;
use core::libc::c_ulonglong;
use core::option::{Option, Some, None};
@ -176,7 +177,7 @@ fn represent_type_uncached(cx: @CrateContext, t: ty::t) -> Repr {
// Since there's at least one
// non-empty body, explicit discriminants should have
// been rejected by a checker before this point.
if !cases.alli(|i,c| c.discr == (i as int)) {
if !cases.iter().enumerate().all(|(i,c)| c.discr == (i as int)) {
cx.sess.bug(fmt!("non-C-like enum %s with specified \
discriminants",
ty::item_path_str(cx.tcx, def_id)))

View file

@ -64,6 +64,7 @@ use middle::ty;
use util::common::indenter;
use util::ppaux::{Repr, ty_to_str};
use core::iterator::IteratorUtil;
use core::hash;
use core::hashmap::{HashMap, HashSet};
use core::int;
@ -1275,7 +1276,7 @@ pub fn trans_block_cleanups_(bcx: block,
bcx.ccx().sess.opts.debugging_opts & session::no_landing_pads != 0;
if bcx.unreachable && !no_lpads { return bcx; }
let mut bcx = bcx;
for cleanups.each_reverse |cu| {
for cleanups.rev_iter().advance |cu| {
match *cu {
clean(cfn, cleanup_type) | clean_temp(_, cfn, cleanup_type) => {
// Some types don't need to be cleaned up during

View file

@ -17,9 +17,9 @@ use middle::trans::cabi::{ABIInfo, FnType, LLVMType};
use middle::trans::common::{T_i8, T_i16, T_i32, T_i64};
use middle::trans::common::{T_array, T_ptr, T_void};
use core::iterator::IteratorUtil;
use core::option::{Option, None, Some};
use core::uint;
use core::vec;
fn align_up_to(off: uint, a: uint) -> uint {
return (off + a - 1u) / a * a;
@ -43,9 +43,8 @@ fn ty_align(ty: TypeRef) -> uint {
if llvm::LLVMIsPackedStruct(ty) == True {
1
} else {
do vec::foldl(1, struct_tys(ty)) |a, t| {
uint::max(a, ty_align(*t))
}
let str_tys = struct_tys(ty);
str_tys.iter().fold(1, |a, t| uint::max(a, ty_align(*t)))
}
}
Array => {
@ -68,13 +67,11 @@ fn ty_size(ty: TypeRef) -> uint {
Double => 8,
Struct => {
if llvm::LLVMIsPackedStruct(ty) == True {
do vec::foldl(0, struct_tys(ty)) |s, t| {
s + ty_size(*t)
}
let str_tys = struct_tys(ty);
str_tys.iter().fold(0, |s, t| s + ty_size(*t))
} else {
let size = do vec::foldl(0, struct_tys(ty)) |s, t| {
align(s, *t) + ty_size(*t)
};
let str_tys = struct_tys(ty);
let size = str_tys.iter().fold(0, |s, t| align(s, *t) + ty_size(*t));
align(size, ty)
}
}

View file

@ -10,6 +10,7 @@
use core::prelude::*;
use core::iterator::IteratorUtil;
use core::libc::c_uint;
use core::ptr;
use core::uint;
@ -56,9 +57,8 @@ fn ty_align(ty: TypeRef) -> uint {
if llvm::LLVMIsPackedStruct(ty) == True {
1
} else {
do vec::foldl(1, struct_tys(ty)) |a, t| {
uint::max(a, ty_align(*t))
}
let str_tys = struct_tys(ty);
str_tys.iter().fold(1, |a, t| uint::max(a, ty_align(*t)))
}
}
Array => {
@ -81,13 +81,11 @@ fn ty_size(ty: TypeRef) -> uint {
Double => 8,
Struct => {
if llvm::LLVMIsPackedStruct(ty) == True {
do vec::foldl(0, struct_tys(ty)) |s, t| {
s + ty_size(*t)
}
let str_tys = struct_tys(ty);
str_tys.iter().fold(0, |s, t| s + ty_size(*t))
} else {
let size = do vec::foldl(0, struct_tys(ty)) |s, t| {
align(s, *t) + ty_size(*t)
};
let str_tys = struct_tys(ty);
let size = str_tys.iter().fold(0, |s, t| align(s, *t) + ty_size(*t));
align(size, ty)
}
}

View file

@ -19,6 +19,7 @@ use lib::llvm::True;
use middle::trans::common::*;
use middle::trans::cabi::*;
use core::iterator::IteratorUtil;
use core::libc::c_uint;
use core::option;
use core::option::Option;
@ -80,9 +81,8 @@ fn classify_ty(ty: TypeRef) -> ~[x86_64_reg_class] {
if llvm::LLVMIsPackedStruct(ty) == True {
1
} else {
do vec::foldl(1, struct_tys(ty)) |a, t| {
uint::max(a, ty_align(*t))
}
let str_tys = struct_tys(ty);
str_tys.iter().fold(1, |a, t| uint::max(a, ty_align(*t)))
}
}
Array => {
@ -104,16 +104,14 @@ fn classify_ty(ty: TypeRef) -> ~[x86_64_reg_class] {
Float => 4,
Double => 8,
Struct => {
if llvm::LLVMIsPackedStruct(ty) == True {
do vec::foldl(0, struct_tys(ty)) |s, t| {
s + ty_size(*t)
if llvm::LLVMIsPackedStruct(ty) == True {
let str_tys = struct_tys(ty);
str_tys.iter().fold(0, |s, t| s + ty_size(*t))
} else {
let str_tys = struct_tys(ty);
let size = str_tys.iter().fold(0, |s, t| align(s, *t) + ty_size(*t));
align(size, ty)
}
} else {
let size = do vec::foldl(0, struct_tys(ty)) |s, t| {
align(s, *t) + ty_size(*t)
};
align(size, ty)
}
}
Array => {
let len = llvm::LLVMGetArrayLength(ty) as uint;

View file

@ -53,7 +53,6 @@ use syntax::ast::ident;
use syntax::ast_map::{path, path_elt};
use syntax::codemap::span;
use syntax::parse::token;
use syntax::parse::token::ident_interner;
use syntax::{ast, ast_map};
use syntax::abi::{X86, X86_64, Arm, Mips};

View file

@ -29,7 +29,6 @@ use core::str;
use core::sys;
use core::vec;
use syntax::codemap::span;
use syntax::parse::token::ident_interner;
use syntax::{ast, codemap, ast_util, ast_map};
static LLVMDebugVersion: int = (9 << 16);

View file

@ -32,6 +32,7 @@ use middle::ty::{FnSig};
use middle::typeck;
use util::ppaux::{Repr,ty_to_str};
use core::iterator::IteratorUtil;
use core::vec;
use syntax::ast;
use syntax::ast_map;
@ -75,7 +76,7 @@ pub fn monomorphic_fn(ccx: @CrateContext,
let param_uses = type_use::type_uses_for(ccx, fn_id, substs.len());
let hash_id = make_mono_id(ccx, fn_id, substs, vtables, impl_did_opt,
Some(param_uses));
if vec::any(hash_id.params,
if hash_id.params.iter().any(
|p| match *p { mono_precise(_, _) => false, _ => true }) {
must_cast = true;
}

View file

@ -27,6 +27,7 @@ use util::ppaux::{Repr, UserString};
use util::common::{indenter};
use util::enum_set::{EnumSet, CLike};
use core::iterator::IteratorUtil;
use core::cast;
use core::cmp;
use core::hashmap::{HashMap, HashSet};
@ -2355,8 +2356,8 @@ pub fn is_instantiable(cx: ctxt, r_ty: t) -> bool {
ty_struct(did, ref substs) => {
seen.push(did);
let r = vec::any(struct_fields(cx, did, substs),
|f| type_requires(cx, seen, r_ty, f.mt.ty));
let fields = struct_fields(cx, did, substs);
let r = fields.iter().any(|f| type_requires(cx, seen, r_ty, f.mt.ty));
seen.pop();
r
}
@ -2372,12 +2373,12 @@ pub fn is_instantiable(cx: ctxt, r_ty: t) -> bool {
ty_enum(did, ref substs) => {
seen.push(did);
let vs = enum_variants(cx, did);
let r = vec::len(*vs) > 0u && vec::all(*vs, |variant| {
vec::any(variant.args, |aty| {
let r = vec::len(*vs) > 0u && do vs.iter().all |variant| {
do variant.args.iter().any |aty| {
let sty = subst(cx, substs, *aty);
type_requires(cx, seen, r_ty, sty)
})
});
}
};
seen.pop();
r
}
@ -2519,11 +2520,12 @@ pub fn type_is_pod(cx: ctxt, ty: t) -> bool {
ty_param(_) => result = false,
ty_opaque_closure_ptr(_) => result = true,
ty_struct(did, ref substs) => {
result = vec::all(lookup_struct_fields(cx, did), |f| {
let fields = lookup_struct_fields(cx, did);
result = do fields.iter().all |f| {
let fty = ty::lookup_item_type(cx, f.id);
let sty = subst(cx, substs, fty.ty);
type_is_pod(cx, sty)
});
};
}
ty_estr(vstore_slice(*)) | ty_evec(_, vstore_slice(*)) => {
@ -2569,7 +2571,7 @@ pub fn type_is_c_like_enum(cx: ctxt, ty: t) -> bool {
if variants.len() == 0 {
false
} else {
variants.all(|v| v.args.len() == 0)
variants.iter().all(|v| v.args.len() == 0)
}
}
_ => false

View file

@ -3065,7 +3065,7 @@ pub fn check_simd(tcx: ty::ctxt, sp: span, id: ast::node_id) {
return;
}
let e = ty::lookup_field_type(tcx, did, fields[0].id, substs);
if !vec::all(fields,
if !fields.iter().all(
|f| ty::lookup_field_type(tcx, did, f.id, substs) == e) {
tcx.sess.span_err(sp, "SIMD vector should be homogeneous");
return;

View file

@ -36,8 +36,6 @@ extern mod std(name = "std", vers = "0.7-pre");
// For bootstrapping purposes.
#[cfg(stage0)]
pub use core::str;
#[cfg(stage0)]
pub use core::unstable;
use core::prelude::*;

View file

@ -24,9 +24,9 @@ use fold::Fold;
use fold;
use pass::Pass;
use core::iterator::IteratorUtil;
use core::str;
use core::util;
use core::vec;
pub fn mk_pass() -> Pass {
Pass {
@ -150,7 +150,7 @@ pub fn paragraphs(s: &str) -> ~[~str] {
for str::each_line_any(s) |line| { lines.push(line.to_owned()); }
let mut whitespace_lines = 0;
let mut accum = ~"";
let paras = do vec::foldl(~[], lines) |paras, line| {
let paras = do lines.iter().fold(~[]) |paras, line| {
let mut res = paras;
if str::is_whitespace(*line) {

View file

@ -14,6 +14,7 @@ use core::prelude::*;
use doc;
use core::iterator::IteratorUtil;
use core::vec;
pub type AstId = int;
@ -174,7 +175,7 @@ pub struct IndexEntry {
impl Doc {
pub fn CrateDoc(&self) -> CrateDoc {
vec::foldl(None, self.pages, |_m, page| {
self.pages.iter().fold(None, |_m, page| {
match copy *page {
doc::CratePage(doc) => Some(doc),
_ => None

View file

@ -10,7 +10,7 @@
use core::prelude::*;
use core::vec;
use core::iterator::IteratorUtil;
use astsrv;
use doc;
@ -30,7 +30,7 @@ pub fn run_passes(
passes: ~[Pass]
) -> doc::Doc {
let mut passno = 0;
do vec::foldl(doc, passes) |doc, pass| {
do passes.iter().fold(doc) |doc, pass| {
debug!("pass #%d", passno);
passno += 1;
do time(copy pass.name) {

View file

@ -21,9 +21,9 @@ middle of a line, and each of the following lines is indented.
use core::prelude::*;
use core::iterator::IteratorUtil;
use core::str;
use core::uint;
use core::vec;
use pass::Pass;
use text_pass;
@ -36,7 +36,7 @@ fn unindent(s: &str) -> ~str {
for str::each_line_any(s) |line| { lines.push(line.to_owned()); }
let mut saw_first_line = false;
let mut saw_second_line = false;
let min_indent = do vec::foldl(uint::max_value, lines)
let min_indent = do lines.iter().fold(uint::max_value)
|min_indent, line| {
// After we see the first non-whitespace line, look at

View file

@ -286,8 +286,6 @@ pub mod raw {
#[cfg(test)]
mod test {
use super::*;
use prelude::*;
use uint;
#[test]

View file

@ -42,7 +42,6 @@ much easier to implement.
use cmp::Ord;
use option::{Option, Some, None};
use vec::OwnedVector;
use num::{One, Zero};
use ops::{Add, Mul};

View file

@ -18,7 +18,6 @@ implementing the `Iterator` trait.
*/
use cmp;
use iter;
use iter::{FromIter, Times};
use num::{Zero, One};
use option::{Option, Some, None};
@ -326,7 +325,7 @@ pub trait IteratorUtil<A> {
/// assert!(a.iter().all(|&x| *x > 0));
/// assert!(!a.iter().all(|&x| *x > 2));
/// ~~~
fn all(&mut self, f: &fn(&A) -> bool) -> bool;
fn all(&mut self, f: &fn(A) -> bool) -> bool;
/// Tests whether any element of an iterator satisfies the specified
/// predicate.
@ -341,7 +340,7 @@ pub trait IteratorUtil<A> {
/// assert!(it.any(|&x| *x == 3));
/// assert!(!it.any(|&x| *x == 3));
/// ~~~
fn any(&mut self, f: &fn(&A) -> bool) -> bool;
fn any(&mut self, f: &fn(A) -> bool) -> bool;
}
/// Iterator adaptors provided for every `Iterator` implementation. The adaptor objects are also
@ -462,14 +461,14 @@ impl<A, T: Iterator<A>> IteratorUtil<A> for T {
fn count(&mut self) -> uint { self.fold(0, |cnt, _x| cnt + 1) }
#[inline(always)]
fn all(&mut self, f: &fn(&A) -> bool) -> bool {
for self.advance |x| { if !f(&x) { return false; } }
fn all(&mut self, f: &fn(A) -> bool) -> bool {
for self.advance |x| { if !f(x) { return false; } }
return true;
}
#[inline(always)]
fn any(&mut self, f: &fn(&A) -> bool) -> bool {
for self.advance |x| { if f(&x) { return true; } }
fn any(&mut self, f: &fn(A) -> bool) -> bool {
for self.advance |x| { if f(x) { return true; } }
return false;
}
}
@ -1080,18 +1079,18 @@ mod tests {
#[test]
fn test_all() {
let v = ~&[1, 2, 3, 4, 5];
assert!(v.iter().all(|&x| *x < 10));
assert!(v.iter().all(|&x| x < 10));
assert!(!v.iter().all(|&x| x.is_even()));
assert!(!v.iter().all(|&x| *x > 100));
assert!(!v.iter().all(|&x| x > 100));
assert!(v.slice(0, 0).iter().all(|_| fail!()));
}
#[test]
fn test_any() {
let v = ~&[1, 2, 3, 4, 5];
assert!(v.iter().any(|&x| *x < 10));
assert!(v.iter().any(|&x| x < 10));
assert!(v.iter().any(|&x| x.is_even()));
assert!(!v.iter().any(|&x| *x > 100));
assert!(!v.iter().any(|&x| x > 100));
assert!(!v.slice(0, 0).iter().any(|_| fail!()));
}
}

View file

@ -11,8 +11,6 @@
//! Unsafe pointer utility functions
use cast;
#[cfg(stage0)] use libc;
#[cfg(stage0)] use libc::{c_void, size_t};
use option::{Option, Some, None};
use sys;
use unstable::intrinsics;

View file

@ -43,6 +43,7 @@ fn main () {
use cast;
use cmp;
use int;
use iterator::IteratorUtil;
use local_data;
use prelude::*;
use str;
@ -479,7 +480,7 @@ impl<R: Rng> RngUtil for R {
fn gen_char_from(&mut self, chars: &str) -> char {
assert!(!chars.is_empty());
let mut cs = ~[];
for str::each_char(chars) |c| { cs.push(c) }
for chars.iter().advance |c| { cs.push(c) }
self.choose(cs)
}

View file

@ -22,6 +22,7 @@ use intrinsic;
use intrinsic::{TyDesc, TyVisitor, visit_tydesc};
use intrinsic::Opaque;
use io::{Writer, WriterUtil};
use iterator::IteratorUtil;
use libc::c_void;
use managed;
use ptr;
@ -209,7 +210,7 @@ impl ReprVisitor {
pub fn write_escaped_slice(&self, slice: &str) {
self.writer.write_char('"');
for slice.each_char |ch| {
for slice.iter().advance |ch| {
self.writer.write_escaped_char(ch);
}
self.writer.write_char('"');

View file

@ -25,7 +25,7 @@ use clone::Clone;
use cmp::{TotalOrd, Ordering, Less, Equal, Greater};
use container::Container;
use iter::Times;
use iterator::Iterator;
use iterator::{Iterator, IteratorUtil};
use libc;
use option::{None, Option, Some};
use old_iter::{BaseIter, EqIter};
@ -35,7 +35,7 @@ use str;
use to_str::ToStr;
use uint;
use vec;
use vec::{OwnedVector, OwnedCopyableVector};
use vec::{OwnedVector, OwnedCopyableVector, ImmutableVector};
#[cfg(not(test))] use cmp::{Eq, Ord, Equiv, TotalEq};
@ -608,11 +608,7 @@ pub fn byte_slice_no_callback<'a>(s: &'a str) -> &'a [u8] {
/// Convert a string to a unique vector of characters
pub fn to_chars(s: &str) -> ~[char] {
let mut buf = ~[];
for each_char(s) |c| {
buf.push(c);
}
buf
s.iter().collect()
}
/**
@ -856,12 +852,12 @@ pub fn levdistance(s: &str, t: &str) -> uint {
let mut dcol = vec::from_fn(tlen + 1, |x| x);
for s.each_chari |i, sc| {
for s.iter().enumerate().advance |(i, sc)| {
let mut current = i;
dcol[0] = current + 1;
for t.each_chari |j, tc| {
for t.iter().enumerate().advance |(j, tc)| {
let next = dcol[j + 1];
@ -943,7 +939,7 @@ pub fn each_split_within<'a>(ss: &'a str,
let mut cont = true;
let slice: &fn() = || { cont = it(slice(ss, slice_start, last_end)) };
let machine: &fn(uint, char) -> bool = |i, c| {
let machine: &fn((uint, char)) -> bool = |(i, c)| {
let whitespace = if char::is_whitespace(c) { Ws } else { Cr };
let limit = if (i - slice_start + 1) <= lim { UnderLim } else { OverLim };
@ -968,12 +964,12 @@ pub fn each_split_within<'a>(ss: &'a str,
cont
};
str::each_chari(ss, machine);
ss.iter().enumerate().advance(machine);
// Let the automaton 'run out' by supplying trailing whitespace
let mut fake_i = ss.len();
while cont && match state { B | C => true, A => false } {
machine(fake_i, ' ');
machine((fake_i, ' '));
fake_i += 1;
}
return cont;
@ -1247,97 +1243,12 @@ pub fn any(ss: &str, pred: &fn(char) -> bool) -> bool {
pub fn map(ss: &str, ff: &fn(char) -> char) -> ~str {
let mut result = ~"";
reserve(&mut result, len(ss));
for ss.each_char |cc| {
for ss.iter().advance |cc| {
str::push_char(&mut result, ff(cc));
}
result
}
/// Iterate over the bytes in a string
#[inline(always)]
pub fn each(s: &str, it: &fn(u8) -> bool) -> bool {
eachi(s, |_i, b| it(b))
}
/// Iterate over the bytes in a string, with indices
#[inline(always)]
pub fn eachi(s: &str, it: &fn(uint, u8) -> bool) -> bool {
let mut pos = 0;
let len = s.len();
while pos < len {
if !it(pos, s[pos]) { return false; }
pos += 1;
}
return true;
}
/// Iterate over the bytes in a string in reverse
#[inline(always)]
pub fn each_reverse(s: &str, it: &fn(u8) -> bool) -> bool {
eachi_reverse(s, |_i, b| it(b) )
}
/// Iterate over the bytes in a string in reverse, with indices
#[inline(always)]
pub fn eachi_reverse(s: &str, it: &fn(uint, u8) -> bool) -> bool {
let mut pos = s.len();
while pos > 0 {
pos -= 1;
if !it(pos, s[pos]) { return false; }
}
return true;
}
/// Iterate over each char of a string, without allocating
#[inline(always)]
pub fn each_char(s: &str, it: &fn(char) -> bool) -> bool {
let mut i = 0;
let len = len(s);
while i < len {
let CharRange {ch, next} = char_range_at(s, i);
if !it(ch) { return false; }
i = next;
}
return true;
}
/// Iterates over the chars in a string, with indices
#[inline(always)]
pub fn each_chari(s: &str, it: &fn(uint, char) -> bool) -> bool {
let mut pos = 0;
let mut ch_pos = 0u;
let len = s.len();
while pos < len {
let CharRange {ch, next} = char_range_at(s, pos);
pos = next;
if !it(ch_pos, ch) { return false; }
ch_pos += 1u;
}
return true;
}
/// Iterates over the chars in a string in reverse
#[inline(always)]
pub fn each_char_reverse(s: &str, it: &fn(char) -> bool) -> bool {
each_chari_reverse(s, |_, c| it(c))
}
/// Iterates over the chars in a string in reverse, with indices
#[inline(always)]
pub fn each_chari_reverse(s: &str, it: &fn(uint, char) -> bool) -> bool {
let mut pos = s.len();
let mut ch_pos = s.char_len();
while pos > 0 {
let CharRange {ch, next} = char_range_at_reverse(s, pos);
pos = next;
ch_pos -= 1;
if !it(ch_pos, ch) { return false; }
}
return true;
}
/*
Section: Searching
*/
@ -1657,7 +1568,7 @@ pub fn rfind_between(s: &str, start: uint, end: uint, f: &fn(char) -> bool) -> O
// Utility used by various searching functions
fn match_at<'a,'b>(haystack: &'a str, needle: &'b str, at: uint) -> bool {
let mut i = at;
for each(needle) |c| { if haystack[i] != c { return false; } i += 1u; }
for needle.bytes_iter().advance |c| { if haystack[i] != c { return false; } i += 1u; }
return true;
}
@ -1880,7 +1791,7 @@ pub fn is_utf16(v: &[u16]) -> bool {
/// Converts to a vector of `u16` encoded as UTF-16
pub fn to_utf16(s: &str) -> ~[u16] {
let mut u = ~[];
for s.each_char |ch| {
for s.iter().advance |ch| {
// Arithmetic with u32 literals is easier on the eyes than chars.
let mut ch = ch as u32;
@ -2396,7 +2307,7 @@ pub fn capacity(s: &const ~str) -> uint {
pub fn escape_default(s: &str) -> ~str {
let mut out: ~str = ~"";
reserve_at_least(&mut out, str::len(s));
for s.each_char |c| {
for s.iter().advance |c| {
push_str(&mut out, char::escape_default(c));
}
out
@ -2406,7 +2317,7 @@ pub fn escape_default(s: &str) -> ~str {
pub fn escape_unicode(s: &str) -> ~str {
let mut out: ~str = ~"";
reserve_at_least(&mut out, str::len(s));
for s.each_char |c| {
for s.iter().advance |c| {
push_str(&mut out, char::escape_unicode(c));
}
out
@ -2608,15 +2519,10 @@ pub trait StrSlice<'self> {
fn any(&self, it: &fn(char) -> bool) -> bool;
fn contains<'a>(&self, needle: &'a str) -> bool;
fn contains_char(&self, needle: char) -> bool;
fn char_iter(&self) -> StrCharIterator<'self>;
fn each(&self, it: &fn(u8) -> bool) -> bool;
fn eachi(&self, it: &fn(uint, u8) -> bool) -> bool;
fn each_reverse(&self, it: &fn(u8) -> bool) -> bool;
fn eachi_reverse(&self, it: &fn(uint, u8) -> bool) -> bool;
fn each_char(&self, it: &fn(char) -> bool) -> bool;
fn each_chari(&self, it: &fn(uint, char) -> bool) -> bool;
fn each_char_reverse(&self, it: &fn(char) -> bool) -> bool;
fn each_chari_reverse(&self, it: &fn(uint, char) -> bool) -> bool;
fn iter(&self) -> StrCharIterator<'self>;
fn rev_iter(&self) -> StrCharRevIterator<'self>;
fn bytes_iter(&self) -> StrBytesIterator<'self>;
fn bytes_rev_iter(&self) -> StrBytesRevIterator<'self>;
fn ends_with(&self, needle: &str) -> bool;
fn is_empty(&self) -> bool;
fn is_whitespace(&self) -> bool;
@ -2670,46 +2576,28 @@ impl<'self> StrSlice<'self> for &'self str {
}
#[inline]
fn char_iter(&self) -> StrCharIterator<'self> {
fn iter(&self) -> StrCharIterator<'self> {
StrCharIterator {
index: 0,
string: *self
}
}
#[inline]
fn rev_iter(&self) -> StrCharRevIterator<'self> {
StrCharRevIterator {
index: self.len(),
string: *self
}
}
/// Iterate over the bytes in a string
#[inline]
fn each(&self, it: &fn(u8) -> bool) -> bool { each(*self, it) }
/// Iterate over the bytes in a string, with indices
#[inline]
fn eachi(&self, it: &fn(uint, u8) -> bool) -> bool { eachi(*self, it) }
/// Iterate over the bytes in a string
#[inline]
fn each_reverse(&self, it: &fn(u8) -> bool) -> bool { each_reverse(*self, it) }
/// Iterate over the bytes in a string, with indices
#[inline]
fn eachi_reverse(&self, it: &fn(uint, u8) -> bool) -> bool {
eachi_reverse(*self, it)
fn bytes_iter(&self) -> StrBytesIterator<'self> {
StrBytesIterator { it: as_bytes_slice(*self).iter() }
}
/// Iterate over the chars in a string
#[inline]
fn each_char(&self, it: &fn(char) -> bool) -> bool { each_char(*self, it) }
/// Iterate over the chars in a string, with indices
#[inline]
fn each_chari(&self, it: &fn(uint, char) -> bool) -> bool {
each_chari(*self, it)
}
/// Iterate over the chars in a string in reverse
#[inline]
fn each_char_reverse(&self, it: &fn(char) -> bool) -> bool {
each_char_reverse(*self, it)
}
/// Iterate over the chars in a string in reverse, with indices from the
/// end
#[inline]
fn each_chari_reverse(&self, it: &fn(uint, char) -> bool) -> bool {
each_chari_reverse(*self, it)
fn bytes_rev_iter(&self) -> StrBytesRevIterator<'self> {
StrBytesRevIterator { it: as_bytes_slice(*self).rev_iter() }
}
/// Returns true if one string ends with another
#[inline]
fn ends_with(&self, needle: &str) -> bool {
@ -2880,9 +2768,55 @@ impl<'self> Iterator<char> for StrCharIterator<'self> {
}
}
}
/// External iterator for a string's characters in reverse order. Use
/// with the `std::iterator` module.
pub struct StrCharRevIterator<'self> {
priv index: uint,
priv string: &'self str,
}
impl<'self> Iterator<char> for StrCharRevIterator<'self> {
#[inline]
fn next(&mut self) -> Option<char> {
if self.index > 0 {
let CharRange {ch, next} = char_range_at_reverse(self.string, self.index);
self.index = next;
Some(ch)
} else {
None
}
}
}
/// External iterator for a string's bytes. Use with the `std::iterator`
/// module.
pub struct StrBytesIterator<'self> {
priv it: vec::VecIterator<'self, u8>
}
impl<'self> Iterator<u8> for StrBytesIterator<'self> {
#[inline]
fn next(&mut self) -> Option<u8> {
self.it.next().map_consume(|&x| x)
}
}
/// External iterator for a string's bytes in reverse order. Use with
/// the `std::iterator` module.
pub struct StrBytesRevIterator<'self> {
priv it: vec::VecRevIterator<'self, u8>
}
impl<'self> Iterator<u8> for StrBytesRevIterator<'self> {
#[inline]
fn next(&mut self) -> Option<u8> {
self.it.next().map_consume(|&x| x)
}
}
#[cfg(test)]
mod tests {
use iterator::IteratorUtil;
use container::Container;
use char;
use option::Some;
@ -2977,7 +2911,7 @@ mod tests {
let mut v = ~[];
for each_split_char(s, c) |s| { v.push(s.to_owned()) }
debug!("split_byte to: %?", v);
assert!(vec::all2(v, u, |a,b| a == b));
assert!(v.iter().zip(u.iter()).all(|(a,b)| a == b));
}
t("abc.hello.there", '.', [~"abc", ~"hello", ~"there"]);
t(".hello.there", '.', [~"", ~"hello", ~"there"]);
@ -2995,7 +2929,7 @@ mod tests {
let mut v = ~[];
for each_split_char(s, c) |s| { v.push(s.to_owned()) }
debug!("split_byte to: %?", v);
assert!(vec::all2(v, u, |a,b| a == b));
assert!(v.iter().zip(u.iter()).all(|(a,b)| a == b));
}
let data = "ประเทศไทย中华Việt Nam";
t(data, 'V', [~"ประเทศไทย中华", ~"iệt Nam"]);
@ -3010,7 +2944,7 @@ mod tests {
for each_splitn_char(s, c, n) |s| { v.push(s.to_owned()) }
debug!("split_byte to: %?", v);
debug!("comparing vs. %?", u);
assert!(vec::all2(v, u, |a,b| a == b));
assert!(v.iter().zip(u.iter()).all(|(a,b)| a == b));
}
t("abc.hello.there", '.', 0u, [~"abc.hello.there"]);
t("abc.hello.there", '.', 1u, [~"abc", ~"hello.there"]);
@ -3037,7 +2971,7 @@ mod tests {
for each_splitn_char(s, c, n) |s| { v.push(s.to_owned()) }
debug!("split_byte to: %?", v);
debug!("comparing vs. %?", u);
assert!(vec::all2(v, u, |a,b| a == b));
assert!(v.iter().zip(u.iter()).all(|(a,b)| a == b));
}
t("ประเทศไทย中华Việt Nam", '华', 1u, [~"ประเทศไทย中", ~"Việt Nam"]);
@ -3055,7 +2989,7 @@ mod tests {
for each_splitn_char(s, c, n) |s| { v.push(s.to_owned()) }
debug!("split_byte to: %?", v);
debug!("comparing vs. %?", u);
assert!(vec::all2(v, u, |a,b| a == b));
assert!(v.iter().zip(u.iter()).all(|(a,b)| a == b));
}
let data = "ประเทศไทย中华Việt Nam";
t(data, 'V', 1u, [~"ประเทศไทย中华", ~"iệt Nam"]);
@ -3069,7 +3003,7 @@ mod tests {
let mut v = ~[];
for each_split_char_no_trailing(s, c) |s| { v.push(s.to_owned()) }
debug!("split_byte to: %?", v);
assert!(vec::all2(v, u, |a,b| a == b));
assert!(v.iter().zip(u.iter()).all(|(a,b)| a == b));
}
t("abc.hello.there", '.', [~"abc", ~"hello", ~"there"]);
t(".hello.there", '.', [~"", ~"hello", ~"there"]);
@ -3088,7 +3022,7 @@ mod tests {
let mut v = ~[];
for each_split_char_no_trailing(s, c) |s| { v.push(s.to_owned()) }
debug!("split_byte to: %?", v);
assert!(vec::all2(v, u, |a,b| a == b));
assert!(v.iter().zip(u.iter()).all(|(a,b)| a == b));
}
let data = "ประเทศไทย中华Việt Nam";
t(data, 'V', [~"ประเทศไทย中华", ~"iệt Nam"]);
@ -3100,7 +3034,7 @@ mod tests {
fn t<'a>(s: &str, sep: &'a str, u: &[~str]) {
let mut v = ~[];
for each_split_str(s, sep) |s| { v.push(s.to_owned()) }
assert!(vec::all2(v, u, |a,b| a == b));
assert!(v.iter().zip(u.iter()).all(|(a,b)| a == b));
}
t("--1233345--", "12345", [~"--1233345--"]);
t("abc::hello::there", "::", [~"abc", ~"hello", ~"there"]);
@ -3124,7 +3058,7 @@ mod tests {
fn t(s: &str, sepf: &fn(char) -> bool, u: &[~str]) {
let mut v = ~[];
for each_split(s, sepf) |s| { v.push(s.to_owned()) }
assert!(vec::all2(v, u, |a,b| a == b));
assert!(v.iter().zip(u.iter()).all(|(a,b)| a == b));
}
t("ประเทศไทย中华Việt Nam", |cc| cc == '华', [~"ประเทศไทย中", ~"Việt Nam"]);
@ -3140,7 +3074,7 @@ mod tests {
fn t(s: &str, sepf: &fn(char) -> bool, u: &[~str]) {
let mut v = ~[];
for each_split_no_trailing(s, sepf) |s| { v.push(s.to_owned()) }
assert!(vec::all2(v, u, |a,b| a == b));
assert!(v.iter().zip(u.iter()).all(|(a,b)| a == b));
}
t("ประเทศไทย中华Việt Nam", |cc| cc == '华', [~"ประเทศไทย中", ~"Việt Nam"]);
@ -3159,7 +3093,7 @@ mod tests {
fn t(s: &str, f: &fn(&str, &fn(&str) -> bool) -> bool, u: &[~str]) {
let mut v = ~[];
for f(s) |s| { v.push(s.to_owned()) }
assert!(vec::all2(v, u, |a,b| a == b));
assert!(v.iter().zip(u.iter()).all(|(a,b)| a == b));
}
t(lf, each_line, [~"", ~"Mary had a little lamb", ~"Little lamb"]);
@ -3179,7 +3113,7 @@ mod tests {
fn t(s: &str, f: &fn(&str, &fn(&str) -> bool) -> bool, u: &[~str]) {
let mut v = ~[];
for f(s) |s| { v.push(s.to_owned()) }
assert!(vec::all2(v, u, |a,b| a == b));
assert!(v.iter().zip(u.iter()).all(|(a,b)| a == b));
}
let data = "\nMary had a little lamb\nLittle lamb\n";
@ -3193,7 +3127,7 @@ mod tests {
fn t(s: &str, i: uint, u: &[~str]) {
let mut v = ~[];
for each_split_within(s, i) |s| { v.push(s.to_owned()) }
assert!(vec::all2(v, u, |a,b| a == b));
assert!(v.iter().zip(u.iter()).all(|(a,b)| a == b));
}
t("", 0, []);
t("", 15, []);
@ -3964,154 +3898,12 @@ mod tests {
let s = ~"ศไทย中华Việt Nam";
let v = ~['ศ','ไ','ท','ย','中','华','V','i','ệ','t',' ','N','a','m'];
let mut pos = s.len();
for v.each_reverse |ch| {
for v.rev_iter().advance |ch| {
assert!(s.char_at_reverse(pos) == *ch);
pos -= from_char(*ch).len();
}
}
#[test]
fn test_each() {
let s = ~"ศไทย中华Việt Nam";
let v = [
224, 184, 168, 224, 185, 132, 224, 184, 151, 224, 184, 162, 228,
184, 173, 229, 141, 142, 86, 105, 225, 187, 135, 116, 32, 78, 97,
109
];
let mut pos = 0;
for s.each |b| {
assert_eq!(b, v[pos]);
pos += 1;
}
}
#[test]
fn test_each_empty() {
for "".each |b| {
assert_eq!(b, 0u8);
}
}
#[test]
fn test_eachi() {
let s = ~"ศไทย中华Việt Nam";
let v = [
224, 184, 168, 224, 185, 132, 224, 184, 151, 224, 184, 162, 228,
184, 173, 229, 141, 142, 86, 105, 225, 187, 135, 116, 32, 78, 97,
109
];
let mut pos = 0;
for s.eachi |i, b| {
assert_eq!(pos, i);
assert_eq!(b, v[pos]);
pos += 1;
}
}
#[test]
fn test_eachi_empty() {
for "".eachi |i, b| {
assert_eq!(i, 0);
assert_eq!(b, 0);
}
}
#[test]
fn test_each_reverse() {
let s = ~"ศไทย中华Việt Nam";
let v = [
224, 184, 168, 224, 185, 132, 224, 184, 151, 224, 184, 162, 228,
184, 173, 229, 141, 142, 86, 105, 225, 187, 135, 116, 32, 78, 97,
109
];
let mut pos = v.len();
for s.each_reverse |b| {
pos -= 1;
assert_eq!(b, v[pos]);
}
}
#[test]
fn test_each_empty_reverse() {
for "".each_reverse |b| {
assert_eq!(b, 0u8);
}
}
#[test]
fn test_eachi_reverse() {
let s = ~"ศไทย中华Việt Nam";
let v = [
224, 184, 168, 224, 185, 132, 224, 184, 151, 224, 184, 162, 228,
184, 173, 229, 141, 142, 86, 105, 225, 187, 135, 116, 32, 78, 97,
109
];
let mut pos = v.len();
for s.eachi_reverse |i, b| {
pos -= 1;
assert_eq!(pos, i);
assert_eq!(b, v[pos]);
}
}
#[test]
fn test_eachi_reverse_empty() {
for "".eachi_reverse |i, b| {
assert_eq!(i, 0);
assert_eq!(b, 0);
}
}
#[test]
fn test_each_char() {
let s = ~"ศไทย中华Việt Nam";
let v = ~['ศ','ไ','ท','ย','中','华','V','i','ệ','t',' ','N','a','m'];
let mut pos = 0;
for s.each_char |ch| {
assert_eq!(ch, v[pos]);
pos += 1;
}
}
#[test]
fn test_each_chari() {
let s = ~"ศไทย中华Việt Nam";
let v = ~['ศ','ไ','ท','ย','中','华','V','i','ệ','t',' ','N','a','m'];
let mut pos = 0;
for s.each_chari |i, ch| {
assert_eq!(pos, i);
assert_eq!(ch, v[pos]);
pos += 1;
}
}
#[test]
fn test_each_char_reverse() {
let s = ~"ศไทย中华Việt Nam";
let v = ~['ศ','ไ','ท','ย','中','华','V','i','ệ','t',' ','N','a','m'];
let mut pos = v.len();
for s.each_char_reverse |ch| {
pos -= 1;
assert_eq!(ch, v[pos]);
}
}
#[test]
fn test_each_chari_reverse() {
let s = ~"ศไทย中华Việt Nam";
let v = ~['ศ','ไ','ท','ย','中','华','V','i','ệ','t',' ','N','a','m'];
let mut pos = v.len();
for s.each_chari_reverse |i, ch| {
pos -= 1;
assert_eq!(pos, i);
assert_eq!(ch, v[pos]);
}
}
#[test]
fn test_escape_unicode() {
assert_eq!(escape_unicode("abc"), ~"\\x61\\x62\\x63");
@ -4167,7 +3959,7 @@ mod tests {
let v = ~['ศ','ไ','ท','ย','中','华','V','i','ệ','t',' ','N','a','m'];
let mut pos = 0;
let mut it = s.char_iter();
let mut it = s.iter();
for it.advance |c| {
assert_eq!(c, v[pos]);
@ -4175,4 +3967,52 @@ mod tests {
}
assert_eq!(pos, v.len());
}
#[test]
fn test_rev_iterator() {
use iterator::*;
let s = ~"ศไทย中华Việt Nam";
let v = ~['m', 'a', 'N', ' ', 't', 'ệ','i','V','华','中','ย','ท','ไ','ศ'];
let mut pos = 0;
let mut it = s.rev_iter();
for it.advance |c| {
assert_eq!(c, v[pos]);
pos += 1;
}
assert_eq!(pos, v.len());
}
#[test]
fn test_bytes_iterator() {
let s = ~"ศไทย中华Việt Nam";
let v = [
224, 184, 168, 224, 185, 132, 224, 184, 151, 224, 184, 162, 228,
184, 173, 229, 141, 142, 86, 105, 225, 187, 135, 116, 32, 78, 97,
109
];
let mut pos = 0;
for s.bytes_iter().advance |b| {
assert_eq!(b, v[pos]);
pos += 1;
}
}
#[test]
fn test_bytes_rev_iterator() {
let s = ~"ศไทย中华Việt Nam";
let v = [
224, 184, 168, 224, 185, 132, 224, 184, 151, 224, 184, 162, 228,
184, 173, 229, 141, 142, 86, 105, 225, 187, 135, 116, 32, 78, 97,
109
];
let mut pos = v.len();
for s.bytes_rev_iter().advance |b| {
pos -= 1;
assert_eq!(b, v[pos]);
}
}
}

View file

@ -15,6 +15,7 @@ use str;
use str::StrSlice;
use cast;
use old_iter::BaseIter;
use iterator::IteratorUtil;
use vec::{CopyableVector, ImmutableVector, OwnedVector};
/// Datatype to hold one ascii character. It is 8 bit long.
@ -101,10 +102,7 @@ impl<'self> AsciiCast<&'self[Ascii]> for &'self str {
#[inline(always)]
fn is_ascii(&self) -> bool {
for self.each |b| {
if !b.is_ascii() { return false; }
}
true
self.bytes_iter().all(|b| b.is_ascii())
}
}

View file

@ -14,7 +14,6 @@
use option::{Some, None};
use cast;
use cmp::{Eq, Ord};
use gc;
use io;
use libc;

View file

@ -14,7 +14,6 @@ use prelude::*;
use iterator::IteratorUtil;
use uint;
use util::{swap, replace};
use vec;
// FIXME: #5244: need to manually update the TrieNode constructor
static SHIFT: uint = 4;

View file

@ -10,6 +10,7 @@
//! Runtime calls emitted by the compiler.
use iterator::IteratorUtil;
use uint;
use cast::transmute;
use libc::{c_char, c_uchar, c_void, size_t, uintptr_t, c_int, STDERR_FILENO};
@ -133,7 +134,7 @@ unsafe fn fail_borrowed(box: *mut BoxRepr, file: *c_char, line: size_t) {
Some(borrow_list) => { // recording borrows
let mut msg = ~"borrowed";
let mut sep = " at ";
for borrow_list.each_reverse |entry| {
for borrow_list.rev_iter().advance |entry| {
if entry.box == box {
str::push_str(&mut msg, sep);
let filename = str::raw::from_c_str(entry.file);

View file

@ -1066,138 +1066,12 @@ impl<'self, T:Copy> VectorVector<T> for &'self [&'self [T]] {
}
}
/**
* Reduces a vector from left to right.
*
* # Arguments
* * `z` - initial accumulator value
* * `v` - vector to iterate over
* * `p` - a closure to operate on vector elements
*
* # Examples
*
* Sum all values in the vector [1, 2, 3]:
*
* ~~~ {.rust}
* vec::foldl(0, [1, 2, 3], |a, b| a + *b);
* ~~~
*
*/
pub fn foldl<'a, T, U>(z: T, v: &'a [U], p: &fn(t: T, u: &'a U) -> T) -> T {
let mut accum = z;
let mut i = 0;
let l = v.len();
while i < l {
// Use a while loop so that liveness analysis can handle moving
// the accumulator.
accum = p(accum, &v[i]);
i += 1;
}
accum
}
/**
* Reduces a vector from right to left. Note that the argument order is
* reversed compared to `foldl` to reflect the order they are provided to
* the closure.
*
* # Arguments
* * `v` - vector to iterate over
* * `z` - initial accumulator value
* * `p` - a closure to do operate on vector elements
*
* # Examples
*
* Sum all values in the vector [1, 2, 3]:
*
* ~~~ {.rust}
* vec::foldr([1, 2, 3], 0, |a, b| a + *b);
* ~~~
*
*/
pub fn foldr<'a, T, U>(v: &'a [T], mut z: U, p: &fn(t: &'a T, u: U) -> U) -> U {
let mut i = v.len();
while i > 0 {
i -= 1;
z = p(&v[i], z);
}
return z;
}
/**
* Return true if a predicate matches any elements
*
* If the vector contains no elements then false is returned.
*/
pub fn any<T>(v: &[T], f: &fn(t: &T) -> bool) -> bool {
for each(v) |elem| { if f(elem) { return true; } }
false
}
/**
* Return true if a predicate matches any elements in both vectors.
*
* If the vectors contains no elements then false is returned.
*/
pub fn any2<T, U>(v0: &[T], v1: &[U],
f: &fn(a: &T, b: &U) -> bool) -> bool {
let v0_len = len(v0);
let v1_len = len(v1);
let mut i = 0u;
while i < v0_len && i < v1_len {
if f(&v0[i], &v1[i]) { return true; };
i += 1u;
}
false
}
/**
* Return true if a predicate matches all elements
*
* If the vector contains no elements then true is returned.
*/
pub fn all<T>(v: &[T], f: &fn(t: &T) -> bool) -> bool {
for each(v) |elem| { if !f(elem) { return false; } }
true
}
/**
* Return true if a predicate matches all elements
*
* If the vector contains no elements then true is returned.
*/
pub fn alli<T>(v: &[T], f: &fn(uint, t: &T) -> bool) -> bool {
for eachi(v) |i, elem| { if !f(i, elem) { return false; } }
true
}
/**
* Return true if a predicate matches all elements in both vectors.
*
* If the vectors are not the same size then false is returned.
*/
pub fn all2<T, U>(v0: &[T], v1: &[U],
f: &fn(t: &T, u: &U) -> bool) -> bool {
let v0_len = len(v0);
if v0_len != len(v1) { return false; }
let mut i = 0u;
while i < v0_len { if !f(&v0[i], &v1[i]) { return false; }; i += 1u; }
true
}
/// Return true if a vector contains an element with the given value
pub fn contains<T:Eq>(v: &[T], x: &T) -> bool {
for each(v) |elt| { if *x == *elt { return true; } }
false
}
/// Returns the number of elements that are equal to a given value
pub fn count<T:Eq>(v: &[T], x: &T) -> uint {
let mut cnt = 0u;
for each(v) |elt| { if *x == *elt { cnt += 1u; } }
cnt
}
/**
* Search for the first element that matches a given predicate
*
@ -1598,34 +1472,6 @@ pub fn eachi<'r,T>(v: &'r [T], f: &fn(uint, v: &'r T) -> bool) -> bool {
return true;
}
/**
* Iterates over a vector's elements in reverse
*
* Return true to continue, false to break.
*/
#[inline(always)]
pub fn each_reverse<'r,T>(v: &'r [T], blk: &fn(v: &'r T) -> bool) -> bool {
eachi_reverse(v, |_i, v| blk(v))
}
/**
* Iterates over a vector's elements and indices in reverse
*
* Return true to continue, false to break.
*/
#[inline(always)]
pub fn eachi_reverse<'r,T>(v: &'r [T],
blk: &fn(i: uint, v: &'r T) -> bool) -> bool {
let mut i = v.len();
while i > 0 {
i -= 1;
if !blk(i, &v[i]) {
return false;
}
}
return true;
}
/**
* Iterate over all permutations of vector `v`.
*
@ -1964,6 +1810,7 @@ impl<'self,T:Copy> CopyableVector<T> for &'self [T] {
pub trait ImmutableVector<'self, T> {
fn slice(&self, start: uint, end: uint) -> &'self [T];
fn iter(self) -> VecIterator<'self, T>;
fn rev_iter(self) -> VecRevIterator<'self, T>;
fn head(&self) -> &'self T;
fn head_opt(&self) -> Option<&'self T>;
fn tail(&self) -> &'self [T];
@ -1974,13 +1821,9 @@ pub trait ImmutableVector<'self, T> {
fn last_opt(&self) -> Option<&'self T>;
fn position(&self, f: &fn(t: &T) -> bool) -> Option<uint>;
fn rposition(&self, f: &fn(t: &T) -> bool) -> Option<uint>;
fn each_reverse(&self, blk: &fn(&T) -> bool) -> bool;
fn eachi_reverse(&self, blk: &fn(uint, &T) -> bool) -> bool;
fn foldr<'a, U>(&'a self, z: U, p: &fn(t: &'a T, u: U) -> U) -> U;
fn map<U>(&self, f: &fn(t: &T) -> U) -> ~[U];
fn mapi<U>(&self, f: &fn(uint, t: &T) -> U) -> ~[U];
fn map_r<U>(&self, f: &fn(x: &T) -> U) -> ~[U];
fn alli(&self, f: &fn(uint, t: &T) -> bool) -> bool;
fn flat_map<U>(&self, f: &fn(t: &T) -> ~[U]) -> ~[U];
fn filter_mapped<U:Copy>(&self, f: &fn(t: &T) -> Option<U>) -> ~[U];
unsafe fn unsafe_ref(&self, index: uint) -> *T;
@ -2002,6 +1845,15 @@ impl<'self,T> ImmutableVector<'self, T> for &'self [T] {
lifetime: cast::transmute(p)}
}
}
#[inline]
fn rev_iter(self) -> VecRevIterator<'self, T> {
unsafe {
let p = vec::raw::to_ptr(self);
VecRevIterator{ptr: p.offset(self.len() - 1),
end: p.offset(-1),
lifetime: cast::transmute(p)}
}
}
/// Returns the first element of a vector, failing if the vector is empty.
#[inline]
@ -2059,24 +1911,6 @@ impl<'self,T> ImmutableVector<'self, T> for &'self [T] {
rposition(*self, f)
}
/// Iterates over a vector's elements in reverse.
#[inline]
fn each_reverse(&self, blk: &fn(&T) -> bool) -> bool {
each_reverse(*self, blk)
}
/// Iterates over a vector's elements and indices in reverse.
#[inline]
fn eachi_reverse(&self, blk: &fn(uint, &T) -> bool) -> bool {
eachi_reverse(*self, blk)
}
/// Reduce a vector from right to left
#[inline]
fn foldr<'a, U>(&'a self, z: U, p: &fn(t: &'a T, u: U) -> U) -> U {
foldr(*self, z, p)
}
/// Apply a function to each element of a vector and return the results
#[inline]
fn map<U>(&self, f: &fn(t: &T) -> U) -> ~[U] { map(*self, f) }
@ -2100,14 +1934,6 @@ impl<'self,T> ImmutableVector<'self, T> for &'self [T] {
r
}
/**
* Returns true if the function returns true for all elements.
*
* If the vector is empty, true is returned.
*/
fn alli(&self, f: &fn(uint, t: &T) -> bool) -> bool {
alli(*self, f)
}
/**
* Apply a function to each element of a vector and return a concatenation
* of each result vector
@ -2350,7 +2176,8 @@ impl<T:Eq> OwnedEqVector<T> for ~[T] {
#[allow(missing_doc)]
pub trait MutableVector<'self, T> {
fn mut_slice(self, start: uint, end: uint) -> &'self mut [T];
fn mut_iter(self) -> MutVecIterator<'self, T>;
fn mut_iter(self) -> VecMutIterator<'self, T>;
fn mut_rev_iter(self) -> VecMutRevIterator<'self, T>;
unsafe fn unsafe_mut_ref(&self, index: uint) -> *mut T;
unsafe fn unsafe_set(&self, index: uint, val: T);
@ -2363,14 +2190,23 @@ impl<'self,T> MutableVector<'self, T> for &'self mut [T] {
}
#[inline]
fn mut_iter(self) -> MutVecIterator<'self, T> {
fn mut_iter(self) -> VecMutIterator<'self, T> {
unsafe {
let p = vec::raw::to_mut_ptr(self);
MutVecIterator{ptr: p, end: p.offset(self.len()),
VecMutIterator{ptr: p, end: p.offset(self.len()),
lifetime: cast::transmute(p)}
}
}
fn mut_rev_iter(self) -> VecMutRevIterator<'self, T> {
unsafe {
let p = vec::raw::to_mut_ptr(self);
VecMutRevIterator{ptr: p.offset(self.len() - 1),
end: p.offset(-1),
lifetime: cast::transmute(p)}
}
}
#[inline(always)]
unsafe fn unsafe_mut_ref(&self, index: uint) -> *mut T {
let pair_ptr: &(*mut T, uint) = transmute(self);
@ -2872,52 +2708,69 @@ impl<A:Clone> Clone for ~[A] {
}
}
/// An external iterator for vectors (use with the std::iterator module)
macro_rules! iterator {
/* FIXME: #4375 Cannot attach documentation/attributes to a macro generated struct.
(struct $name:ident -> $ptr:ty, $elem:ty) => {
pub struct $name<'self, T> {
priv ptr: $ptr,
priv end: $ptr,
priv lifetime: $elem // FIXME: #5922
}
};*/
(impl $name:ident -> $elem:ty, $step:expr) => {
// could be implemented with &[T] with .slice(), but this avoids bounds checks
impl<'self, T> Iterator<$elem> for $name<'self, T> {
#[inline]
fn next(&mut self) -> Option<$elem> {
unsafe {
if self.ptr == self.end {
None
} else {
let old = self.ptr;
self.ptr = self.ptr.offset($step);
Some(cast::transmute(old))
}
}
}
}
}
}
//iterator!{struct VecIterator -> *T, &'self T}
/// An iterator for iterating over a vector
pub struct VecIterator<'self, T> {
priv ptr: *T,
priv end: *T,
priv lifetime: &'self T // FIXME: #5922
}
iterator!{impl VecIterator -> &'self T, 1}
// could be implemented with &[T] with .slice(), but this avoids bounds checks
impl<'self, T> Iterator<&'self T> for VecIterator<'self, T> {
#[inline]
fn next(&mut self) -> Option<&'self T> {
unsafe {
if self.ptr == self.end {
None
} else {
let old = self.ptr;
self.ptr = self.ptr.offset(1);
Some(cast::transmute(old))
}
}
}
//iterator!{struct VecRevIterator -> *T, &'self T}
/// An iterator for iterating over a vector in reverse
pub struct VecRevIterator<'self, T> {
priv ptr: *T,
priv end: *T,
priv lifetime: &'self T // FIXME: #5922
}
iterator!{impl VecRevIterator -> &'self T, -1}
/// An external iterator for vectors with the possibility of mutating
/// elements. (use with the std::iterator module)
pub struct MutVecIterator<'self, T> {
//iterator!{struct VecMutIterator -> *mut T, &'self mut T}
/// An iterator for mutating the elements of a vector
pub struct VecMutIterator<'self, T> {
priv ptr: *mut T,
priv end: *mut T,
priv lifetime: &'self mut T // FIXME: #5922
}
iterator!{impl VecMutIterator -> &'self mut T, 1}
// could be implemented with &[T] with .slice(), but this avoids bounds checks
impl<'self, T> Iterator<&'self mut T> for MutVecIterator<'self, T> {
#[inline]
fn next(&mut self) -> Option<&'self mut T> {
unsafe {
if self.ptr == self.end {
None
} else {
let old = self.ptr;
self.ptr = self.ptr.offset(1);
Some(cast::transmute(old))
}
}
}
//iterator!{struct VecMutRevIterator -> *mut T, &'self mut T}
/// An iterator for mutating the elements of a vector in reverse
pub struct VecMutRevIterator<'self, T> {
priv ptr: *mut T,
priv end: *mut T,
priv lifetime: &'self mut T // FIXME: #5922
}
iterator!{impl VecMutRevIterator -> &'self mut T, -1}
impl<T> FromIter<T> for ~[T]{
#[inline(always)]
@ -3467,39 +3320,6 @@ mod tests {
assert_eq!(v, ~[1, 3, 5]);
}
#[test]
fn test_foldl() {
// Test on-stack fold.
let mut v = ~[1u, 2u, 3u];
let mut sum = foldl(0u, v, add);
assert_eq!(sum, 6u);
// Test on-heap fold.
v = ~[1u, 2u, 3u, 4u, 5u];
sum = foldl(0u, v, add);
assert_eq!(sum, 15u);
}
#[test]
fn test_foldl2() {
fn sub(a: int, b: &int) -> int {
a - *b
}
let v = ~[1, 2, 3, 4];
let sum = foldl(0, v, sub);
assert_eq!(sum, -10);
}
#[test]
fn test_foldr() {
fn sub(a: &int, b: int) -> int {
*a - b
}
let v = ~[1, 2, 3, 4];
let sum = foldr(v, 0, sub);
assert_eq!(sum, -2);
}
#[test]
fn test_each_empty() {
for each::<int>([]) |_v| {
@ -3527,52 +3347,15 @@ mod tests {
assert_eq!(i, 6);
}
#[test]
fn test_each_reverse_empty() {
let v: ~[int] = ~[];
for v.each_reverse |_v| {
fail!(); // should never execute
}
}
#[test]
fn test_each_reverse_nonempty() {
let mut i = 0;
for each_reverse([1, 2, 3]) |v| {
if i == 0 { assert!(*v == 3); }
i += *v
}
assert_eq!(i, 6);
}
#[test]
fn test_eachi_reverse() {
let mut i = 0;
for eachi_reverse([0, 1, 2]) |j, v| {
if i == 0 { assert!(*v == 2); }
assert_eq!(j, *v as uint);
i += *v;
}
assert_eq!(i, 3);
}
#[test]
fn test_eachi_reverse_empty() {
let v: ~[int] = ~[];
for v.eachi_reverse |_i, _v| {
fail!(); // should never execute
}
}
#[test]
fn test_each_ret_len0() {
let mut a0 : [int, .. 0] = [];
let a0 : [int, .. 0] = [];
assert_eq!(each(a0, |_p| fail!()), true);
}
#[test]
fn test_each_ret_len1() {
let mut a1 = [17];
let a1 = [17];
assert_eq!(each(a1, |_p| true), true);
assert_eq!(each(a1, |_p| false), false);
}
@ -3600,33 +3383,6 @@ mod tests {
~[~[5,2,0],~[5,0,2],~[2,5,0],~[2,0,5],~[0,5,2],~[0,2,5]]);
}
#[test]
fn test_any_and_all() {
assert!(any([1u, 2u, 3u], is_three));
assert!(!any([0u, 1u, 2u], is_three));
assert!(any([1u, 2u, 3u, 4u, 5u], is_three));
assert!(!any([1u, 2u, 4u, 5u, 6u], is_three));
assert!(all([3u, 3u, 3u], is_three));
assert!(!all([3u, 3u, 2u], is_three));
assert!(all([3u, 3u, 3u, 3u, 3u], is_three));
assert!(!all([3u, 3u, 0u, 1u, 2u], is_three));
}
#[test]
fn test_any2_and_all2() {
assert!(any2([2u, 4u, 6u], [2u, 4u, 6u], is_equal));
assert!(any2([1u, 2u, 3u], [4u, 5u, 3u], is_equal));
assert!(!any2([1u, 2u, 3u], [4u, 5u, 6u], is_equal));
assert!(any2([2u, 4u, 6u], [2u, 4u], is_equal));
assert!(all2([2u, 4u, 6u], [2u, 4u, 6u], is_equal));
assert!(!all2([1u, 2u, 3u], [4u, 5u, 3u], is_equal));
assert!(!all2([1u, 2u, 3u], [4u, 5u, 6u], is_equal));
assert!(!all2([2u, 4u, 6u], [2u, 4u], is_equal));
}
#[test]
fn test_zip_unzip() {
let v1 = ~[1, 2, 3];
@ -4371,113 +4127,6 @@ mod tests {
};
}
#[test]
#[ignore(windows)]
#[should_fail]
#[allow(non_implicitly_copyable_typarams)]
fn test_foldl_fail() {
let v = [(~0, @0), (~0, @0), (~0, @0), (~0, @0)];
let mut i = 0;
do foldl((~0, @0), v) |_a, _b| {
if i == 2 {
fail!()
}
i += 0;
(~0, @0)
};
}
#[test]
#[ignore(windows)]
#[should_fail]
#[allow(non_implicitly_copyable_typarams)]
fn test_foldr_fail() {
let v = [(~0, @0), (~0, @0), (~0, @0), (~0, @0)];
let mut i = 0;
do foldr(v, (~0, @0)) |_a, _b| {
if i == 2 {
fail!()
}
i += 0;
(~0, @0)
};
}
#[test]
#[ignore(windows)]
#[should_fail]
fn test_any_fail() {
let v = [(~0, @0), (~0, @0), (~0, @0), (~0, @0)];
let mut i = 0;
do any(v) |_elt| {
if i == 2 {
fail!()
}
i += 0;
false
};
}
#[test]
#[ignore(windows)]
#[should_fail]
fn test_any2_fail() {
let v = [(~0, @0), (~0, @0), (~0, @0), (~0, @0)];
let mut i = 0;
do any(v) |_elt| {
if i == 2 {
fail!()
}
i += 0;
false
};
}
#[test]
#[ignore(windows)]
#[should_fail]
fn test_all_fail() {
let v = [(~0, @0), (~0, @0), (~0, @0), (~0, @0)];
let mut i = 0;
do all(v) |_elt| {
if i == 2 {
fail!()
}
i += 0;
true
};
}
#[test]
#[ignore(windows)]
#[should_fail]
fn test_alli_fail() {
let v = [(~0, @0), (~0, @0), (~0, @0), (~0, @0)];
let mut i = 0;
do alli(v) |_i, _elt| {
if i == 2 {
fail!()
}
i += 0;
true
};
}
#[test]
#[ignore(windows)]
#[should_fail]
fn test_all2_fail() {
let v = [(~0, @0), (~0, @0), (~0, @0), (~0, @0)];
let mut i = 0;
do all2(v, v) |_elt1, _elt2| {
if i == 2 {
fail!()
}
i += 0;
true
};
}
#[test]
#[ignore(windows)]
#[should_fail]
@ -4642,6 +4291,30 @@ mod tests {
assert_eq!(xs, [2, 3, 4, 5, 6])
}
#[test]
fn test_rev_iterator() {
use iterator::*;
let xs = [1, 2, 5, 10, 11];
let ys = [11, 10, 5, 2, 1];
let mut i = 0;
for xs.rev_iter().advance |&x| {
assert_eq!(x, ys[i]);
i += 1;
}
assert_eq!(i, 5);
}
#[test]
fn test_mut_rev_iterator() {
use iterator::*;
let mut xs = [1u, 2, 3, 4, 5];
for xs.mut_rev_iter().enumerate().advance |(i,x)| {
*x += i;
}
assert_eq!(xs, [5, 5, 5, 5, 5])
}
#[test]
fn test_reverse_part() {
let mut values = [1,2,3,4,5];

View file

@ -15,7 +15,7 @@ use core::prelude::*;
use codemap::{span, spanned};
use abi::AbiSet;
use opt_vec::OptVec;
use parse::token::{ident_to_str, interner_get, str_to_ident};
use parse::token::{interner_get, str_to_ident};
use core::hashmap::HashMap;
use core::option::Option;

View file

@ -792,6 +792,7 @@ mod test {
use ast::*;
use super::*;
use core::io;
use core::iterator::IteratorUtil;
#[test] fn xorpush_test () {
let mut s = ~[];
@ -833,7 +834,7 @@ mod test {
// returning the resulting index
fn unfold_test_sc(tscs : ~[TestSC], tail: SyntaxContext, table : &mut SCTable)
-> SyntaxContext {
tscs.foldr(tail, |tsc : &TestSC,tail : SyntaxContext|
tscs.rev_iter().fold(tail, |tail : SyntaxContext, tsc : &TestSC|
{match *tsc {
M(mrk) => new_mark_internal(mrk,tail,table),
R(ident,name) => new_rename_internal(ident,name,tail,table)}})
@ -874,7 +875,7 @@ mod test {
// extend a syntax context with a sequence of marks given
// in a vector. v[0] will be the outermost mark.
fn unfold_marks(mrks:~[Mrk],tail:SyntaxContext,table: &mut SCTable) -> SyntaxContext {
mrks.foldr(tail, |mrk:&Mrk,tail:SyntaxContext|
mrks.rev_iter().fold(tail, |tail:SyntaxContext, mrk:&Mrk|
{new_mark_internal(*mrk,tail,table)})
}

View file

@ -19,6 +19,7 @@ use codemap::BytePos;
use diagnostic::span_handler;
use parse::comments::{doc_comment_style, strip_doc_comment_decoration};
use core::iterator::IteratorUtil;
use core::hashmap::HashSet;
use core::vec;
use extra;
@ -313,7 +314,7 @@ pub enum inline_attr {
/// True if something like #[inline] is found in the list of attrs.
pub fn find_inline_attr(attrs: &[ast::attribute]) -> inline_attr {
// FIXME (#2809)---validate the usage of #[inline] and #[inline(always)]
do vec::foldl(ia_none, attrs) |ia,attr| {
do attrs.iter().fold(ia_none) |ia,attr| {
match attr.node.value.node {
ast::meta_word(@~"inline") => ia_hint,
ast::meta_list(@~"inline", ref items) => {

View file

@ -10,6 +10,7 @@
/* The compiler code necessary to support the bytes! extension. */
use core::iterator::IteratorUtil;
use ast;
use codemap::span;
use ext::base::*;
@ -27,7 +28,7 @@ pub fn expand_syntax_ext(cx: @ExtCtxt, sp: span, tts: &[ast::token_tree]) -> bas
ast::expr_lit(lit) => match lit.node {
// string literal, push each byte to vector expression
ast::lit_str(s) => {
for s.each |byte| {
for s.bytes_iter().advance |byte| {
bytes.push(cx.expr_u8(sp, byte));
}
}

View file

@ -1025,11 +1025,11 @@ pub fn cs_fold(use_foldl: bool,
match *substructure.fields {
EnumMatching(_, _, ref all_fields) | Struct(ref all_fields) => {
if use_foldl {
do all_fields.foldl(base) |&old, &(_, self_f, other_fs)| {
do all_fields.iter().fold(base) |old, &(_, self_f, other_fs)| {
f(cx, span, old, self_f, other_fs)
}
} else {
do all_fields.foldr(base) |&(_, self_f, other_fs), old| {
do all_fields.rev_iter().fold(base) |old, &(_, self_f, other_fs)| {
f(cx, span, old, self_f, other_fs)
}
}
@ -1094,11 +1094,11 @@ pub fn cs_same_method_fold(use_foldl: bool,
cs_same_method(
|cx, span, vals| {
if use_foldl {
do vals.foldl(base) |&old, &new| {
do vals.iter().fold(base) |old, &new| {
f(cx, span, old, new)
}
} else {
do vals.foldr(base) |&new, old| {
do vals.rev_iter().fold(base) |old, &new| {
f(cx, span, old, new)
}
}

View file

@ -16,7 +16,7 @@ use ext::base::ExtCtxt;
use ext::build::AstBuilder;
use ext::deriving::generic::*;
use core::vec;
use core::iterator::IteratorUtil;
pub fn expand_deriving_iter_bytes(cx: @ExtCtxt,
span: span,
@ -85,7 +85,7 @@ fn iter_bytes_substructure(cx: @ExtCtxt, span: span, substr: &Substructure) -> @
cx.span_bug(span, "#[deriving(IterBytes)] needs at least one field");
}
do vec::foldl(exprs[0], exprs.slice(1, exprs.len())) |prev, me| {
do exprs.slice(1, exprs.len()).iter().fold(exprs[0]) |prev, me| {
cx.expr_binary(span, and, prev, *me)
}
}

View file

@ -19,6 +19,7 @@ library.
*/
use core::prelude::*;
use core::iterator::IteratorUtil;
use ast::{enum_def, ident, item, Generics, meta_item, struct_def};
use ext::base::ExtCtxt;
@ -74,7 +75,7 @@ pub fn expand_meta_deriving(cx: @ExtCtxt,
in_items
}
meta_list(_, ref titems) => {
do titems.foldr(in_items) |&titem, in_items| {
do titems.rev_iter().fold(in_items) |in_items, &titem| {
match titem.node {
meta_name_value(tname, _) |
meta_list(tname, _) |

View file

@ -11,11 +11,11 @@
use core::prelude::*;
use ast::{blk_, attribute_, attr_outer, meta_word};
use ast::{crate, decl_local, expr_, expr_mac, mac_invoc_tt};
use ast::{item_mac, local_, stmt_, stmt_decl, stmt_mac, stmt_expr, stmt_semi};
use ast::{SCTable, illegal_ctxt};
use ast::{crate, expr_, expr_mac, mac_invoc_tt};
use ast::{item_mac, stmt_, stmt_mac, stmt_expr, stmt_semi};
use ast::{illegal_ctxt};
use ast;
use ast_util::{new_rename, new_mark, resolve, get_sctable};
use ast_util::{new_rename, new_mark, resolve};
use attr;
use codemap;
use codemap::{span, CallInfo, ExpandedFrom, NameAndSpan, spanned};
@ -23,10 +23,11 @@ use ext::base::*;
use fold::*;
use parse;
use parse::{parse_item_from_source_str};
use parse::token::{ident_to_str, intern, fresh_name};
use parse::token::{ident_to_str, intern};
use visit;
use visit::{Visitor,mk_vt};
use visit::Visitor;
use core::iterator::IteratorUtil;
use core::vec;
pub fn expand_expr(extsbox: @mut SyntaxEnv,
@ -128,7 +129,7 @@ pub fn expand_mod_items(extsbox: @mut SyntaxEnv,
// decorated with "item decorators", then use that function to transform
// the item into a new set of items.
let new_items = do vec::flat_map(module_.items) |item| {
do vec::foldr(item.attrs, ~[*item]) |attr, items| {
do item.attrs.rev_iter().fold(~[*item]) |items, attr| {
let mname = attr::get_attr_name(attr);
match (*extsbox).find(&intern(*mname)) {
@ -748,16 +749,14 @@ mod test {
use super::*;
use ast;
use ast::{attribute_, attr_outer, meta_word, empty_ctxt};
use ast_util::{get_sctable};
use codemap;
use codemap::spanned;
use parse;
use parse::token::{gensym, intern, get_ident_interner};
use parse::token::{intern, get_ident_interner};
use print::pprust;
use util::parser_testing::{string_to_item, string_to_pat, strs_to_idents};
use visit::{mk_vt,Visitor};
use visit::{mk_vt};
use core::io;
use core::option::{None, Some};
// make sure that fail! is present

View file

@ -129,12 +129,12 @@ pub fn copy_up(mpu: &matcher_pos_up) -> ~MatcherPos {
}
pub fn count_names(ms: &[matcher]) -> uint {
vec::foldl(0u, ms, |ct, m| {
do ms.iter().fold(0) |ct, m| {
ct + match m.node {
match_tok(_) => 0u,
match_seq(ref more_ms, _, _, _, _) => count_names((*more_ms)),
match_nonterminal(_,_,_) => 1u
}})
}}
}
pub fn initial_matcher_pos(ms: ~[matcher], sep: Option<Token>, lo: BytePos)

View file

@ -19,9 +19,9 @@ use parse::token::{EOF, INTERPOLATED, IDENT, Token, nt_ident};
use parse::token::{ident_to_str};
use parse::lexer::TokenAndSpan;
use core::iterator::IteratorUtil;
use core::hashmap::HashMap;
use core::option;
use core::vec;
///an unzipping of `token_tree`s
struct TtFrame {
@ -113,9 +113,7 @@ fn lookup_cur_matched_by_matched(r: &mut TtReader,
matched_seq(ref ads, _) => ads[*idx]
}
}
let r = &mut *r;
let repeat_idx = &r.repeat_idx;
vec::foldl(start, *repeat_idx, red)
r.repeat_idx.iter().fold(start, red)
}
fn lookup_cur_matched(r: &mut TtReader, name: ident) -> @named_match {
@ -152,10 +150,10 @@ fn lockstep_iter_size(t: &token_tree, r: &mut TtReader) -> lis {
}
match *t {
tt_delim(ref tts) | tt_seq(_, ref tts, _, _) => {
vec::foldl(lis_unconstrained, *tts, |lis, tt| {
do tts.iter().fold(lis_unconstrained) |lis, tt| {
let lis2 = lockstep_iter_size(tt, r);
lis_merge(lis, lis2)
})
}
}
tt_tok(*) => lis_unconstrained,
tt_nonterminal(_, name) => match *lookup_cur_matched(r, name) {

View file

@ -19,8 +19,8 @@ use parse::lexer::{is_line_non_doc_comment, is_block_non_doc_comment};
use parse::lexer;
use parse::token;
use parse::token::{get_ident_interner};
use parse;
use core::iterator::IteratorUtil;
use core::io;
use core::str;
use core::uint;
@ -78,7 +78,7 @@ pub fn strip_doc_comment_decoration(comment: &str) -> ~str {
if line.trim().is_empty() {
loop;
}
for line.each_chari |j, c| {
for line.iter().enumerate().advance |(j, c)| {
if j >= i {
break;
}
@ -91,7 +91,7 @@ pub fn strip_doc_comment_decoration(comment: &str) -> ~str {
return do lines.map |line| {
let mut chars = ~[];
for str::each_char(*line) |c| { chars.push(c) }
for line.iter().advance |c| { chars.push(c) }
if i > chars.len() {
~""
} else {

View file

@ -341,10 +341,9 @@ mod test {
use codemap::{span, BytePos, spanned};
use opt_vec;
use ast;
use ast::{new_ident};
use abi;
use parse::parser::Parser;
use parse::token::{intern, str_to_ident};
use parse::token::{str_to_ident};
use util::parser_testing::{string_to_tts_and_sess, string_to_parser};
use util::parser_testing::{string_to_expr, string_to_item};
use util::parser_testing::{string_to_stmt, strs_to_idents};

View file

@ -22,7 +22,6 @@ use core::char;
use core::cmp::Equiv;
use core::local_data;
use core::str;
use core::hashmap::HashSet;
use core::rand;
use core::rand::RngUtil;
use core::to_bytes;

View file

@ -21,6 +21,7 @@ use extra::arc;
use extra::time;
use extra::deque::Deque;
use extra::par;
use std::iterator::IteratorUtil;
use std::hashmap::HashSet;
use std::int::abs;
use std::io;
@ -111,7 +112,7 @@ fn gen_search_keys(graph: &[~[node_id]], n: uint) -> ~[node_id] {
while keys.len() < n {
let k = r.gen_uint_range(0u, graph.len());
if graph[k].len() > 0u && vec::any(graph[k], |i| {
if graph[k].len() > 0u && graph[k].iter().any(|i| {
*i != k as node_id
}) {
keys.insert(k as node_id);
@ -187,7 +188,7 @@ fn bfs2(graph: graph, key: node_id) -> bfs_result {
}
let mut i = 0;
while vec::any(colors, is_gray) {
while colors.iter().any(is_gray) {
// Do the BFS.
info!("PBFS iteration %?", i);
i += 1;
@ -362,7 +363,7 @@ fn validate(edges: ~[(node_id, node_id)],
info!(~"Verifying tree edges...");
let status = do tree.alli() |k, parent| {
let status = do tree.iter().enumerate().all |(k, parent)| {
if *parent != root && *parent != -1i64 {
level[*parent] == level[k] - 1
}

View file

@ -8,12 +8,12 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
use std::vec;
use std::iterator::IteratorUtil;
fn compute1() -> float {
let v = ~[0f, 1f, 2f, 3f];
do vec::foldl(0f, v) |x, y| { x + *y } - 10f
do v.iter().fold(0f) |x, y| { x + *y } - 10f
//~^ ERROR mismatched types: expected `()`
}

View file

@ -8,13 +8,13 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
use std::vec;
use std::iterator::IteratorUtil;
fn main() {
let needlesArr: ~[char] = ~['a', 'f'];
do vec::foldr(needlesArr) |x, y| {
do needlesArr.iter().fold() |x, y| {
}
//~^ ERROR 2 parameters were supplied (including the closure passed by the `do` keyword)
//~^ ERROR 1 parameter was supplied (including the closure passed by the `do` keyword)
//
// the first error is, um, non-ideal.
}

View file

@ -8,13 +8,13 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
use std::vec;
use std::iterator::IteratorUtil;
pub fn main() {
let v = ~[-1f, 0f, 1f, 2f, 3f];
// Trailing expressions don't require parentheses:
let y = do vec::foldl(0f, v) |x, y| { x + *y } + 10f;
let y = do v.iter().fold(0f) |x, y| { x + *y } + 10f;
assert_eq!(y, 15f);
}

View file

@ -8,11 +8,11 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
use std::vec;
use std::iterator::IteratorUtil;
pub fn main() {
fn f(i: &fn() -> uint) -> uint { i() }
let v = ~[-1f, 0f, 1f, 2f, 3f];
let z = do do vec::foldl(f, v) |x, _y| { x } { 22u };
let z = do do v.iter().fold(f) |x, _y| { x } { 22u };
assert_eq!(z, 22u);
}

View file

@ -8,11 +8,11 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
use std::vec;
use std::iterator::IteratorUtil;
pub fn main() {
fn f(i: uint) -> uint { i }
let v = ~[-1f, 0f, 1f, 2f, 3f];
let z = do vec::foldl(f, v) |x, _y| { x } (22u);
let z = do v.iter().fold(f) |x, _y| { x } (22u);
assert_eq!(z, 22u);
}

View file

@ -8,25 +8,26 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
use std::iterator::IteratorUtil;
use std::vec;
fn w_semi(v: ~[int]) -> int {
// the semicolon causes compiler not to
// complain about the ignored return value:
do vec::foldl(0, v) |x,y| { x+*y };
do v.iter().fold(0) |x,y| { x+*y };
-10
}
fn w_paren1(v: ~[int]) -> int {
(do vec::foldl(0, v) |x,y| { x+*y }) - 10
(do v.iter().fold(0) |x,y| { x+*y }) - 10
}
fn w_paren2(v: ~[int]) -> int {
(do vec::foldl(0, v) |x,y| { x+*y} - 10)
(do v.iter().fold(0) |x,y| { x+*y} - 10)
}
fn w_ret(v: ~[int]) -> int {
return do vec::foldl(0, v) |x,y| { x+*y } - 10;
return do v.iter().fold(0) |x,y| { x+*y } - 10;
}
pub fn main() {

View file

@ -8,6 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
use std::iterator::IteratorUtil;
use std::vec;
// Check usage and precedence of block arguments in expressions:
@ -20,28 +21,28 @@ pub fn main() {
}
// Usable at all:
let mut any_negative = do vec::any(v) |e| { e.is_negative() };
let mut any_negative = do v.iter().any |e| { e.is_negative() };
assert!(any_negative);
// Higher precedence than assignments:
any_negative = do vec::any(v) |e| { e.is_negative() };
any_negative = do v.iter().any |e| { e.is_negative() };
assert!(any_negative);
// Higher precedence than unary operations:
let abs_v = do vec::map(v) |e| { e.abs() };
assert!(do vec::all(abs_v) |e| { e.is_positive() });
assert!(!do vec::any(abs_v) |e| { e.is_negative() });
assert!(do abs_v.iter().all |e| { e.is_positive() });
assert!(!do abs_v.iter().any |e| { e.is_negative() });
// Usable in funny statement-like forms:
if !do vec::any(v) |e| { e.is_positive() } {
if !do v.iter().any |e| { e.is_positive() } {
assert!(false);
}
match do vec::all(v) |e| { e.is_negative() } {
match do v.iter().all |e| { e.is_negative() } {
true => { fail!("incorrect answer."); }
false => { }
}
match 3 {
_ if do vec::any(v) |e| { e.is_negative() } => {
_ if do v.iter().any |e| { e.is_negative() } => {
}
_ => {
fail!("wrong answer.");
@ -50,15 +51,15 @@ pub fn main() {
// Lower precedence than binary operations:
let w = do vec::foldl(0f, v) |x, y| { x + *y } + 10f;
let y = do vec::foldl(0f, v) |x, y| { x + *y } + 10f;
let z = 10f + do vec::foldl(0f, v) |x, y| { x + *y };
let w = do v.iter().fold(0f) |x, y| { x + *y } + 10f;
let y = do v.iter().fold(0f) |x, y| { x + *y } + 10f;
let z = 10f + do v.iter().fold(0f) |x, y| { x + *y };
assert_eq!(w, y);
assert_eq!(y, z);
// In the tail of a block
let w =
if true { do vec::any(abs_v) |e| { e.is_positive() } }
if true { do abs_v.iter().any |e| { e.is_positive() } }
else { false };
assert!(w);
}

View file

@ -14,6 +14,7 @@
extern mod extra;
use std::iterator::IteratorUtil;
use std::io::ReaderUtil;
use std::io;
use std::str;
@ -67,7 +68,7 @@ fn read_board_grid<rdr:'static + io::Reader>(in: rdr) -> ~[~[square]] {
let mut grid = ~[];
for in.each_line |line| {
let mut row = ~[];
for str::each_char(line) |c| {
for line.iter().advance |c| {
row.push(square_from_char(c))
}
grid.push(row)

View file

@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
use std::str;
use std::iterator::IteratorUtil;
pub fn main() {
let x = ~[1, 2, 3];
@ -18,7 +18,7 @@ pub fn main() {
assert_eq!(y, 6);
let s = ~"hello there";
let mut i: int = 0;
for str::each(s) |c| {
for s.bytes_iter().advance |c| {
if i == 0 { assert!((c == 'h' as u8)); }
if i == 1 { assert!((c == 'e' as u8)); }
if i == 2 { assert!((c == 'l' as u8)); }

View file

@ -10,6 +10,7 @@
// xfail-fast
use std::iterator::IteratorUtil;
use std::cmp::Eq;
use std::vec;
@ -54,7 +55,8 @@ fn ret_deep() -> ~str {
pub fn main() {
let mut last = 0;
for vec::all(~[1, 2, 3, 4, 5, 6, 7]) |e| {
let v = ~[1, 2, 3, 4, 5, 6, 7];
for v.iter().all |e| {
last = *e;
if *e == 5 { break; }
if *e % 2 == 1 { loop; }

View file

@ -13,7 +13,7 @@
extern mod extra;
use std::vec;
use std::iterator::IteratorUtil;
#[test]
#[ignore(cfg(ignorecfg))]
@ -30,11 +30,9 @@ fn checktests() {
// Pull the tests out of the secreturn test module
let tests = __test::tests;
assert!(vec::any(
tests,
|t| t.desc.name.to_str() == ~"shouldignore" && t.desc.ignore));
assert!(
tests.iter().any(|t| t.desc.name.to_str() == ~"shouldignore" && t.desc.ignore));
assert!(vec::any(
tests,
|t| t.desc.name.to_str() == ~"shouldnotignore" && !t.desc.ignore));
assert!(
tests.iter().any(|t| t.desc.name.to_str() == ~"shouldnotignore" && !t.desc.ignore));
}

View file

@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
use std::str;
use std::iterator::IteratorUtil;
pub fn main() {
let yen: char = '¥'; // 0xa5
@ -43,7 +43,7 @@ pub fn main() {
fn check_str_eq(a: ~str, b: ~str) {
let mut i: int = 0;
for str::each(a) |ab| {
for a.bytes_iter().advance |ab| {
debug!(i);
debug!(ab);
let bb: u8 = b[i];