//! Implementations of serialization for structures found in liballoc use crate::{Decodable, Decoder, Encodable, Encoder}; use smallvec::{Array, SmallVec}; use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet, LinkedList, VecDeque}; use std::hash::{BuildHasher, Hash}; use std::rc::Rc; use std::sync::Arc; use thin_vec::ThinVec; impl>> Encodable for SmallVec { fn encode(&self, s: &mut S) { 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 ThinVec { fn encode(&self, s: &mut S) { self.as_slice().encode(s); } } impl> Decodable for ThinVec { fn decode(d: &mut D) -> ThinVec { let len = d.read_usize(); (0..len).map(|_| Decodable::decode(d)).collect() } } impl> Encodable for LinkedList { fn encode(&self, s: &mut S) { s.emit_usize(self.len()); for e in self.iter() { e.encode(s); } } } 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) { s.emit_usize(self.len()); for e in self.iter() { e.encode(s); } } } 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) { e.emit_usize(self.len()); for (key, val) in self.iter() { key.encode(e); val.encode(e); } } } 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) { s.emit_usize(self.len()); for e in self.iter() { e.encode(s); } } } 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) { e.emit_usize(self.len()); for (key, val) in self.iter() { key.encode(e); val.encode(e); } } } 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) { s.emit_usize(self.len()); for e in self.iter() { e.encode(s); } } } 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) { e.emit_usize(self.len()); for (key, val) in self.iter() { key.encode(e); val.encode(e); } } } 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) { s.emit_usize(self.len()); for e in self.iter() { e.encode(s); } } } 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) { 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) { 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() } }