about summary refs log tree commit diff
path: root/src/libserialize
diff options
context:
space:
mode:
authorSimonas Kazlauskas <git@kazlauskas.me>2017-02-02 06:44:30 +0200
committerSimonas Kazlauskas <git@kazlauskas.me>2017-02-10 19:42:41 +0200
commita00a0adc7913152bff626d6dbebfa2cfdbb93d0a (patch)
tree4848312f6e9657f06bf6d15bddef8cdd63cbf6ca /src/libserialize
parentaac82d9b13f8ba1baebc5a2a1a673831e6f6fbe7 (diff)
downloadrust-a00a0adc7913152bff626d6dbebfa2cfdbb93d0a.tar.gz
rust-a00a0adc7913152bff626d6dbebfa2cfdbb93d0a.zip
Only SwitchInt over integers, not all consts
Also use a Cow to avoid full Vec for all SwitchInts
Diffstat (limited to 'src/libserialize')
-rw-r--r--src/libserialize/serialize.rs28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/libserialize/serialize.rs b/src/libserialize/serialize.rs
index ba39fcdec6f..c6847249803 100644
--- a/src/libserialize/serialize.rs
+++ b/src/libserialize/serialize.rs
@@ -567,6 +567,34 @@ impl<T:Decodable> Decodable for Vec<T> {
     }
 }
 
+impl<'a, T:Encodable> Encodable for Cow<'a, [T]>
+where [T]: ToOwned<Owned = Vec<T>>
+{
+    fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> {
+        s.emit_seq(self.len(), |s| {
+            for (i, e) in self.iter().enumerate() {
+                s.emit_seq_elt(i, |s| e.encode(s))?
+            }
+            Ok(())
+        })
+    }
+}
+
+impl<T:Decodable+ToOwned> Decodable for Cow<'static, [T]>
+where [T]: ToOwned<Owned = Vec<T>>
+{
+    fn decode<D: Decoder>(d: &mut D) -> Result<Cow<'static, [T]>, D::Error> {
+        d.read_seq(|d, len| {
+            let mut v = Vec::with_capacity(len);
+            for i in 0..len {
+                v.push(d.read_seq_elt(i, |d| Decodable::decode(d))?);
+            }
+            Ok(Cow::Owned(v))
+        })
+    }
+}
+
+
 impl<T:Encodable> Encodable for Option<T> {
     fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> {
         s.emit_option(|s| {