Skip to content

Commit d3b4c0b

Browse files
committed
---
yaml --- r: 63120 b: refs/heads/snap-stage3 c: ce4f63d h: refs/heads/master v: v3
1 parent adf19db commit d3b4c0b

File tree

6 files changed

+108
-127
lines changed

6 files changed

+108
-127
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
refs/heads/master: 2d28d645422c1617be58c8ca7ad9a457264ca850
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
4-
refs/heads/snap-stage3: e2ec8e71cec0373616953f8188cf7c4953269af0
4+
refs/heads/snap-stage3: ce4f63dcee8997f8d2881e6e3cf9e04db085bd64
55
refs/heads/try: 7b78b52e602bb3ea8174f9b2006bff3315f03ef9
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b

branches/snap-stage3/src/libextra/num/bigint.rs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ A BigInt is a combination of BigUint and Sign.
1919
#[allow(missing_doc)];
2020

2121
use core::prelude::*;
22-
22+
use core::iterator::IteratorUtil;
2323
use core::cmp::{Eq, Ord, TotalEq, TotalOrd, Ordering, Less, Equal, Greater};
2424
use core::int;
2525
use core::num::{IntConvertible, Zero, One, ToStrRadix, FromStrRadix, Orderable};
@@ -129,12 +129,9 @@ impl TotalOrd for BigUint {
129129
if s_len < o_len { return Less; }
130130
if s_len > o_len { return Greater; }
131131

132-
for self.data.eachi_reverse |i, elm| {
133-
match (*elm, other.data[i]) {
134-
(l, r) if l < r => return Less,
135-
(l, r) if l > r => return Greater,
136-
_ => loop
137-
};
132+
for self.data.rev_iter().zip(other.data.rev_iter()).advance |(&self_i, &other_i)| {
133+
cond!((self_i < other_i) { return Less; }
134+
(self_i > other_i) { return Greater; })
138135
}
139136
return Equal;
140137
}
@@ -421,7 +418,7 @@ impl Integer for BigUint {
421418
let bn = *b.data.last();
422419
let mut d = ~[];
423420
let mut carry = 0;
424-
for an.each_reverse |elt| {
421+
for an.rev_iter().advance |elt| {
425422
let ai = BigDigit::to_uint(carry, *elt);
426423
let di = ai / (bn as uint);
427424
assert!(di < BigDigit::base);
@@ -648,7 +645,7 @@ impl BigUint {
648645

649646
let mut borrow = 0;
650647
let mut shifted = ~[];
651-
for self.data.each_reverse |elem| {
648+
for self.data.rev_iter().advance |elem| {
652649
shifted = ~[(*elem >> n_bits) | borrow] + shifted;
653650
borrow = *elem << (BigDigit::bits - n_bits);
654651
}

branches/snap-stage3/src/librustc/middle/trans/base.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ use middle::ty;
6464
use util::common::indenter;
6565
use util::ppaux::{Repr, ty_to_str};
6666

67+
use core::iterator::IteratorUtil;
6768
use core::hash;
6869
use core::hashmap::{HashMap, HashSet};
6970
use core::int;
@@ -1275,7 +1276,7 @@ pub fn trans_block_cleanups_(bcx: block,
12751276
bcx.ccx().sess.opts.debugging_opts & session::no_landing_pads != 0;
12761277
if bcx.unreachable && !no_lpads { return bcx; }
12771278
let mut bcx = bcx;
1278-
for cleanups.each_reverse |cu| {
1279+
for cleanups.rev_iter().advance |cu| {
12791280
match *cu {
12801281
clean(cfn, cleanup_type) | clean_temp(_, cfn, cleanup_type) => {
12811282
// Some types don't need to be cleaned up during

branches/snap-stage3/src/libstd/str.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3964,7 +3964,7 @@ mod tests {
39643964
let s = ~"ศไทย中华Việt Nam";
39653965
let v = ~['ศ','ไ','ท','ย','中','华','V','i','ệ','t',' ','N','a','m'];
39663966
let mut pos = s.len();
3967-
for v.each_reverse |ch| {
3967+
for v.rev_iter().advance |ch| {
39683968
assert!(s.char_at_reverse(pos) == *ch);
39693969
pos -= from_char(*ch).len();
39703970
}

branches/snap-stage3/src/libstd/unstable/lang.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
//! Runtime calls emitted by the compiler.
1212
13+
use iterator::IteratorUtil;
1314
use uint;
1415
use cast::transmute;
1516
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) {
133134
Some(borrow_list) => { // recording borrows
134135
let mut msg = ~"borrowed";
135136
let mut sep = " at ";
136-
for borrow_list.each_reverse |entry| {
137+
for borrow_list.rev_iter().advance |entry| {
137138
if entry.box == box {
138139
str::push_str(&mut msg, sep);
139140
let filename = str::raw::from_c_str(entry.file);

branches/snap-stage3/src/libstd/vec.rs

Lines changed: 96 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -1598,34 +1598,6 @@ pub fn eachi<'r,T>(v: &'r [T], f: &fn(uint, v: &'r T) -> bool) -> bool {
15981598
return true;
15991599
}
16001600

1601-
/**
1602-
* Iterates over a vector's elements in reverse
1603-
*
1604-
* Return true to continue, false to break.
1605-
*/
1606-
#[inline(always)]
1607-
pub fn each_reverse<'r,T>(v: &'r [T], blk: &fn(v: &'r T) -> bool) -> bool {
1608-
eachi_reverse(v, |_i, v| blk(v))
1609-
}
1610-
1611-
/**
1612-
* Iterates over a vector's elements and indices in reverse
1613-
*
1614-
* Return true to continue, false to break.
1615-
*/
1616-
#[inline(always)]
1617-
pub fn eachi_reverse<'r,T>(v: &'r [T],
1618-
blk: &fn(i: uint, v: &'r T) -> bool) -> bool {
1619-
let mut i = v.len();
1620-
while i > 0 {
1621-
i -= 1;
1622-
if !blk(i, &v[i]) {
1623-
return false;
1624-
}
1625-
}
1626-
return true;
1627-
}
1628-
16291601
/**
16301602
* Iterate over all permutations of vector `v`.
16311603
*
@@ -1964,6 +1936,7 @@ impl<'self,T:Copy> CopyableVector<T> for &'self [T] {
19641936
pub trait ImmutableVector<'self, T> {
19651937
fn slice(&self, start: uint, end: uint) -> &'self [T];
19661938
fn iter(self) -> VecIterator<'self, T>;
1939+
fn rev_iter(self) -> VecRevIterator<'self, T>;
19671940
fn head(&self) -> &'self T;
19681941
fn head_opt(&self) -> Option<&'self T>;
19691942
fn tail(&self) -> &'self [T];
@@ -1974,8 +1947,6 @@ pub trait ImmutableVector<'self, T> {
19741947
fn last_opt(&self) -> Option<&'self T>;
19751948
fn position(&self, f: &fn(t: &T) -> bool) -> Option<uint>;
19761949
fn rposition(&self, f: &fn(t: &T) -> bool) -> Option<uint>;
1977-
fn each_reverse(&self, blk: &fn(&T) -> bool) -> bool;
1978-
fn eachi_reverse(&self, blk: &fn(uint, &T) -> bool) -> bool;
19791950
fn foldr<'a, U>(&'a self, z: U, p: &fn(t: &'a T, u: U) -> U) -> U;
19801951
fn map<U>(&self, f: &fn(t: &T) -> U) -> ~[U];
19811952
fn mapi<U>(&self, f: &fn(uint, t: &T) -> U) -> ~[U];
@@ -2002,6 +1973,15 @@ impl<'self,T> ImmutableVector<'self, T> for &'self [T] {
20021973
lifetime: cast::transmute(p)}
20031974
}
20041975
}
1976+
#[inline]
1977+
fn rev_iter(self) -> VecRevIterator<'self, T> {
1978+
unsafe {
1979+
let p = vec::raw::to_ptr(self);
1980+
VecRevIterator{ptr: p.offset(self.len() - 1),
1981+
end: p.offset(-1),
1982+
lifetime: cast::transmute(p)}
1983+
}
1984+
}
20051985

20061986
/// Returns the first element of a vector, failing if the vector is empty.
20071987
#[inline]
@@ -2059,18 +2039,6 @@ impl<'self,T> ImmutableVector<'self, T> for &'self [T] {
20592039
rposition(*self, f)
20602040
}
20612041

2062-
/// Iterates over a vector's elements in reverse.
2063-
#[inline]
2064-
fn each_reverse(&self, blk: &fn(&T) -> bool) -> bool {
2065-
each_reverse(*self, blk)
2066-
}
2067-
2068-
/// Iterates over a vector's elements and indices in reverse.
2069-
#[inline]
2070-
fn eachi_reverse(&self, blk: &fn(uint, &T) -> bool) -> bool {
2071-
eachi_reverse(*self, blk)
2072-
}
2073-
20742042
/// Reduce a vector from right to left
20752043
#[inline]
20762044
fn foldr<'a, U>(&'a self, z: U, p: &fn(t: &'a T, u: U) -> U) -> U {
@@ -2350,7 +2318,8 @@ impl<T:Eq> OwnedEqVector<T> for ~[T] {
23502318
#[allow(missing_doc)]
23512319
pub trait MutableVector<'self, T> {
23522320
fn mut_slice(self, start: uint, end: uint) -> &'self mut [T];
2353-
fn mut_iter(self) -> MutVecIterator<'self, T>;
2321+
fn mut_iter(self) -> VecMutIterator<'self, T>;
2322+
fn mut_rev_iter(self) -> VecMutRevIterator<'self, T>;
23542323

23552324
unsafe fn unsafe_mut_ref(&self, index: uint) -> *mut T;
23562325
unsafe fn unsafe_set(&self, index: uint, val: T);
@@ -2363,14 +2332,23 @@ impl<'self,T> MutableVector<'self, T> for &'self mut [T] {
23632332
}
23642333

23652334
#[inline]
2366-
fn mut_iter(self) -> MutVecIterator<'self, T> {
2335+
fn mut_iter(self) -> VecMutIterator<'self, T> {
23672336
unsafe {
23682337
let p = vec::raw::to_mut_ptr(self);
2369-
MutVecIterator{ptr: p, end: p.offset(self.len()),
2338+
VecMutIterator{ptr: p, end: p.offset(self.len()),
23702339
lifetime: cast::transmute(p)}
23712340
}
23722341
}
23732342

2343+
fn mut_rev_iter(self) -> VecMutRevIterator<'self, T> {
2344+
unsafe {
2345+
let p = vec::raw::to_mut_ptr(self);
2346+
VecMutRevIterator{ptr: p.offset(self.len() - 1),
2347+
end: p.offset(-1),
2348+
lifetime: cast::transmute(p)}
2349+
}
2350+
}
2351+
23742352
#[inline(always)]
23752353
unsafe fn unsafe_mut_ref(&self, index: uint) -> *mut T {
23762354
let pair_ptr: &(*mut T, uint) = transmute(self);
@@ -2872,52 +2850,69 @@ impl<A:Clone> Clone for ~[A] {
28722850
}
28732851
}
28742852

2875-
/// An external iterator for vectors (use with the std::iterator module)
2853+
macro_rules! iterator {
2854+
/* FIXME: #4375 Cannot attach documentation/attributes to a macro generated struct.
2855+
(struct $name:ident -> $ptr:ty, $elem:ty) => {
2856+
pub struct $name<'self, T> {
2857+
priv ptr: $ptr,
2858+
priv end: $ptr,
2859+
priv lifetime: $elem // FIXME: #5922
2860+
}
2861+
};*/
2862+
(impl $name:ident -> $elem:ty, $step:expr) => {
2863+
// could be implemented with &[T] with .slice(), but this avoids bounds checks
2864+
impl<'self, T> Iterator<$elem> for $name<'self, T> {
2865+
#[inline]
2866+
fn next(&mut self) -> Option<$elem> {
2867+
unsafe {
2868+
if self.ptr == self.end {
2869+
None
2870+
} else {
2871+
let old = self.ptr;
2872+
self.ptr = self.ptr.offset($step);
2873+
Some(cast::transmute(old))
2874+
}
2875+
}
2876+
}
2877+
}
2878+
}
2879+
}
2880+
2881+
//iterator!{struct VecIterator -> *T, &'self T}
2882+
/// An iterator for iterating over a vector
28762883
pub struct VecIterator<'self, T> {
28772884
priv ptr: *T,
28782885
priv end: *T,
28792886
priv lifetime: &'self T // FIXME: #5922
28802887
}
2888+
iterator!{impl VecIterator -> &'self T, 1}
28812889

2882-
// could be implemented with &[T] with .slice(), but this avoids bounds checks
2883-
impl<'self, T> Iterator<&'self T> for VecIterator<'self, T> {
2884-
#[inline]
2885-
fn next(&mut self) -> Option<&'self T> {
2886-
unsafe {
2887-
if self.ptr == self.end {
2888-
None
2889-
} else {
2890-
let old = self.ptr;
2891-
self.ptr = self.ptr.offset(1);
2892-
Some(cast::transmute(old))
2893-
}
2894-
}
2895-
}
2890+
//iterator!{struct VecRevIterator -> *T, &'self T}
2891+
/// An iterator for iterating over a vector in reverse
2892+
pub struct VecRevIterator<'self, T> {
2893+
priv ptr: *T,
2894+
priv end: *T,
2895+
priv lifetime: &'self T // FIXME: #5922
28962896
}
2897+
iterator!{impl VecRevIterator -> &'self T, -1}
28972898

2898-
/// An external iterator for vectors with the possibility of mutating
2899-
/// elements. (use with the std::iterator module)
2900-
pub struct MutVecIterator<'self, T> {
2899+
//iterator!{struct VecMutIterator -> *mut T, &'self mut T}
2900+
/// An iterator for mutating the elements of a vector
2901+
pub struct VecMutIterator<'self, T> {
29012902
priv ptr: *mut T,
29022903
priv end: *mut T,
29032904
priv lifetime: &'self mut T // FIXME: #5922
29042905
}
2906+
iterator!{impl VecMutIterator -> &'self mut T, 1}
29052907

2906-
// could be implemented with &[T] with .slice(), but this avoids bounds checks
2907-
impl<'self, T> Iterator<&'self mut T> for MutVecIterator<'self, T> {
2908-
#[inline]
2909-
fn next(&mut self) -> Option<&'self mut T> {
2910-
unsafe {
2911-
if self.ptr == self.end {
2912-
None
2913-
} else {
2914-
let old = self.ptr;
2915-
self.ptr = self.ptr.offset(1);
2916-
Some(cast::transmute(old))
2917-
}
2918-
}
2919-
}
2908+
//iterator!{struct VecMutRevIterator -> *mut T, &'self mut T}
2909+
/// An iterator for mutating the elements of a vector in reverse
2910+
pub struct VecMutRevIterator<'self, T> {
2911+
priv ptr: *mut T,
2912+
priv end: *mut T,
2913+
priv lifetime: &'self mut T // FIXME: #5922
29202914
}
2915+
iterator!{impl VecMutRevIterator -> &'self mut T, -1}
29212916

29222917
impl<T> FromIter<T> for ~[T]{
29232918
#[inline(always)]
@@ -3527,43 +3522,6 @@ mod tests {
35273522
assert_eq!(i, 6);
35283523
}
35293524

3530-
#[test]
3531-
fn test_each_reverse_empty() {
3532-
let v: ~[int] = ~[];
3533-
for v.each_reverse |_v| {
3534-
fail!(); // should never execute
3535-
}
3536-
}
3537-
3538-
#[test]
3539-
fn test_each_reverse_nonempty() {
3540-
let mut i = 0;
3541-
for each_reverse([1, 2, 3]) |v| {
3542-
if i == 0 { assert!(*v == 3); }
3543-
i += *v
3544-
}
3545-
assert_eq!(i, 6);
3546-
}
3547-
3548-
#[test]
3549-
fn test_eachi_reverse() {
3550-
let mut i = 0;
3551-
for eachi_reverse([0, 1, 2]) |j, v| {
3552-
if i == 0 { assert!(*v == 2); }
3553-
assert_eq!(j, *v as uint);
3554-
i += *v;
3555-
}
3556-
assert_eq!(i, 3);
3557-
}
3558-
3559-
#[test]
3560-
fn test_eachi_reverse_empty() {
3561-
let v: ~[int] = ~[];
3562-
for v.eachi_reverse |_i, _v| {
3563-
fail!(); // should never execute
3564-
}
3565-
}
3566-
35673525
#[test]
35683526
fn test_each_ret_len0() {
35693527
let mut a0 : [int, .. 0] = [];
@@ -4642,6 +4600,30 @@ mod tests {
46424600
assert_eq!(xs, [2, 3, 4, 5, 6])
46434601
}
46444602

4603+
#[test]
4604+
fn test_rev_iterator() {
4605+
use iterator::*;
4606+
4607+
let xs = [1, 2, 5, 10, 11];
4608+
let ys = [11, 10, 5, 2, 1];
4609+
let mut i = 0;
4610+
for xs.rev_iter().advance |&x| {
4611+
assert_eq!(x, ys[i]);
4612+
i += 1;
4613+
}
4614+
assert_eq!(i, 5);
4615+
}
4616+
4617+
#[test]
4618+
fn test_mut_rev_iterator() {
4619+
use iterator::*;
4620+
let mut xs = [1, 2, 3, 4, 5];
4621+
for xs.mut_rev_iter().enumerate().advance |(i,x)| {
4622+
*x += i;
4623+
}
4624+
assert_eq!(xs, [5, 5, 5, 5, 5])
4625+
}
4626+
46454627
#[test]
46464628
fn test_reverse_part() {
46474629
let mut values = [1,2,3,4,5];

0 commit comments

Comments
 (0)