Skip to content

Commit 909d8f0

Browse files
committed
std: Add Deque::eachi and a Deque serializer support
1 parent 0de7635 commit 909d8f0

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed

src/libstd/deque.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,18 @@ pub impl<T> Deque<T> {
6666
get(self.elts, idx)
6767
}
6868

69+
/// Iterate over the elements in the deque
70+
fn each(&self, f: &fn(&T) -> bool) {
71+
self.eachi(|_i, e| f(e))
72+
}
73+
74+
/// Iterate over the elements in the deque by index
75+
fn eachi(&self, f: &fn(uint, &T) -> bool) {
76+
for uint::range(0, self.nelts) |i| {
77+
if !f(i, self.get(i as int)) { return; }
78+
}
79+
}
80+
6981
/// Remove and return the first element in the deque
7082
///
7183
/// Fails if the deque is empty
@@ -223,6 +235,7 @@ mod tests {
223235
assert!(*deq.get(3) == d);
224236
}
225237

238+
#[test]
226239
fn test_parameterized<T:Copy + Eq + Durable>(a: T, b: T, c: T, d: T) {
227240
let mut deq = Deque::new();
228241
assert!(deq.len() == 0);
@@ -300,4 +313,23 @@ mod tests {
300313
let reccy4 = RecCy { x: 19, y: 252, t: Two(17, 42) };
301314
test_parameterized::<RecCy>(reccy1, reccy2, reccy3, reccy4);
302315
}
316+
317+
#[test]
318+
fn test_eachi() {
319+
let mut deq = Deque::new();
320+
deq.add_back(1);
321+
deq.add_back(2);
322+
deq.add_back(3);
323+
324+
for deq.eachi |i, e| {
325+
assert_eq!(*e, i + 1);
326+
}
327+
328+
deq.pop_front();
329+
330+
for deq.eachi |i, e| {
331+
assert_eq!(*e, i + 2);
332+
}
333+
334+
}
303335
}

src/libstd/serialize.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ use core::prelude::*;
2020
use core::dlist::DList;
2121
use core::hashmap::linear::{LinearMap, LinearSet};
2222
use core::trie::{TrieMap, TrieSet};
23+
use deque::Deque;
2324
use treemap::{TreeMap, TreeSet};
2425

2526
pub trait Encoder {
@@ -561,6 +562,31 @@ impl<D:Decoder,T:Decodable<D>> Decodable<D> for @mut DList<T> {
561562
}
562563
}
563564

565+
impl<
566+
S: Encoder,
567+
T: Encodable<S>
568+
> Encodable<S> for Deque<T> {
569+
fn encode(&self, s: &S) {
570+
do s.emit_seq(self.len()) {
571+
for self.eachi |i, e| {
572+
s.emit_seq_elt(i, || e.encode(s));
573+
}
574+
}
575+
}
576+
}
577+
578+
impl<D:Decoder,T:Decodable<D>> Decodable<D> for Deque<T> {
579+
fn decode(d: &D) -> Deque<T> {
580+
let mut deque = Deque::new();
581+
do d.read_seq |len| {
582+
for uint::range(0, len) |i| {
583+
deque.add_back(d.read_seq_elt(i, || Decodable::decode(d)));
584+
}
585+
}
586+
deque
587+
}
588+
}
589+
564590
impl<
565591
E: Encoder,
566592
K: Encodable<E> + Hash + IterBytes + Eq,

0 commit comments

Comments
 (0)