about summary refs log tree commit diff
path: root/src/libserialize
diff options
context:
space:
mode:
authorColin Sherratt <colin.sherratt@gmail.com>2014-11-09 11:30:18 -0500
committerColin Sherratt <colin.sherratt@gmail.com>2014-11-09 11:31:33 -0500
commit477155e638d0a2bddf951ca4a2e24f797ba304bf (patch)
tree5dfd324c14003bd285df385574d4e23d7e6e64df /src/libserialize
parenta2f303ad098844351d08800038a4f99fa2ff0817 (diff)
downloadrust-477155e638d0a2bddf951ca4a2e24f797ba304bf.tar.gz
rust-477155e638d0a2bddf951ca4a2e24f797ba304bf.zip
Add Encodable and Decodable for VecMap
Diffstat (limited to 'src/libserialize')
-rw-r--r--src/libserialize/collection_impls.rs36
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)
+        })
+    }
+}