1 //! Implementations of serialization for structures found in liballoc
3 use std::hash::{BuildHasher, Hash};
5 use crate::{Decodable, Decoder, Encodable, Encoder};
6 use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet, LinkedList, VecDeque};
10 use smallvec::{Array, SmallVec};
12 impl<S: Encoder, A: Array<Item: Encodable<S>>> Encodable<S> for SmallVec<A> {
13 fn encode(&self, s: &mut S) -> Result<(), S::Error> {
14 let slice: &[A::Item] = self;
19 impl<D: Decoder, A: Array<Item: Decodable<D>>> Decodable<D> for SmallVec<A> {
20 fn decode(d: &mut D) -> SmallVec<A> {
21 d.read_seq(|d, len| (0..len).map(|_| d.read_seq_elt(|d| Decodable::decode(d))).collect())
25 impl<S: Encoder, T: Encodable<S>> Encodable<S> for LinkedList<T> {
26 fn encode(&self, s: &mut S) -> Result<(), S::Error> {
27 s.emit_seq(self.len(), |s| {
28 for (i, e) in self.iter().enumerate() {
29 s.emit_seq_elt(i, |s| e.encode(s))?;
36 impl<D: Decoder, T: Decodable<D>> Decodable<D> for LinkedList<T> {
37 fn decode(d: &mut D) -> LinkedList<T> {
38 d.read_seq(|d, len| (0..len).map(|_| d.read_seq_elt(|d| Decodable::decode(d))).collect())
42 impl<S: Encoder, T: Encodable<S>> Encodable<S> for VecDeque<T> {
43 fn encode(&self, s: &mut S) -> Result<(), S::Error> {
44 s.emit_seq(self.len(), |s| {
45 for (i, e) in self.iter().enumerate() {
46 s.emit_seq_elt(i, |s| e.encode(s))?;
53 impl<D: Decoder, T: Decodable<D>> Decodable<D> for VecDeque<T> {
54 fn decode(d: &mut D) -> VecDeque<T> {
55 d.read_seq(|d, len| (0..len).map(|_| d.read_seq_elt(|d| Decodable::decode(d))).collect())
59 impl<S: Encoder, K, V> Encodable<S> for BTreeMap<K, V>
61 K: Encodable<S> + PartialEq + Ord,
64 fn encode(&self, e: &mut S) -> Result<(), S::Error> {
65 e.emit_map(self.len(), |e| {
66 for (i, (key, val)) in self.iter().enumerate() {
67 e.emit_map_elt_key(i, |e| key.encode(e))?;
68 e.emit_map_elt_val(|e| val.encode(e))?;
75 impl<D: Decoder, K, V> Decodable<D> for BTreeMap<K, V>
77 K: Decodable<D> + PartialEq + Ord,
80 fn decode(d: &mut D) -> BTreeMap<K, V> {
82 let mut map = BTreeMap::new();
84 let key = d.read_map_elt_key(|d| Decodable::decode(d));
85 let val = d.read_map_elt_val(|d| Decodable::decode(d));
93 impl<S: Encoder, T> Encodable<S> for BTreeSet<T>
95 T: Encodable<S> + PartialEq + Ord,
97 fn encode(&self, s: &mut S) -> Result<(), S::Error> {
98 s.emit_seq(self.len(), |s| {
99 for (i, e) in self.iter().enumerate() {
100 s.emit_seq_elt(i, |s| e.encode(s))?;
107 impl<D: Decoder, T> Decodable<D> for BTreeSet<T>
109 T: Decodable<D> + PartialEq + Ord,
111 fn decode(d: &mut D) -> BTreeSet<T> {
112 d.read_seq(|d, len| {
113 let mut set = BTreeSet::new();
115 set.insert(d.read_seq_elt(|d| Decodable::decode(d)));
122 impl<E: Encoder, K, V, S> Encodable<E> for HashMap<K, V, S>
124 K: Encodable<E> + Eq,
128 fn encode(&self, e: &mut E) -> Result<(), E::Error> {
129 e.emit_map(self.len(), |e| {
130 for (i, (key, val)) in self.iter().enumerate() {
131 e.emit_map_elt_key(i, |e| key.encode(e))?;
132 e.emit_map_elt_val(|e| val.encode(e))?;
139 impl<D: Decoder, K, V, S> Decodable<D> for HashMap<K, V, S>
141 K: Decodable<D> + Hash + Eq,
143 S: BuildHasher + Default,
145 fn decode(d: &mut D) -> HashMap<K, V, S> {
146 d.read_map(|d, len| {
147 let state = Default::default();
148 let mut map = HashMap::with_capacity_and_hasher(len, state);
150 let key = d.read_map_elt_key(|d| Decodable::decode(d));
151 let val = d.read_map_elt_val(|d| Decodable::decode(d));
152 map.insert(key, val);
159 impl<E: Encoder, T, S> Encodable<E> for HashSet<T, S>
161 T: Encodable<E> + Eq,
164 fn encode(&self, s: &mut E) -> Result<(), E::Error> {
165 s.emit_seq(self.len(), |s| {
166 for (i, e) in self.iter().enumerate() {
167 s.emit_seq_elt(i, |s| e.encode(s))?;
174 impl<E: Encoder, T, S> Encodable<E> for &HashSet<T, S>
176 T: Encodable<E> + Eq,
179 fn encode(&self, s: &mut E) -> Result<(), E::Error> {
184 impl<D: Decoder, T, S> Decodable<D> for HashSet<T, S>
186 T: Decodable<D> + Hash + Eq,
187 S: BuildHasher + Default,
189 fn decode(d: &mut D) -> HashSet<T, S> {
190 d.read_seq(|d, len| {
191 let state = Default::default();
192 let mut set = HashSet::with_capacity_and_hasher(len, state);
194 set.insert(d.read_seq_elt(|d| Decodable::decode(d)));
201 impl<E: Encoder, K, V, S> Encodable<E> for indexmap::IndexMap<K, V, S>
203 K: Encodable<E> + Hash + Eq,
207 fn encode(&self, e: &mut E) -> Result<(), E::Error> {
208 e.emit_map(self.len(), |e| {
209 for (i, (key, val)) in self.iter().enumerate() {
210 e.emit_map_elt_key(i, |e| key.encode(e))?;
211 e.emit_map_elt_val(|e| val.encode(e))?;
218 impl<D: Decoder, K, V, S> Decodable<D> for indexmap::IndexMap<K, V, S>
220 K: Decodable<D> + Hash + Eq,
222 S: BuildHasher + Default,
224 fn decode(d: &mut D) -> indexmap::IndexMap<K, V, S> {
225 d.read_map(|d, len| {
226 let state = Default::default();
227 let mut map = indexmap::IndexMap::with_capacity_and_hasher(len, state);
229 let key = d.read_map_elt_key(|d| Decodable::decode(d));
230 let val = d.read_map_elt_val(|d| Decodable::decode(d));
231 map.insert(key, val);
238 impl<E: Encoder, T, S> Encodable<E> for indexmap::IndexSet<T, S>
240 T: Encodable<E> + Hash + Eq,
243 fn encode(&self, s: &mut E) -> Result<(), E::Error> {
244 s.emit_seq(self.len(), |s| {
245 for (i, e) in self.iter().enumerate() {
246 s.emit_seq_elt(i, |s| e.encode(s))?;
253 impl<D: Decoder, T, S> Decodable<D> for indexmap::IndexSet<T, S>
255 T: Decodable<D> + Hash + Eq,
256 S: BuildHasher + Default,
258 fn decode(d: &mut D) -> indexmap::IndexSet<T, S> {
259 d.read_seq(|d, len| {
260 let state = Default::default();
261 let mut set = indexmap::IndexSet::with_capacity_and_hasher(len, state);
263 set.insert(d.read_seq_elt(|d| Decodable::decode(d)));
270 impl<E: Encoder, T: Encodable<E>> Encodable<E> for Rc<[T]> {
271 fn encode(&self, s: &mut E) -> Result<(), E::Error> {
272 let slice: &[T] = self;
277 impl<D: Decoder, T: Decodable<D>> Decodable<D> for Rc<[T]> {
278 fn decode(d: &mut D) -> Rc<[T]> {
279 let vec: Vec<T> = Decodable::decode(d);
284 impl<E: Encoder, T: Encodable<E>> Encodable<E> for Arc<[T]> {
285 fn encode(&self, s: &mut E) -> Result<(), E::Error> {
286 let slice: &[T] = self;
291 impl<D: Decoder, T: Decodable<D>> Decodable<D> for Arc<[T]> {
292 fn decode(d: &mut D) -> Arc<[T]> {
293 let vec: Vec<T> = Decodable::decode(d);