Skip to content

Commit

Permalink
initial iterator object library
Browse files Browse the repository at this point in the history
  • Loading branch information
thestinger committed Apr 13, 2013
1 parent 65ff441 commit 8bf9fc5
Show file tree
Hide file tree
Showing 5 changed files with 216 additions and 164 deletions.
1 change: 1 addition & 0 deletions src/libcore/core.rc
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,7 @@ pub mod from_str;
#[path = "num/num.rs"]
pub mod num;
pub mod iter;
pub mod iterator;
pub mod to_str;
pub mod to_bytes;
pub mod clone;
Expand Down
101 changes: 101 additions & 0 deletions src/libcore/iterator.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

//! Composable iterator objects
use prelude::*;

pub trait Iterator<T> {
/// Advance the iterator and return the next value. Return `None` when the end is reached.
fn next(&mut self) -> Option<T>;
}

/// A shim implementing the `for` loop iteration protocol for iterator objects
#[inline]
pub fn advance<T, U: Iterator<T>>(iter: &mut U, f: &fn(T) -> bool) {
loop {
match iter.next() {
Some(x) => {
if !f(x) { return }
}
None => return
}
}
}

pub struct ZipIterator<T, U> {
priv a: T,
priv b: U
}

pub impl<A, B, T: Iterator<A>, U: Iterator<B>> ZipIterator<T, U> {
#[inline(always)]
fn new(a: T, b: U) -> ZipIterator<T, U> {
ZipIterator{a: a, b: b}
}
}

impl<A, B, T: Iterator<A>, U: Iterator<B>> Iterator<(A, B)> for ZipIterator<T, U> {
#[inline]
fn next(&mut self) -> Option<(A, B)> {
match (self.a.next(), self.b.next()) {
(Some(x), Some(y)) => Some((x, y)),
_ => None
}
}
}

pub struct FilterIterator<'self, A, T> {
priv iter: T,
priv predicate: &'self fn(&A) -> bool
}

pub impl<'self, A, T: Iterator<A>> FilterIterator<'self, A, T> {
#[inline(always)]
fn new(iter: T, predicate: &'self fn(&A) -> bool) -> FilterIterator<'self, A, T> {
FilterIterator{iter: iter, predicate: predicate}
}
}

impl<'self, A, T: Iterator<A>> Iterator<A> for FilterIterator<'self, A, T> {
#[inline]
fn next(&mut self) -> Option<A> {
for advance(self) |x| {
if (self.predicate)(&x) {
return Some(x);
} else {
loop
}
}
None
}
}

pub struct MapIterator<'self, A, B, T> {
priv iter: T,
priv f: &'self fn(A) -> B
}

pub impl<'self, A, B, T: Iterator<A>> MapIterator<'self, A, B, T> {
#[inline(always)]
fn new(iter: T, f: &'self fn(A) -> B) -> MapIterator<'self, A, B, T> {
MapIterator{iter: iter, f: f}
}
}

impl<'self, A, B, T: Iterator<A>> Iterator<B> for MapIterator<'self, A, B, T> {
#[inline]
fn next(&mut self) -> Option<B> {
match self.iter.next() {
Some(a) => Some((self.f)(a)),
_ => None
}
}
}
15 changes: 15 additions & 0 deletions src/libstd/serialize.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ use core::hashmap::{HashMap, HashSet};
use core::trie::{TrieMap, TrieSet};
use deque::Deque;
use dlist::DList;
#[cfg(stage1)]
#[cfg(stage2)]
#[cfg(stage3)]
use treemap::{TreeMap, TreeSet};

pub trait Encoder {
Expand Down Expand Up @@ -738,6 +741,9 @@ impl<D: Decoder> Decodable<D> for TrieSet {
}
}

#[cfg(stage1)]
#[cfg(stage2)]
#[cfg(stage3)]
impl<
E: Encoder,
K: Encodable<E> + Eq + TotalOrd,
Expand All @@ -755,6 +761,9 @@ impl<
}
}

#[cfg(stage1)]
#[cfg(stage2)]
#[cfg(stage3)]
impl<
D: Decoder,
K: Decodable<D> + Eq + TotalOrd,
Expand All @@ -773,6 +782,9 @@ impl<
}
}

#[cfg(stage1)]
#[cfg(stage2)]
#[cfg(stage3)]
impl<
S: Encoder,
T: Encodable<S> + Eq + TotalOrd
Expand All @@ -788,6 +800,9 @@ impl<
}
}

#[cfg(stage1)]
#[cfg(stage2)]
#[cfg(stage3)]
impl<
D: Decoder,
T: Decodable<D> + Eq + TotalOrd
Expand Down
3 changes: 3 additions & 0 deletions src/libstd/std.rc
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,9 @@ pub mod rope;
pub mod smallintmap;
pub mod sort;
pub mod dlist;
#[cfg(stage1)]
#[cfg(stage2)]
#[cfg(stage3)]
pub mod treemap;

// And ... other stuff
Expand Down
Loading

5 comments on commit 8bf9fc5

@bors
Copy link
Contributor

@bors bors commented on 8bf9fc5 Apr 13, 2013

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bors
Copy link
Contributor

@bors bors commented on 8bf9fc5 Apr 13, 2013

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

merging thestinger/rust/iterator = 8bf9fc5 into auto

@bors
Copy link
Contributor

@bors bors commented on 8bf9fc5 Apr 13, 2013

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thestinger/rust/iterator = 8bf9fc5 merged ok, testing candidate = 7158102

@bors
Copy link
Contributor

@bors bors commented on 8bf9fc5 Apr 13, 2013

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bors
Copy link
Contributor

@bors bors commented on 8bf9fc5 Apr 13, 2013

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fast-forwarding incoming to auto = 7158102

Please sign in to comment.