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 s.emit_seq(self.len(), |s| {
15 for (i, e) in self.iter().enumerate() {
16 s.emit_seq_elt(i, |s| e.encode(s))?;
23 impl<D: Decoder, A: Array<Item: Decodable<D>>> Decodable<D> for SmallVec<A> {
24 fn decode(d: &mut D) -> Result<SmallVec<A>, D::Error> {
26 let mut vec = SmallVec::with_capacity(len);
27 // FIXME(#48994) - could just be collected into a Result<SmallVec, D::Error>
29 vec.push(d.read_seq_elt(i, |d| Decodable::decode(d))?);
36 impl<S: Encoder, T: Encodable<S>> Encodable<S> for LinkedList<T> {
37 fn encode(&self, s: &mut S) -> Result<(), S::Error> {
38 s.emit_seq(self.len(), |s| {
39 for (i, e) in self.iter().enumerate() {
40 s.emit_seq_elt(i, |s| e.encode(s))?;
47 impl<D: Decoder, T: Decodable<D>> Decodable<D> for LinkedList<T> {
48 fn decode(d: &mut D) -> Result<LinkedList<T>, D::Error> {
50 let mut list = LinkedList::new();
52 list.push_back(d.read_seq_elt(i, |d| Decodable::decode(d))?);
59 impl<S: Encoder, T: Encodable<S>> Encodable<S> for VecDeque<T> {
60 fn encode(&self, s: &mut S) -> Result<(), S::Error> {
61 s.emit_seq(self.len(), |s| {
62 for (i, e) in self.iter().enumerate() {
63 s.emit_seq_elt(i, |s| e.encode(s))?;
70 impl<D: Decoder, T: Decodable<D>> Decodable<D> for VecDeque<T> {
71 fn decode(d: &mut D) -> Result<VecDeque<T>, D::Error> {
73 let mut deque: VecDeque<T> = VecDeque::with_capacity(len);
75 deque.push_back(d.read_seq_elt(i, |d| Decodable::decode(d))?);
82 impl<S: Encoder, K, V> Encodable<S> for BTreeMap<K, V>
84 K: Encodable<S> + PartialEq + Ord,
87 fn encode(&self, e: &mut S) -> Result<(), S::Error> {
88 e.emit_map(self.len(), |e| {
89 for (i, (key, val)) in self.iter().enumerate() {
90 e.emit_map_elt_key(i, |e| key.encode(e))?;
91 e.emit_map_elt_val(i, |e| val.encode(e))?;
98 impl<D: Decoder, K, V> Decodable<D> for BTreeMap<K, V>
100 K: Decodable<D> + PartialEq + Ord,
103 fn decode(d: &mut D) -> Result<BTreeMap<K, V>, D::Error> {
104 d.read_map(|d, len| {
105 let mut map = BTreeMap::new();
107 let key = d.read_map_elt_key(i, |d| Decodable::decode(d))?;
108 let val = d.read_map_elt_val(i, |d| Decodable::decode(d))?;
109 map.insert(key, val);
116 impl<S: Encoder, T> Encodable<S> for BTreeSet<T>
118 T: Encodable<S> + PartialEq + Ord,
120 fn encode(&self, s: &mut S) -> Result<(), S::Error> {
121 s.emit_seq(self.len(), |s| {
122 for (i, e) in self.iter().enumerate() {
123 s.emit_seq_elt(i, |s| e.encode(s))?;
130 impl<D: Decoder, T> Decodable<D> for BTreeSet<T>
132 T: Decodable<D> + PartialEq + Ord,
134 fn decode(d: &mut D) -> Result<BTreeSet<T>, D::Error> {
135 d.read_seq(|d, len| {
136 let mut set = BTreeSet::new();
138 set.insert(d.read_seq_elt(i, |d| Decodable::decode(d))?);
145 impl<E: Encoder, K, V, S> Encodable<E> for HashMap<K, V, S>
147 K: Encodable<E> + Eq,
151 fn encode(&self, e: &mut E) -> Result<(), E::Error> {
152 e.emit_map(self.len(), |e| {
153 for (i, (key, val)) in self.iter().enumerate() {
154 e.emit_map_elt_key(i, |e| key.encode(e))?;
155 e.emit_map_elt_val(i, |e| val.encode(e))?;
162 impl<D: Decoder, K, V, S> Decodable<D> for HashMap<K, V, S>
164 K: Decodable<D> + Hash + Eq,
166 S: BuildHasher + Default,
168 fn decode(d: &mut D) -> Result<HashMap<K, V, S>, D::Error> {
169 d.read_map(|d, len| {
170 let state = Default::default();
171 let mut map = HashMap::with_capacity_and_hasher(len, state);
173 let key = d.read_map_elt_key(i, |d| Decodable::decode(d))?;
174 let val = d.read_map_elt_val(i, |d| Decodable::decode(d))?;
175 map.insert(key, val);
182 impl<E: Encoder, T, S> Encodable<E> for HashSet<T, S>
184 T: Encodable<E> + Eq,
187 fn encode(&self, s: &mut E) -> Result<(), E::Error> {
188 s.emit_seq(self.len(), |s| {
189 for (i, e) in self.iter().enumerate() {
190 s.emit_seq_elt(i, |s| e.encode(s))?;
197 impl<E: Encoder, T, S> Encodable<E> for &HashSet<T, S>
199 T: Encodable<E> + Eq,
202 fn encode(&self, s: &mut E) -> Result<(), E::Error> {
207 impl<D: Decoder, T, S> Decodable<D> for HashSet<T, S>
209 T: Decodable<D> + Hash + Eq,
210 S: BuildHasher + Default,
212 fn decode(d: &mut D) -> Result<HashSet<T, S>, D::Error> {
213 d.read_seq(|d, len| {
214 let state = Default::default();
215 let mut set = HashSet::with_capacity_and_hasher(len, state);
217 set.insert(d.read_seq_elt(i, |d| Decodable::decode(d))?);
224 impl<E: Encoder, K, V, S> Encodable<E> for indexmap::IndexMap<K, V, S>
226 K: Encodable<E> + Hash + Eq,
230 fn encode(&self, e: &mut E) -> Result<(), E::Error> {
231 e.emit_map(self.len(), |e| {
232 for (i, (key, val)) in self.iter().enumerate() {
233 e.emit_map_elt_key(i, |e| key.encode(e))?;
234 e.emit_map_elt_val(i, |e| val.encode(e))?;
241 impl<D: Decoder, K, V, S> Decodable<D> for indexmap::IndexMap<K, V, S>
243 K: Decodable<D> + Hash + Eq,
245 S: BuildHasher + Default,
247 fn decode(d: &mut D) -> Result<indexmap::IndexMap<K, V, S>, D::Error> {
248 d.read_map(|d, len| {
249 let state = Default::default();
250 let mut map = indexmap::IndexMap::with_capacity_and_hasher(len, state);
252 let key = d.read_map_elt_key(i, |d| Decodable::decode(d))?;
253 let val = d.read_map_elt_val(i, |d| Decodable::decode(d))?;
254 map.insert(key, val);
261 impl<E: Encoder, T, S> Encodable<E> for indexmap::IndexSet<T, S>
263 T: Encodable<E> + Hash + Eq,
266 fn encode(&self, s: &mut E) -> Result<(), E::Error> {
267 s.emit_seq(self.len(), |s| {
268 for (i, e) in self.iter().enumerate() {
269 s.emit_seq_elt(i, |s| e.encode(s))?;
276 impl<D: Decoder, T, S> Decodable<D> for indexmap::IndexSet<T, S>
278 T: Decodable<D> + Hash + Eq,
279 S: BuildHasher + Default,
281 fn decode(d: &mut D) -> Result<indexmap::IndexSet<T, S>, D::Error> {
282 d.read_seq(|d, len| {
283 let state = Default::default();
284 let mut set = indexmap::IndexSet::with_capacity_and_hasher(len, state);
286 set.insert(d.read_seq_elt(i, |d| Decodable::decode(d))?);
293 impl<E: Encoder, T: Encodable<E>> Encodable<E> for Rc<[T]> {
294 fn encode(&self, s: &mut E) -> Result<(), E::Error> {
295 s.emit_seq(self.len(), |s| {
296 for (index, e) in self.iter().enumerate() {
297 s.emit_seq_elt(index, |s| e.encode(s))?;
304 impl<D: Decoder, T: Decodable<D>> Decodable<D> for Rc<[T]> {
305 fn decode(d: &mut D) -> Result<Rc<[T]>, D::Error> {
306 d.read_seq(|d, len| {
307 let mut vec = Vec::with_capacity(len);
308 for index in 0..len {
309 vec.push(d.read_seq_elt(index, |d| Decodable::decode(d))?);
316 impl<E: Encoder, T: Encodable<E>> Encodable<E> for Arc<[T]> {
317 fn encode(&self, s: &mut E) -> Result<(), E::Error> {
318 s.emit_seq(self.len(), |s| {
319 for (index, e) in self.iter().enumerate() {
320 s.emit_seq_elt(index, |s| e.encode(s))?;
327 impl<D: Decoder, T: Decodable<D>> Decodable<D> for Arc<[T]> {
328 fn decode(d: &mut D) -> Result<Arc<[T]>, D::Error> {
329 d.read_seq(|d, len| {
330 let mut vec = Vec::with_capacity(len);
331 for index in 0..len {
332 vec.push(d.read_seq_elt(index, |d| Decodable::decode(d))?);