diff --git a/src/libstd/serialize.rs b/src/libstd/serialize.rs index 9e21d1f980d9..fb56abc1b643 100644 --- a/src/libstd/serialize.rs +++ b/src/libstd/serialize.rs @@ -17,7 +17,10 @@ Core encoding and decoding interfaces. #[forbid(non_camel_case_types)]; use core::prelude::*; -use core::hashmap::linear::LinearMap; +use core::dlist::DList; +use core::hashmap::linear::{LinearMap, LinearSet}; +use core::trie::{TrieMap, TrieSet}; +use treemap::{TreeMap, TreeSet}; pub trait Encoder { // Primitive types: @@ -531,6 +534,33 @@ impl< } } +impl< + S: Encoder, + T: Encodable + Copy +> Encodable for @mut DList { + fn encode(&self, s: &S) { + do s.emit_seq(self.size) { + let mut i = 0; + for self.each |e| { + s.emit_seq_elt(i, || e.encode(s)); + i += 1; + } + } + } +} + +impl> Decodable for @mut DList { + fn decode(d: &D) -> @mut DList { + let list = DList(); + do d.read_seq |len| { + for uint::range(0, len) |i| { + list.push(d.read_seq_elt(i, || Decodable::decode(d))); + } + } + list + } +} + impl< E: Encoder, K: Encodable + Hash + IterBytes + Eq, @@ -566,6 +596,158 @@ impl< } } +impl< + S: Encoder, + T: Encodable + Hash + IterBytes + Eq +> Encodable for LinearSet { + fn encode(&self, s: &S) { + do s.emit_seq(self.len()) { + let mut i = 0; + for self.each |e| { + s.emit_seq_elt(i, || e.encode(s)); + i += 1; + } + } + } +} + +impl< + D: Decoder, + T: Decodable + Hash + IterBytes + Eq +> Decodable for LinearSet { + fn decode(d: &D) -> LinearSet { + do d.read_seq |len| { + let mut set = LinearSet::with_capacity(len); + for uint::range(0, len) |i| { + set.insert(d.read_seq_elt(i, || Decodable::decode(d))); + } + set + } + } +} + +impl< + E: Encoder, + V: Encodable +> Encodable for TrieMap { + fn encode(&self, e: &E) { + do e.emit_map(self.len()) { + let mut i = 0; + for self.each |&(key, val)| { + e.emit_map_elt_key(i, || key.encode(e)); + e.emit_map_elt_val(i, || val.encode(e)); + i += 1; + } + } + } +} + +impl< + D: Decoder, + V: Decodable +> Decodable for TrieMap { + fn decode(d: &D) -> TrieMap { + do d.read_map |len| { + let mut map = TrieMap::new(); + for uint::range(0, len) |i| { + let key = d.read_map_elt_key(i, || Decodable::decode(d)); + let val = d.read_map_elt_val(i, || Decodable::decode(d)); + map.insert(key, val); + } + map + } + } +} + +impl Encodable for TrieSet { + fn encode(&self, s: &S) { + do s.emit_seq(self.len()) { + let mut i = 0; + for self.each |e| { + s.emit_seq_elt(i, || e.encode(s)); + i += 1; + } + } + } +} + +impl Decodable for TrieSet { + fn decode(d: &D) -> TrieSet { + do d.read_seq |len| { + let mut set = TrieSet::new(); + for uint::range(0, len) |i| { + set.insert(d.read_seq_elt(i, || Decodable::decode(d))); + } + set + } + } +} + +impl< + E: Encoder, + K: Encodable + Eq + TotalOrd, + V: Encodable + Eq +> Encodable for TreeMap { + fn encode(&self, e: &E) { + do e.emit_map(self.len()) { + let mut i = 0; + for self.each |&(key, val)| { + e.emit_map_elt_key(i, || key.encode(e)); + e.emit_map_elt_val(i, || val.encode(e)); + i += 1; + } + } + } +} + +impl< + D: Decoder, + K: Decodable + Eq + TotalOrd, + V: Decodable + Eq +> Decodable for TreeMap { + fn decode(d: &D) -> TreeMap { + do d.read_map |len| { + let mut map = TreeMap::new(); + for uint::range(0, len) |i| { + let key = d.read_map_elt_key(i, || Decodable::decode(d)); + let val = d.read_map_elt_val(i, || Decodable::decode(d)); + map.insert(key, val); + } + map + } + } +} + +impl< + S: Encoder, + T: Encodable + Eq + TotalOrd +> Encodable for TreeSet { + fn encode(&self, s: &S) { + do s.emit_seq(self.len()) { + let mut i = 0; + for self.each |e| { + s.emit_seq_elt(i, || e.encode(s)); + i += 1; + } + } + } +} + +impl< + D: Decoder, + T: Decodable + Eq + TotalOrd +> Decodable for TreeSet { + fn decode(d: &D) -> TreeSet { + do d.read_seq |len| { + let mut set = TreeSet::new(); + for uint::range(0, len) |i| { + set.insert(d.read_seq_elt(i, || Decodable::decode(d))); + } + set + } + } +} + // ___________________________________________________________________________ // Helper routines //