diff options
| author | Erick Tryzelaar <erick.tryzelaar@gmail.com> | 2013-03-29 18:02:44 -0700 |
|---|---|---|
| committer | Erick Tryzelaar <erick.tryzelaar@gmail.com> | 2013-03-29 18:02:44 -0700 |
| commit | 909d8f0eacf38ce11949365c75fae6e5a159a4e1 (patch) | |
| tree | c998545d309565e41c72418ee4419062d2421344 /src/libstd | |
| parent | 0de7635f534f0c02e211a2104afa7e0e15391e14 (diff) | |
| download | rust-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.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> |
