diff options
| author | Colin Sherratt <colin.sherratt@gmail.com> | 2014-11-09 11:30:18 -0500 |
|---|---|---|
| committer | Colin Sherratt <colin.sherratt@gmail.com> | 2014-11-09 11:31:33 -0500 |
| commit | 477155e638d0a2bddf951ca4a2e24f797ba304bf (patch) | |
| tree | 5dfd324c14003bd285df385574d4e23d7e6e64df /src/libserialize | |
| parent | a2f303ad098844351d08800038a4f99fa2ff0817 (diff) | |
| download | rust-477155e638d0a2bddf951ca4a2e24f797ba304bf.tar.gz rust-477155e638d0a2bddf951ca4a2e24f797ba304bf.zip | |
Add Encodable and Decodable for VecMap
Diffstat (limited to 'src/libserialize')
| -rw-r--r-- | src/libserialize/collection_impls.rs | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/src/libserialize/collection_impls.rs b/src/libserialize/collection_impls.rs index d2d1f5fa8b0..ffeb190ddf8 100644 --- a/src/libserialize/collection_impls.rs +++ b/src/libserialize/collection_impls.rs @@ -16,7 +16,7 @@ use std::hash::{Hash, Hasher}; use {Decodable, Encodable, Decoder, Encoder}; use std::collections::{DList, RingBuf, TreeMap, TreeSet, HashMap, HashSet, - TrieMap, TrieSet}; + TrieMap, TrieSet, VecMap}; use std::collections::enum_set::{EnumSet, CLike}; impl< @@ -311,3 +311,37 @@ impl<E, D: Decoder<E>> Decodable<D, E> for TrieSet { }) } } + +impl< + E, + S: Encoder<E>, + V: Encodable<S, E> +> Encodable<S, E> for VecMap<V> { + fn encode(&self, e: &mut S) -> Result<(), E> { + e.emit_map(self.len(), |e| { + for (i, (key, val)) in self.iter().enumerate() { + try!(e.emit_map_elt_key(i, |e| key.encode(e))); + try!(e.emit_map_elt_val(i, |e| val.encode(e))); + } + Ok(()) + }) + } +} + +impl< + E, + D: Decoder<E>, + V: Decodable<D, E> +> Decodable<D, E> for VecMap<V> { + fn decode(d: &mut D) -> Result<VecMap<V>, E> { + d.read_map(|d, len| { + let mut map = VecMap::new(); + for i in range(0u, len) { + let key = try!(d.read_map_elt_key(i, |d| Decodable::decode(d))); + let val = try!(d.read_map_elt_val(i, |d| Decodable::decode(d))); + map.insert(key, val); + } + Ok(map) + }) + } +} |
