Skip to content

Commit 178e716

Browse files
committed
---
yaml --- r: 56254 b: refs/heads/auto c: ae1c9eb h: refs/heads/master v: v3
1 parent 6378de5 commit 178e716

File tree

4 files changed

+140
-50
lines changed

4 files changed

+140
-50
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@ refs/heads/try3: 9387340aab40a73e8424c48fd42f0c521a4875c0
1414
refs/tags/release-0.3.1: 495bae036dfe5ec6ceafd3312b4dca48741e845b
1515
refs/tags/release-0.4: e828ea2080499553b97dfe33b3f4d472b4562ad7
1616
refs/tags/release-0.5: 7e3bcfbf21278251ee936ad53e92e9b719702d73
17-
refs/heads/auto: 465666d5c85fd4b97551bd1caa5fdc9bc59bd10b
17+
refs/heads/auto: ae1c9ebf3c3a0a7e176314f742f533a788ea0dd2
1818
refs/heads/servo: af82457af293e2a842ba6b7759b70288da276167
1919
refs/tags/release-0.6: b4ebcfa1812664df5e142f0134a5faea3918544c

branches/auto/src/libcore/iterator.rs

Lines changed: 135 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@ pub trait IteratorUtil<A> {
2222
// FIXME: #5898: should be called map
2323
fn transform<'r, B>(self, f: &'r fn(A) -> B) -> MapIterator<'r, A, B, Self>;
2424
fn filter<'r>(self, predicate: &'r fn(&A) -> bool) -> FilterIterator<'r, A, Self>;
25-
fn dropwhile<'r>(self, predicate: &'r fn(&A) -> bool) -> DropWhileIterator<'r, A, Self>;
26-
fn takewhile<'r>(self, predicate: &'r fn(&A) -> bool) -> TakeWhileIterator<'r, A, Self>;
25+
fn skip_while<'r>(self, predicate: &'r fn(&A) -> bool) -> SkipWhileIterator<'r, A, Self>;
26+
fn take_while<'r>(self, predicate: &'r fn(&A) -> bool) -> TakeWhileIterator<'r, A, Self>;
27+
fn skip(self, n: uint) -> SkipIterator<Self>;
28+
fn take(self, n: uint) -> TakeIterator<Self>;
2729
fn enumerate(self) -> EnumerateIterator<Self>;
2830
fn advance(&mut self, f: &fn(A) -> bool);
2931
}
@@ -51,15 +53,25 @@ impl<A, T: Iterator<A>> IteratorUtil<A> for T {
5153
}
5254

5355
#[inline(always)]
54-
fn dropwhile<'r>(self, predicate: &'r fn(&A) -> bool) -> DropWhileIterator<'r, A, T> {
55-
DropWhileIterator{iter: self, flag: false, predicate: predicate}
56+
fn skip_while<'r>(self, predicate: &'r fn(&A) -> bool) -> SkipWhileIterator<'r, A, T> {
57+
SkipWhileIterator{iter: self, flag: false, predicate: predicate}
5658
}
5759

5860
#[inline(always)]
59-
fn takewhile<'r>(self, predicate: &'r fn(&A) -> bool) -> TakeWhileIterator<'r, A, T> {
61+
fn take_while<'r>(self, predicate: &'r fn(&A) -> bool) -> TakeWhileIterator<'r, A, T> {
6062
TakeWhileIterator{iter: self, flag: false, predicate: predicate}
6163
}
6264

65+
#[inline(always)]
66+
fn skip(self, n: uint) -> SkipIterator<T> {
67+
SkipIterator{iter: self, n: n}
68+
}
69+
70+
#[inline(always)]
71+
fn take(self, n: uint) -> TakeIterator<T> {
72+
TakeIterator{iter: self, n: n}
73+
}
74+
6375
/// A shim implementing the `for` loop iteration protocol for iterator objects
6476
#[inline]
6577
fn advance(&mut self, f: &fn(A) -> bool) {
@@ -142,13 +154,13 @@ impl<A, T: Iterator<A>> Iterator<(uint, A)> for EnumerateIterator<T> {
142154
}
143155
}
144156

145-
pub struct DropWhileIterator<'self, A, T> {
157+
pub struct SkipWhileIterator<'self, A, T> {
146158
priv iter: T,
147159
priv flag: bool,
148160
priv predicate: &'self fn(&A) -> bool
149161
}
150162

151-
impl<'self, A, T: Iterator<A>> Iterator<A> for DropWhileIterator<'self, A, T> {
163+
impl<'self, A, T: Iterator<A>> Iterator<A> for SkipWhileIterator<'self, A, T> {
152164
#[inline]
153165
fn next(&mut self) -> Option<A> {
154166
let mut next = self.iter.next();
@@ -199,3 +211,119 @@ impl<'self, A, T: Iterator<A>> Iterator<A> for TakeWhileIterator<'self, A, T> {
199211
}
200212
}
201213
}
214+
215+
pub struct SkipIterator<T> {
216+
priv iter: T,
217+
priv n: uint
218+
}
219+
220+
impl<A, T: Iterator<A>> Iterator<A> for SkipIterator<T> {
221+
#[inline]
222+
fn next(&mut self) -> Option<A> {
223+
let mut next = self.iter.next();
224+
if self.n == 0 {
225+
next
226+
} else {
227+
let n = self.n;
228+
for n.times {
229+
match next {
230+
Some(_) => {
231+
next = self.iter.next();
232+
loop
233+
}
234+
None => {
235+
self.n = 0;
236+
return None
237+
}
238+
}
239+
}
240+
self.n = 0;
241+
next
242+
}
243+
}
244+
}
245+
246+
pub struct TakeIterator<T> {
247+
priv iter: T,
248+
priv n: uint
249+
}
250+
251+
impl<A, T: Iterator<A>> Iterator<A> for TakeIterator<T> {
252+
#[inline]
253+
fn next(&mut self) -> Option<A> {
254+
let next = self.iter.next();
255+
if self.n != 0 {
256+
self.n -= 1;
257+
next
258+
} else {
259+
None
260+
}
261+
}
262+
}
263+
264+
#[cfg(test)]
265+
mod tests {
266+
use super::*;
267+
use prelude::*;
268+
269+
#[test]
270+
fn test_iterator_enumerate() {
271+
let xs = [0u, 1, 2, 3, 4, 5];
272+
let mut it = xs.iter().enumerate();
273+
for it.advance |(i, &x): (uint, &uint)| {
274+
assert_eq!(i, x);
275+
}
276+
}
277+
278+
#[test]
279+
fn test_iterator_take_while() {
280+
let xs = [0u, 1, 2, 3, 5, 13, 15, 16, 17, 19];
281+
let ys = [0u, 1, 2, 3, 5, 13];
282+
let mut it = xs.iter().take_while(|&x| *x < 15u);
283+
let mut i = 0;
284+
for it.advance |&x: &uint| {
285+
assert_eq!(x, ys[i]);
286+
i += 1;
287+
}
288+
assert_eq!(i, ys.len());
289+
}
290+
291+
#[test]
292+
fn test_iterator_skip_while() {
293+
let xs = [0u, 1, 2, 3, 5, 13, 15, 16, 17, 19];
294+
let ys = [15, 16, 17, 19];
295+
let mut it = xs.iter().skip_while(|&x| *x < 15u);
296+
let mut i = 0;
297+
for it.advance |&x: &uint| {
298+
assert_eq!(x, ys[i]);
299+
i += 1;
300+
}
301+
assert_eq!(i, ys.len());
302+
}
303+
304+
#[test]
305+
fn test_iterator_skip() {
306+
let xs = [0u, 1, 2, 3, 5, 13, 15, 16, 17, 19, 20, 30];
307+
let ys = [13, 15, 16, 17, 19, 20, 30];
308+
let mut it = xs.iter().skip(5);
309+
let mut i = 0;
310+
for it.advance |&x: &uint| {
311+
assert_eq!(x, ys[i]);
312+
i += 1;
313+
}
314+
assert_eq!(i, ys.len());
315+
}
316+
317+
#[test]
318+
fn test_iterator_take() {
319+
let xs = [0u, 1, 2, 3, 5, 13, 15, 16, 17, 19];
320+
let ys = [0u, 1, 2, 3, 5];
321+
let mut it = xs.iter().take(5);
322+
let mut i = 0;
323+
for it.advance |&x: &uint| {
324+
assert_eq!(x, ys[i]);
325+
i += 1;
326+
}
327+
assert_eq!(i, ys.len());
328+
}
329+
}

branches/auto/src/libcore/str.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1863,7 +1863,7 @@ pub fn char_range_at(s: &str, i: uint) -> CharRange {
18631863
return CharRange {ch: val as char, next: i};
18641864
}
18651865

1866-
/// Plucks the character starting at the `i`th byte of a string
1866+
/// Plucks the `n`th character from the beginning of a string
18671867
pub fn char_at(s: &str, i: uint) -> char {
18681868
return char_range_at(s, i).ch;
18691869
}
@@ -1874,11 +1874,11 @@ pub struct CharRange {
18741874
}
18751875

18761876
/**
1877-
* Given a byte position and a str, return the previous char and its position.
1877+
* Given a byte position and a str, return the previous char and its position
18781878
*
18791879
* This function can be used to iterate over a unicode string in reverse.
18801880
*
1881-
* Returns 0 for next index if called on start index 0.
1881+
* returns 0 for next index if called on start index 0
18821882
*/
18831883
pub fn char_range_at_reverse(ss: &str, start: uint) -> CharRange {
18841884
let mut prev = start;
@@ -1900,7 +1900,7 @@ pub fn char_range_at_reverse(ss: &str, start: uint) -> CharRange {
19001900
return CharRange {ch:ch, next:prev};
19011901
}
19021902

1903-
/// Plucks the character ending at the `i`th byte of a string
1903+
/// Plucks the `n`th character from the end of a string
19041904
pub fn char_at_reverse(s: &str, i: uint) -> char {
19051905
char_range_at_reverse(s, i).ch
19061906
}

branches/auto/src/libcore/vec.rs

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4474,42 +4474,4 @@ mod tests {
44744474
i += 1;
44754475
}
44764476
}
4477-
4478-
#[test]
4479-
fn test_iterator_enumerate() {
4480-
use iterator::*;
4481-
let xs = [0u, 1, 2, 3, 4, 5];
4482-
let mut it = xs.iter().enumerate();
4483-
for it.advance |(i, &x): (uint, &uint)| {
4484-
assert_eq!(i, x);
4485-
}
4486-
}
4487-
4488-
#[test]
4489-
fn test_iterator_takewhile() {
4490-
use iterator::*;
4491-
let xs = [0u, 1, 2, 3, 5, 13, 15, 16, 17, 19];
4492-
let ys = [0u, 1, 2, 3, 5, 13];
4493-
let mut it = xs.iter().takewhile(|&x| *x < 15u);
4494-
let mut i = 0;
4495-
for it.advance |&x: &uint| {
4496-
assert_eq!(x, ys[i]);
4497-
i += 1;
4498-
}
4499-
assert_eq!(i, ys.len());
4500-
}
4501-
4502-
#[test]
4503-
fn test_iterator_dropwhile() {
4504-
use iterator::*;
4505-
let xs = [0u, 1, 2, 3, 5, 13, 15, 16, 17, 19];
4506-
let ys = [15, 16, 17, 19];
4507-
let mut it = xs.iter().dropwhile(|&x| *x < 15u);
4508-
let mut i = 0;
4509-
for it.advance |&x: &uint| {
4510-
assert_eq!(x, ys[i]);
4511-
i += 1;
4512-
}
4513-
assert_eq!(i, ys.len());
4514-
}
45154477
}

0 commit comments

Comments
 (0)