use crate::{ config, de::{Decode, Decoder}, enc::{self, Encode, Encoder}, error::{DecodeError, EncodeError}, Config, }; use alloc::{borrow::Cow, boxed::Box, collections::*, rc::Rc, string::String, sync::Arc, vec::Vec}; #[derive(Default)] struct VecWriter { inner: Vec, } impl enc::write::Writer for VecWriter { fn write(&mut self, bytes: &[u8]) -> Result<(), EncodeError> { self.inner.extend_from_slice(bytes); Ok(()) } } /// Encode the given value into a `Vec`. #[cfg_attr(docsrs, doc(cfg(feature = "alloc")))] pub fn encode_to_vec(val: E) -> Result, EncodeError> { encode_to_vec_with_config(val, config::Default) } /// Encode the given value into a `Vec` with the given `Config`. See the [config] module for more information. #[cfg_attr(docsrs, doc(cfg(feature = "alloc")))] pub fn encode_to_vec_with_config( val: E, config: C, ) -> Result, EncodeError> { let writer = VecWriter::default(); let mut encoder = enc::EncoderImpl::<_, C>::new(writer, config); val.encode(&mut encoder)?; Ok(encoder.into_writer().inner) } impl Decode for BinaryHeap where T: Decode + Ord, { fn decode(mut decoder: D) -> Result { let len = usize::decode(&mut decoder)?; let mut map = BinaryHeap::with_capacity(len); for _ in 0..len { let key = T::decode(&mut decoder)?; map.push(key); } Ok(map) } } impl Encode for BinaryHeap where T: Encode + Ord, { fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { self.len().encode(&mut encoder)?; for val in self.iter() { val.encode(&mut encoder)?; } Ok(()) } } impl Decode for BTreeMap where K: Decode + Ord, V: Decode, { fn decode(mut decoder: D) -> Result { let len = usize::decode(&mut decoder)?; let mut map = BTreeMap::new(); for _ in 0..len { let key = K::decode(&mut decoder)?; let value = V::decode(&mut decoder)?; map.insert(key, value); } Ok(map) } } impl Encode for BTreeMap where K: Encode + Ord, V: Encode, { fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { self.len().encode(&mut encoder)?; for (key, val) in self.iter() { key.encode(&mut encoder)?; val.encode(&mut encoder)?; } Ok(()) } } impl Decode for BTreeSet where T: Decode + Ord, { fn decode(mut decoder: D) -> Result { let len = usize::decode(&mut decoder)?; let mut map = BTreeSet::new(); for _ in 0..len { let key = T::decode(&mut decoder)?; map.insert(key); } Ok(map) } } impl Encode for BTreeSet where T: Encode + Ord, { fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { self.len().encode(&mut encoder)?; for item in self.iter() { item.encode(&mut encoder)?; } Ok(()) } } impl Decode for VecDeque where T: Decode, { fn decode(mut decoder: D) -> Result { let len = usize::decode(&mut decoder)?; let mut map = VecDeque::with_capacity(len); for _ in 0..len { let key = T::decode(&mut decoder)?; map.push_back(key); } Ok(map) } } impl Encode for VecDeque where T: Encode, { fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { self.len().encode(&mut encoder)?; for item in self.iter() { item.encode(&mut encoder)?; } Ok(()) } } impl Decode for Vec where T: Decode, { fn decode(mut decoder: D) -> Result { let len = usize::decode(&mut decoder)?; let mut vec = Vec::with_capacity(len); for _ in 0..len { vec.push(T::decode(&mut decoder)?); } Ok(vec) } } impl Encode for Vec where T: Encode, { fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { self.len().encode(&mut encoder)?; for item in self.iter() { item.encode(&mut encoder)?; } Ok(()) } } impl Decode for String { fn decode(decoder: D) -> Result { let bytes = Vec::::decode(decoder)?; String::from_utf8(bytes).map_err(|e| DecodeError::Utf8(e.utf8_error())) } } impl Encode for String { fn encode(&self, encoder: E) -> Result<(), EncodeError> { self.as_bytes().encode(encoder) } } impl Decode for Box where T: Decode, { fn decode(decoder: D) -> Result { let t = T::decode(decoder)?; Ok(Box::new(t)) } } impl Encode for Box where T: Encode, { fn encode(&self, encoder: E) -> Result<(), EncodeError> { T::encode(self, encoder) } } impl Decode for Box<[T]> where T: Decode, { fn decode(decoder: D) -> Result { let vec = Vec::decode(decoder)?; Ok(vec.into_boxed_slice()) } } impl Encode for Box<[T]> where T: Encode, { fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { self.len().encode(&mut encoder)?; for item in self.iter() { item.encode(&mut encoder)?; } Ok(()) } } impl<'cow, T> Decode for Cow<'cow, T> where T: Decode + Clone, { fn decode(decoder: D) -> Result { let t = T::decode(decoder)?; Ok(Cow::Owned(t)) } } impl<'cow, T> Encode for Cow<'cow, T> where T: Encode + Clone, { fn encode(&self, encoder: E) -> Result<(), EncodeError> { self.as_ref().encode(encoder) } } impl Decode for Rc where T: Decode, { fn decode(decoder: D) -> Result { let t = T::decode(decoder)?; Ok(Rc::new(t)) } } impl Encode for Rc where T: Encode, { fn encode(&self, encoder: E) -> Result<(), EncodeError> { T::encode(self, encoder) } } #[cfg(feature = "atomic")] impl Decode for Arc where T: Decode, { fn decode(decoder: D) -> Result { let t = T::decode(decoder)?; Ok(Arc::new(t)) } } #[cfg(feature = "atomic")] impl Encode for Arc where T: Encode, { fn encode(&self, encoder: E) -> Result<(), EncodeError> { T::encode(self, encoder) } }