Skip to content

Commit b846686

Browse files
committed
---
yaml --- r: 92799 b: refs/heads/auto c: 1b2cebc h: refs/heads/master i: 92797: 587115e 92795: 1cf753a 92791: b6b596e 92783: 8ee8058 92767: 24978ff 92735: e4a277b 92671: b5e3d83 v: v3
1 parent a590da9 commit b846686

File tree

7 files changed

+105
-38
lines changed

7 files changed

+105
-38
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ refs/heads/try3: 9387340aab40a73e8424c48fd42f0c521a4875c0
1313
refs/tags/release-0.3.1: 495bae036dfe5ec6ceafd3312b4dca48741e845b
1414
refs/tags/release-0.4: e828ea2080499553b97dfe33b3f4d472b4562ad7
1515
refs/tags/release-0.5: 7e3bcfbf21278251ee936ad53e92e9b719702d73
16-
refs/heads/auto: b6a746352646965f71fa6c4fd9b37fd94918db8a
16+
refs/heads/auto: 1b2cebc2c1f4d6e4bad36f4fa682f3d4e70cfb70
1717
refs/heads/servo: af82457af293e2a842ba6b7759b70288da276167
1818
refs/tags/release-0.6: b4ebcfa1812664df5e142f0134a5faea3918544c
1919
refs/tags/0.1: b19db808c2793fe2976759b85a355c3ad8c8b336

branches/auto/src/etc/vim/syntax/rust.vim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ syn keyword rustTrait Default
7878
syn keyword rustTrait Hash
7979
syn keyword rustTrait FromStr
8080
syn keyword rustTrait FromIterator Extendable
81-
syn keyword rustTrait Iterator DoubleEndedIterator RandomAccessIterator ClonableIterator
81+
syn keyword rustTrait Iterator DoubleEndedIterator RandomAccessIterator CloneableIterator
8282
syn keyword rustTrait OrdIterator MutableDoubleEndedIterator ExactSize
8383
syn keyword rustTrait Times
8484

branches/auto/src/libstd/io/comm_adapters.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,6 @@ mod test {
117117
use prelude::*;
118118
use super::*;
119119
use io;
120-
use comm;
121120
use task;
122121

123122
#[test]
@@ -136,7 +135,7 @@ mod test {
136135

137136
assert_eq!(false, reader.eof());
138137

139-
assert_eq!(Some(0), reader.read(~[]));
138+
assert_eq!(Some(0), reader.read([]));
140139
assert_eq!(false, reader.eof());
141140

142141
assert_eq!(Some(3), reader.read(buf));

branches/auto/src/libstd/iter.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -906,14 +906,14 @@ impl<A: Ord, T: Iterator<A>> OrdIterator<A> for T {
906906
}
907907
}
908908

909-
/// A trait for iterators that are clonable.
910-
pub trait ClonableIterator {
909+
/// A trait for iterators that are cloneable.
910+
pub trait CloneableIterator {
911911
/// Repeats an iterator endlessly
912912
///
913913
/// # Example
914914
///
915915
/// ```rust
916-
/// use std::iter::{ClonableIterator, count};
916+
/// use std::iter::{CloneableIterator, count};
917917
///
918918
/// let a = count(1,1).take(1);
919919
/// let mut cy = a.cycle();
@@ -923,7 +923,7 @@ pub trait ClonableIterator {
923923
fn cycle(self) -> Cycle<Self>;
924924
}
925925

926-
impl<A, T: Clone + Iterator<A>> ClonableIterator for T {
926+
impl<A, T: Clone + Iterator<A>> CloneableIterator for T {
927927
#[inline]
928928
fn cycle(self) -> Cycle<T> {
929929
Cycle{orig: self.clone(), iter: self}

branches/auto/src/libstd/option.rs

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ use clone::DeepClone;
4343
use cmp::{Eq, TotalEq, TotalOrd};
4444
use default::Default;
4545
use fmt;
46-
use iter::{Iterator, DoubleEndedIterator, ExactSize};
46+
use iter::{Iterator, DoubleEndedIterator, FromIterator, ExactSize};
4747
use kinds::Send;
4848
use str::OwnedStr;
4949
use to_str::ToStr;
@@ -410,6 +410,46 @@ impl<A> DoubleEndedIterator<A> for OptionIterator<A> {
410410

411411
impl<A> ExactSize<A> for OptionIterator<A> {}
412412

413+
/////////////////////////////////////////////////////////////////////////////
414+
// Free functions
415+
/////////////////////////////////////////////////////////////////////////////
416+
417+
/// Takes each element in the `Iterator`: if it is `None`, no further
418+
/// elements are taken, and the `None` is returned. Should no `None` occur, a
419+
/// vector containing the values of each `Option` is returned.
420+
///
421+
/// Here is an example which increments every integer in a vector,
422+
/// checking for overflow:
423+
///
424+
/// fn inc_conditionally(x: uint) -> Option<uint> {
425+
/// if x == uint::max_value { return None; }
426+
/// else { return Some(x+1u); }
427+
/// }
428+
/// let v = [1u, 2, 3];
429+
/// let res = collect(v.iter().map(|&x| inc_conditionally(x)));
430+
/// assert!(res == Some(~[2u, 3, 4]));
431+
#[inline]
432+
pub fn collect<T, Iter: Iterator<Option<T>>, V: FromIterator<T>>(iter: Iter) -> Option<V> {
433+
// FIXME(#11084): This should be twice as fast once this bug is closed.
434+
let mut iter = iter.scan(false, |state, x| {
435+
match x {
436+
Some(x) => Some(x),
437+
None => {
438+
*state = true;
439+
None
440+
}
441+
}
442+
});
443+
444+
let v: V = FromIterator::from_iterator(&mut iter);
445+
446+
if iter.state {
447+
None
448+
} else {
449+
Some(v)
450+
}
451+
}
452+
413453
/////////////////////////////////////////////////////////////////////////////
414454
// Tests
415455
/////////////////////////////////////////////////////////////////////////////
@@ -418,8 +458,10 @@ impl<A> ExactSize<A> for OptionIterator<A> {}
418458
mod tests {
419459
use super::*;
420460

461+
use iter::range;
421462
use str::StrSlice;
422463
use util;
464+
use vec::ImmutableVector;
423465

424466
#[test]
425467
fn test_get_ptr() {
@@ -661,4 +703,26 @@ mod tests {
661703
assert!(!x.mutate_default(0i, |i| i+1));
662704
assert_eq!(x, Some(0i));
663705
}
706+
707+
#[test]
708+
fn test_collect() {
709+
let v: Option<~[int]> = collect(range(0, 0)
710+
.map(|_| Some(0)));
711+
assert_eq!(v, Some(~[]));
712+
713+
let v: Option<~[int]> = collect(range(0, 3)
714+
.map(|x| Some(x)));
715+
assert_eq!(v, Some(~[0, 1, 2]));
716+
717+
let v: Option<~[int]> = collect(range(0, 3)
718+
.map(|x| if x > 1 { None } else { Some(x) }));
719+
assert_eq!(v, None);
720+
721+
// test that it does not take more elements than it needs
722+
let functions = [|| Some(()), || None, || fail!()];
723+
724+
let v: Option<~[()]> = collect(functions.iter().map(|f| (*f)()));
725+
726+
assert_eq!(v, None);
727+
}
664728
}

branches/auto/src/libstd/prelude.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ pub use default::Default;
5555
pub use from_str::FromStr;
5656
pub use hash::Hash;
5757
pub use iter::{FromIterator, Extendable};
58-
pub use iter::{Iterator, DoubleEndedIterator, RandomAccessIterator, ClonableIterator};
58+
pub use iter::{Iterator, DoubleEndedIterator, RandomAccessIterator, CloneableIterator};
5959
pub use iter::{OrdIterator, MutableDoubleEndedIterator, ExactSize};
6060
pub use num::Times;
6161
pub use num::{Algebraic, Trigonometric, Exponential, Hyperbolic};

branches/auto/src/libstd/result.rs

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,10 @@
1313
use clone::Clone;
1414
use cmp::Eq;
1515
use fmt;
16-
use iter::Iterator;
16+
use iter::{Iterator, FromIterator};
1717
use option::{None, Option, Some};
1818
use str::OwnedStr;
1919
use to_str::ToStr;
20-
use vec::OwnedVector;
21-
use vec;
2220

2321
/// `Result` is a type that represents either success (`Ok`) or failure (`Err`).
2422
#[deriving(Clone, DeepClone, Eq, Ord, TotalEq, TotalOrd, ToStr)]
@@ -221,10 +219,9 @@ impl<T: fmt::Default, E: fmt::Default> fmt::Default for Result<T, E> {
221219
// Free functions
222220
/////////////////////////////////////////////////////////////////////////////
223221

224-
/// Takes each element in the iterator: if it is an error, no further
225-
/// elements are taken, and the error is returned.
226-
/// Should no error occur, a vector containing the values of each Result
227-
/// is returned.
222+
/// Takes each element in the `Iterator`: if it is an `Err`, no further
223+
/// elements are taken, and the `Err` is returned. Should no `Err` occur, a
224+
/// vector containing the values of each `Result` is returned.
228225
///
229226
/// Here is an example which increments every integer in a vector,
230227
/// checking for overflow:
@@ -237,17 +234,24 @@ impl<T: fmt::Default, E: fmt::Default> fmt::Default for Result<T, E> {
237234
/// let res = collect(v.iter().map(|&x| inc_conditionally(x)));
238235
/// assert!(res == Ok(~[2u, 3, 4]));
239236
#[inline]
240-
pub fn collect<T, E, Iter: Iterator<Result<T, E>>>(mut iterator: Iter)
241-
-> Result<~[T], E> {
242-
let (lower, _) = iterator.size_hint();
243-
let mut vs: ~[T] = vec::with_capacity(lower);
244-
for t in iterator {
245-
match t {
246-
Ok(v) => vs.push(v),
247-
Err(u) => return Err(u)
237+
pub fn collect<T, E, Iter: Iterator<Result<T, E>>, V: FromIterator<T>>(iter: Iter) -> Result<V, E> {
238+
// FIXME(#11084): This should be twice as fast once this bug is closed.
239+
let mut iter = iter.scan(None, |state, x| {
240+
match x {
241+
Ok(x) => Some(x),
242+
Err(err) => {
243+
*state = Some(err);
244+
None
245+
}
248246
}
247+
});
248+
249+
let v: V = FromIterator::from_iterator(&mut iter);
250+
251+
match iter.state {
252+
Some(err) => Err(err),
253+
None => Ok(v),
249254
}
250-
Ok(vs)
251255
}
252256

253257
/// Perform a fold operation over the result values from an iterator.
@@ -291,8 +295,8 @@ mod tests {
291295
use super::*;
292296

293297
use iter::range;
294-
use vec::ImmutableVector;
295298
use to_str::ToStr;
299+
use vec::ImmutableVector;
296300

297301
pub fn op1() -> Result<int, ~str> { Ok(666) }
298302
pub fn op2() -> Result<int, ~str> { Err(~"sadface") }
@@ -347,21 +351,21 @@ mod tests {
347351
348352
#[test]
349353
fn test_collect() {
350-
assert_eq!(collect(range(0, 0)
351-
.map(|_| Ok::<int, ()>(0))),
352-
Ok(~[]));
353-
assert_eq!(collect(range(0, 3)
354-
.map(|x| Ok::<int, ()>(x))),
355-
Ok(~[0, 1, 2]));
356-
assert_eq!(collect(range(0, 3)
357-
.map(|x| if x > 1 { Err(x) } else { Ok(x) })),
358-
Err(2));
354+
let v: Result<~[int], ()> = collect(range(0, 0).map(|_| Ok::<int, ()>(0)));
355+
assert_eq!(v, Ok(~[]));
356+
357+
let v: Result<~[int], ()> = collect(range(0, 3).map(|x| Ok::<int, ()>(x)));
358+
assert_eq!(v, Ok(~[0, 1, 2]));
359+
360+
let v: Result<~[int], int> = collect(range(0, 3)
361+
.map(|x| if x > 1 { Err(x) } else { Ok(x) }));
362+
assert_eq!(v, Err(2));
359363
360364
// test that it does not take more elements than it needs
361365
let functions = [|| Ok(()), || Err(1), || fail!()];
362366
363-
assert_eq!(collect(functions.iter().map(|f| (*f)())),
364-
Err(1));
367+
let v: Result<~[()], int> = collect(functions.iter().map(|f| (*f)()));
368+
assert_eq!(v, Err(1));
365369
}
366370
367371
#[test]

0 commit comments

Comments
 (0)