about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorErick Tryzelaar <erick.tryzelaar@gmail.com>2013-03-29 18:02:44 -0700
committerErick Tryzelaar <erick.tryzelaar@gmail.com>2013-03-29 18:02:44 -0700
commit909d8f0eacf38ce11949365c75fae6e5a159a4e1 (patch)
treec998545d309565e41c72418ee4419062d2421344 /src/libstd
parent0de7635f534f0c02e211a2104afa7e0e15391e14 (diff)
downloadrust-909d8f0eacf38ce11949365c75fae6e5a159a4e1.tar.gz
rust-909d8f0eacf38ce11949365c75fae6e5a159a4e1.zip
std: Add Deque::eachi and a Deque serializer support
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/deque.rs32
-rw-r--r--src/libstd/serialize.rs26
2 files changed, 58 insertions, 0 deletions
diff --git a/src/libstd/deque.rs b/src/libstd/deque.rs
index e029b882472..e7ec86963ee 100644
--- a/src/libstd/deque.rs
+++ b/src/libstd/deque.rs
@@ -66,6 +66,18 @@ pub impl<T> Deque<T> {
         get(self.elts, idx)
     }
 
+    /// Iterate over the elements in the deque
+    fn each(&self, f: &fn(&T) -> bool) {
+        self.eachi(|_i, e| f(e))
+    }
+
+    /// Iterate over the elements in the deque by index
+    fn eachi(&self, f: &fn(uint, &T) -> bool) {
+        for uint::range(0, self.nelts) |i| {
+            if !f(i, self.get(i as int)) { return; }
+        }
+    }
+
     /// Remove and return the first element in the deque
     ///
     /// Fails if the deque is empty
@@ -223,6 +235,7 @@ mod tests {
         assert!(*deq.get(3) == d);
     }
 
+    #[test]
     fn test_parameterized<T:Copy + Eq + Durable>(a: T, b: T, c: T, d: T) {
         let mut deq = Deque::new();
         assert!(deq.len() == 0);
@@ -300,4 +313,23 @@ mod tests {
         let reccy4 = RecCy { x: 19, y: 252, t: Two(17, 42) };
         test_parameterized::<RecCy>(reccy1, reccy2, reccy3, reccy4);
     }
+
+    #[test]
+    fn test_eachi() {
+        let mut deq = Deque::new();
+        deq.add_back(1);
+        deq.add_back(2);
+        deq.add_back(3);
+
+        for deq.eachi |i, e| {
+            assert_eq!(*e, i + 1);
+        }
+
+        deq.pop_front();
+
+        for deq.eachi |i, e| {
+            assert_eq!(*e, i + 2);
+        }
+
+    }
 }
diff --git a/src/libstd/serialize.rs b/src/libstd/serialize.rs
index 360ec8afe51..72c81d6d6b4 100644
--- a/src/libstd/serialize.rs
+++ b/src/libstd/serialize.rs
@@ -20,6 +20,7 @@ use core::prelude::*;
 use core::dlist::DList;
 use core::hashmap::linear::{LinearMap, LinearSet};
 use core::trie::{TrieMap, TrieSet};
+use deque::Deque;
 use treemap::{TreeMap, TreeSet};
 
 pub trait Encoder {
@@ -562,6 +563,31 @@ impl<D:Decoder,T:Decodable<D>> Decodable<D> for @mut DList<T> {
 }
 
 impl<
+    S: Encoder,
+    T: Encodable<S>
+> Encodable<S> for Deque<T> {
+    fn encode(&self, s: &S) {
+        do s.emit_seq(self.len()) {
+            for self.eachi |i, e| {
+                s.emit_seq_elt(i, || e.encode(s));
+            }
+        }
+    }
+}
+
+impl<D:Decoder,T:Decodable<D>> Decodable<D> for Deque<T> {
+    fn decode(d: &D) -> Deque<T> {
+        let mut deque = Deque::new();
+        do d.read_seq |len| {
+            for uint::range(0, len) |i| {
+                deque.add_back(d.read_seq_elt(i, || Decodable::decode(d)));
+            }
+        }
+        deque
+    }
+}
+
+impl<
     E: Encoder,
     K: Encodable<E> + Hash + IterBytes + Eq,
     V: Encodable<E>