Skip to content

Commit e82f60e

Browse files
committed
auto merge of #18813 : csherratt/rust/add-encode-decode-vecmap, r=alexcrichton
2 parents 351f7af + 477155e commit e82f60e

File tree

1 file changed

+35
-1
lines changed

1 file changed

+35
-1
lines changed

src/libserialize/collection_impls.rs

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use std::hash::{Hash, Hasher};
1616

1717
use {Decodable, Encodable, Decoder, Encoder};
1818
use std::collections::{DList, RingBuf, TreeMap, TreeSet, HashMap, HashSet,
19-
TrieMap, TrieSet};
19+
TrieMap, TrieSet, VecMap};
2020
use std::collections::enum_set::{EnumSet, CLike};
2121

2222
impl<
@@ -311,3 +311,37 @@ impl<E, D: Decoder<E>> Decodable<D, E> for TrieSet {
311311
})
312312
}
313313
}
314+
315+
impl<
316+
E,
317+
S: Encoder<E>,
318+
V: Encodable<S, E>
319+
> Encodable<S, E> for VecMap<V> {
320+
fn encode(&self, e: &mut S) -> Result<(), E> {
321+
e.emit_map(self.len(), |e| {
322+
for (i, (key, val)) in self.iter().enumerate() {
323+
try!(e.emit_map_elt_key(i, |e| key.encode(e)));
324+
try!(e.emit_map_elt_val(i, |e| val.encode(e)));
325+
}
326+
Ok(())
327+
})
328+
}
329+
}
330+
331+
impl<
332+
E,
333+
D: Decoder<E>,
334+
V: Decodable<D, E>
335+
> Decodable<D, E> for VecMap<V> {
336+
fn decode(d: &mut D) -> Result<VecMap<V>, E> {
337+
d.read_map(|d, len| {
338+
let mut map = VecMap::new();
339+
for i in range(0u, len) {
340+
let key = try!(d.read_map_elt_key(i, |d| Decodable::decode(d)));
341+
let val = try!(d.read_map_elt_val(i, |d| Decodable::decode(d)));
342+
map.insert(key, val);
343+
}
344+
Ok(map)
345+
})
346+
}
347+
}

0 commit comments

Comments
 (0)