//! Implementations of serialization for structures found in liballoc use std::hash::{BuildHasher, Hash}; use crate::{Decodable, Decoder, Encodable, Encoder}; use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet, LinkedList, VecDeque}; use std::rc::Rc; use std::sync::Arc; use smallvec::{Array, SmallVec}; impl>> Encodable for SmallVec { fn encode(&self, s: &mut S) -> Result<(), S::Error> { let slice: &[A::Item] = self; slice.encode(s) } } impl>> Decodable for SmallVec { fn decode(d: &mut D) -> SmallVec { let len = d.read_usize(); (0..len).map(|_| Decodable::decode(d)).collect() } } impl> Encodable for LinkedList { fn encode(&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> Decodable for LinkedList { fn decode(d: &mut D) -> LinkedList { let len = d.read_usize(); (0..len).map(|_| Decodable::decode(d)).collect() } } impl> Encodable for VecDeque { fn encode(&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> Decodable for VecDeque { fn decode(d: &mut D) -> VecDeque { let len = d.read_usize(); (0..len).map(|_| Decodable::decode(d)).collect() } } impl Encodable for BTreeMap where K: Encodable + PartialEq + Ord, V: Encodable, { fn encode(&self, e: &mut S) -> Result<(), S::Error> { e.emit_map(self.len(), |e| { for (i, (key, val)) in self.iter().enumerate() { e.emit_map_elt_key(i, |e| key.encode(e))?; e.emit_map_elt_val(|e| val.encode(e))?; } Ok(()) }) } } impl Decodable for BTreeMap where K: Decodable + PartialEq + Ord, V: Decodable, { fn decode(d: &mut D) -> BTreeMap { let len = d.read_usize(); let mut map = BTreeMap::new(); for _ in 0..len { let key = Decodable::decode(d); let val = Decodable::decode(d); map.insert(key, val); } map } } impl Encodable for BTreeSet where T: Encodable + PartialEq + Ord, { fn encode(&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 Decodable for BTreeSet where T: Decodable + PartialEq + Ord, { fn decode(d: &mut D) -> BTreeSet { let len = d.read_usize(); let mut set = BTreeSet::new(); for _ in 0..len { set.insert(Decodable::decode(d)); } set } } impl Encodable for HashMap where K: Encodable + Eq, V: Encodable, S: BuildHasher, { fn encode(&self, e: &mut E) -> Result<(), E::Error> { e.emit_map(self.len(), |e| { for (i, (key, val)) in self.iter().enumerate() { e.emit_map_elt_key(i, |e| key.encode(e))?; e.emit_map_elt_val(|e| val.encode(e))?; } Ok(()) }) } } impl Decodable for HashMap where K: Decodable + Hash + Eq, V: Decodable, S: BuildHasher + Default, { fn decode(d: &mut D) -> HashMap { let len = d.read_usize(); let state = Default::default(); let mut map = HashMap::with_capacity_and_hasher(len, state); for _ in 0..len { let key = Decodable::decode(d); let val = Decodable::decode(d); map.insert(key, val); } map } } impl Encodable for HashSet where T: Encodable + Eq, S: BuildHasher, { fn encode(&self, s: &mut E) -> Result<(), E::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 Decodable for HashSet where T: Decodable + Hash + Eq, S: BuildHasher + Default, { fn decode(d: &mut D) -> HashSet { let len = d.read_usize(); let state = Default::default(); let mut set = HashSet::with_capacity_and_hasher(len, state); for _ in 0..len { set.insert(Decodable::decode(d)); } set } } impl Encodable for indexmap::IndexMap where K: Encodable + Hash + Eq, V: Encodable, S: BuildHasher, { fn encode(&self, e: &mut E) -> Result<(), E::Error> { e.emit_map(self.len(), |e| { for (i, (key, val)) in self.iter().enumerate() { e.emit_map_elt_key(i, |e| key.encode(e))?; e.emit_map_elt_val(|e| val.encode(e))?; } Ok(()) }) } } impl Decodable for indexmap::IndexMap where K: Decodable + Hash + Eq, V: Decodable, S: BuildHasher + Default, { fn decode(d: &mut D) -> indexmap::IndexMap { let len = d.read_usize(); let state = Default::default(); let mut map = indexmap::IndexMap::with_capacity_and_hasher(len, state); for _ in 0..len { let key = Decodable::decode(d); let val = Decodable::decode(d); map.insert(key, val); } map } } impl Encodable for indexmap::IndexSet where T: Encodable + Hash + Eq, S: BuildHasher, { fn encode(&self, s: &mut E) -> Result<(), E::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 Decodable for indexmap::IndexSet where T: Decodable + Hash + Eq, S: BuildHasher + Default, { fn decode(d: &mut D) -> indexmap::IndexSet { let len = d.read_usize(); let state = Default::default(); let mut set = indexmap::IndexSet::with_capacity_and_hasher(len, state); for _ in 0..len { set.insert(Decodable::decode(d)); } set } } impl> Encodable for Rc<[T]> { fn encode(&self, s: &mut E) -> Result<(), E::Error> { let slice: &[T] = self; slice.encode(s) } } impl> Decodable for Rc<[T]> { fn decode(d: &mut D) -> Rc<[T]> { let vec: Vec = Decodable::decode(d); vec.into() } } impl> Encodable for Arc<[T]> { fn encode(&self, s: &mut E) -> Result<(), E::Error> { let slice: &[T] = self; slice.encode(s) } } impl> Decodable for Arc<[T]> { fn decode(d: &mut D) -> Arc<[T]> { let vec: Vec = Decodable::decode(d); vec.into() } }