about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2014-11-11 22:37:05 +0000
committerbors <bors@rust-lang.org>2014-11-11 22:37:05 +0000
commite82f60eb471c4ee092bd4867f6946d271a620e71 (patch)
treeac317af6db0340abb76a6a91c633c3f7cf61946c /src
parent351f7afd06d2164b5bfe2467333c355a20fcb02d (diff)
parent477155e638d0a2bddf951ca4a2e24f797ba304bf (diff)
downloadrust-e82f60eb471c4ee092bd4867f6946d271a620e71.tar.gz
rust-e82f60eb471c4ee092bd4867f6946d271a620e71.zip
auto merge of #18813 : csherratt/rust/add-encode-decode-vecmap, r=alexcrichton
Diffstat (limited to 'src')
-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)
+        })
+    }
+}