diff options
| -rw-r--r-- | src/libstd/deque.rs | 32 | ||||
| -rw-r--r-- | src/libstd/serialize.rs | 26 |
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> |
