Skip to content

Commit d4b2657

Browse files
committed
---
yaml --- r: 75771 b: refs/heads/master c: 7727920 h: refs/heads/master i: 75769: 88b09de 75767: 511cd64 v: v3
1 parent e9aebd7 commit d4b2657

File tree

4 files changed

+41
-3
lines changed

4 files changed

+41
-3
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: b68eedf846e07e093e9e46b781b7a16a49bcb7b1
2+
refs/heads/master: 7727920ba279fbef9f55ffa2c334778c7ef25fc3
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 67c954e365970e4c2cd06f0c50724656d7010f45
55
refs/heads/try: 10089455287dcc3652b984ab4bfd6971e1b5f302

trunk/doc/tutorial-container.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,16 @@ for x in it.invert() {
319319
}
320320
~~~
321321
322+
The `reverse_` method is also available for any double-ended iterator yielding
323+
mutable references. It can be used to reverse a container in-place. Note that
324+
the trailing underscore is a workaround for issue #5898 and will be removed.
325+
326+
~~~
327+
let mut ys = [1, 2, 3, 4, 5];
328+
ys.mut_iter().reverse_();
329+
assert_eq!(ys, [5, 4, 3, 2, 1]);
330+
~~~
331+
322332
## Random-access iterators
323333
324334
The `RandomAccessIterator` trait represents an iterator offering random access

trunk/src/libstd/iterator.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ use ops::{Add, Mul, Sub};
2424
use cmp::Ord;
2525
use clone::Clone;
2626
use uint;
27+
use util;
2728

2829
/// Conversion from an `Iterator`
2930
pub trait FromIterator<A> {
@@ -583,6 +584,26 @@ pub trait DoubleEndedIterator<A>: Iterator<A> {
583584
}
584585
}
585586

587+
/// A double-ended iterator yielding mutable references
588+
pub trait MutableDoubleEndedIterator {
589+
// FIXME: #5898: should be called `reverse`
590+
/// Use an iterator to reverse a container in-place
591+
fn reverse_(&mut self);
592+
}
593+
594+
impl<'self, A, T: DoubleEndedIterator<&'self mut A>> MutableDoubleEndedIterator for T {
595+
// FIXME: #5898: should be called `reverse`
596+
/// Use an iterator to reverse a container in-place
597+
fn reverse_(&mut self) {
598+
loop {
599+
match (self.next(), self.next_back()) {
600+
(Some(x), Some(y)) => util::swap(x, y),
601+
_ => break
602+
}
603+
}
604+
}
605+
}
606+
586607
/// An object implementing random access indexing by `uint`
587608
///
588609
/// A `RandomAccessIterator` should be either infinite or a `DoubleEndedIterator`.
@@ -2338,4 +2359,11 @@ mod tests {
23382359
assert_eq!(range_inclusive(0i, 5).collect::<~[int]>(), ~[0i, 1, 2, 3, 4, 5]);
23392360
assert_eq!(range_inclusive(0i, 5).invert().collect::<~[int]>(), ~[5i, 4, 3, 2, 1, 0]);
23402361
}
2362+
2363+
#[test]
2364+
fn test_reverse() {
2365+
let mut ys = [1, 2, 3, 4, 5];
2366+
ys.mut_iter().reverse_();
2367+
assert_eq!(ys, [5, 4, 3, 2, 1]);
2368+
}
23412369
}

trunk/src/libstd/prelude.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ pub use container::{Container, Mutable, Map, MutableMap, Set, MutableSet};
5151
pub use hash::Hash;
5252
pub use iter::Times;
5353
pub use iterator::Extendable;
54-
pub use iterator::{Iterator, DoubleEndedIterator};
55-
pub use iterator::{ClonableIterator, OrdIterator};
54+
pub use iterator::{Iterator, DoubleEndedIterator, ClonableIterator, OrdIterator};
55+
pub use iterator::MutableDoubleEndedIterator;
5656
pub use num::{Num, NumCast, CheckedAdd, CheckedSub, CheckedMul};
5757
pub use num::{Orderable, Signed, Unsigned, Round};
5858
pub use num::{Algebraic, Trigonometric, Exponential, Hyperbolic};

0 commit comments

Comments
 (0)