use crate::{ de::{BorrowDecoder, Decode, Decoder}, enc::{self, Encode, Encoder}, error::{DecodeError, EncodeError}, impl_borrow_decode, BorrowDecode, Config, }; #[cfg(target_has_atomic = "ptr")] use alloc::sync::Arc; use alloc::{ borrow::{Cow, ToOwned}, boxed::Box, collections::*, rc::Rc, string::String, vec::Vec, }; #[derive(Default)] pub(crate) struct VecWriter { inner: Vec, } impl VecWriter { // May not be used in all feature combinations #[allow(dead_code)] pub(crate) fn collect(self) -> Vec { self.inner } } 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` with the given `Config`. See the [config] module for more information. /// /// [config]: config/index.html #[cfg_attr(docsrs, doc(cfg(feature = "alloc")))] pub fn encode_to_vec(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(decoder: &mut D) -> Result { let len = crate::de::decode_slice_len(decoder)?; decoder.claim_container_read::(len)?; let mut map = BinaryHeap::with_capacity(len); for _ in 0..len { // See the documentation on `unclaim_bytes_read` as to why we're doing this here decoder.unclaim_bytes_read(core::mem::size_of::()); let key = T::decode(decoder)?; map.push(key); } Ok(map) } } impl<'de, T> BorrowDecode<'de> for BinaryHeap where T: BorrowDecode<'de> + Ord, { fn borrow_decode>(decoder: &mut D) -> Result { let len = crate::de::decode_slice_len(decoder)?; decoder.claim_container_read::(len)?; let mut map = BinaryHeap::with_capacity(len); for _ in 0..len { // See the documentation on `unclaim_bytes_read` as to why we're doing this here decoder.unclaim_bytes_read(core::mem::size_of::()); let key = T::borrow_decode(decoder)?; map.push(key); } Ok(map) } } impl Encode for BinaryHeap where T: Encode + Ord, { fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { crate::enc::encode_slice_len(encoder, self.len())?; for val in self.iter() { val.encode(encoder)?; } Ok(()) } } impl Decode for BTreeMap where K: Decode + Ord, V: Decode, { fn decode(decoder: &mut D) -> Result { let len = crate::de::decode_slice_len(decoder)?; decoder.claim_container_read::<(K, V)>(len)?; let mut map = BTreeMap::new(); for _ in 0..len { // See the documentation on `unclaim_bytes_read` as to why we're doing this here decoder.unclaim_bytes_read(core::mem::size_of::<(K, V)>()); let key = K::decode(decoder)?; let value = V::decode(decoder)?; map.insert(key, value); } Ok(map) } } impl<'de, K, V> BorrowDecode<'de> for BTreeMap where K: BorrowDecode<'de> + Ord, V: BorrowDecode<'de>, { fn borrow_decode>(decoder: &mut D) -> Result { let len = crate::de::decode_slice_len(decoder)?; decoder.claim_container_read::<(K, V)>(len)?; let mut map = BTreeMap::new(); for _ in 0..len { // See the documentation on `unclaim_bytes_read` as to why we're doing this here decoder.unclaim_bytes_read(core::mem::size_of::<(K, V)>()); let key = K::borrow_decode(decoder)?; let value = V::borrow_decode(decoder)?; map.insert(key, value); } Ok(map) } } impl Encode for BTreeMap where K: Encode + Ord, V: Encode, { fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { crate::enc::encode_slice_len(encoder, self.len())?; for (key, val) in self.iter() { key.encode(encoder)?; val.encode(encoder)?; } Ok(()) } } impl Decode for BTreeSet where T: Decode + Ord, { fn decode(decoder: &mut D) -> Result { let len = crate::de::decode_slice_len(decoder)?; decoder.claim_container_read::(len)?; let mut map = BTreeSet::new(); for _ in 0..len { // See the documentation on `unclaim_bytes_read` as to why we're doing this here decoder.unclaim_bytes_read(core::mem::size_of::()); let key = T::decode(decoder)?; map.insert(key); } Ok(map) } } impl<'de, T> BorrowDecode<'de> for BTreeSet where T: BorrowDecode<'de> + Ord, { fn borrow_decode>(decoder: &mut D) -> Result { let len = crate::de::decode_slice_len(decoder)?; decoder.claim_container_read::(len)?; let mut map = BTreeSet::new(); for _ in 0..len { // See the documentation on `unclaim_bytes_read` as to why we're doing this here decoder.unclaim_bytes_read(core::mem::size_of::()); let key = T::borrow_decode(decoder)?; map.insert(key); } Ok(map) } } impl Encode for BTreeSet where T: Encode + Ord, { fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { crate::enc::encode_slice_len(encoder, self.len())?; for item in self.iter() { item.encode(encoder)?; } Ok(()) } } impl Decode for VecDeque where T: Decode, { fn decode(decoder: &mut D) -> Result { let len = crate::de::decode_slice_len(decoder)?; decoder.claim_container_read::(len)?; let mut map = VecDeque::with_capacity(len); for _ in 0..len { // See the documentation on `unclaim_bytes_read` as to why we're doing this here decoder.unclaim_bytes_read(core::mem::size_of::()); let key = T::decode(decoder)?; map.push_back(key); } Ok(map) } } impl<'de, T> BorrowDecode<'de> for VecDeque where T: BorrowDecode<'de>, { fn borrow_decode>(decoder: &mut D) -> Result { let len = crate::de::decode_slice_len(decoder)?; decoder.claim_container_read::(len)?; let mut map = VecDeque::with_capacity(len); for _ in 0..len { // See the documentation on `unclaim_bytes_read` as to why we're doing this here decoder.unclaim_bytes_read(core::mem::size_of::()); let key = T::borrow_decode(decoder)?; map.push_back(key); } Ok(map) } } impl Encode for VecDeque where T: Encode, { fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { crate::enc::encode_slice_len(encoder, self.len())?; for item in self.iter() { item.encode(encoder)?; } Ok(()) } } impl Decode for Vec where T: Decode, { fn decode(decoder: &mut D) -> Result { let len = crate::de::decode_slice_len(decoder)?; decoder.claim_container_read::(len)?; let mut vec = Vec::with_capacity(len); for _ in 0..len { // See the documentation on `unclaim_bytes_read` as to why we're doing this here decoder.unclaim_bytes_read(core::mem::size_of::()); vec.push(T::decode(decoder)?); } Ok(vec) } } impl<'de, T> BorrowDecode<'de> for Vec where T: BorrowDecode<'de>, { fn borrow_decode>(decoder: &mut D) -> Result { let len = crate::de::decode_slice_len(decoder)?; decoder.claim_container_read::(len)?; let mut vec = Vec::with_capacity(len); for _ in 0..len { // See the documentation on `unclaim_bytes_read` as to why we're doing this here decoder.unclaim_bytes_read(core::mem::size_of::()); vec.push(T::borrow_decode(decoder)?); } Ok(vec) } } impl Encode for Vec where T: Encode, { fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { crate::enc::encode_slice_len(encoder, self.len())?; for item in self.iter() { item.encode(encoder)?; } Ok(()) } } impl Decode for String { fn decode(decoder: &mut D) -> Result { let bytes = Vec::::decode(decoder)?; String::from_utf8(bytes).map_err(|e| DecodeError::Utf8 { inner: e.utf8_error(), }) } } impl_borrow_decode!(String); impl Encode for String { fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { self.as_bytes().encode(encoder) } } impl Decode for Box where T: Decode, { fn decode(decoder: &mut D) -> Result { let t = T::decode(decoder)?; Ok(Box::new(t)) } } impl<'de, T> BorrowDecode<'de> for Box where T: BorrowDecode<'de>, { fn borrow_decode>(decoder: &mut D) -> Result { let t = T::borrow_decode(decoder)?; Ok(Box::new(t)) } } impl Encode for Box where T: Encode + ?Sized, { fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { T::encode(self, encoder) } } impl Decode for Box<[T]> where T: Decode, { fn decode(decoder: &mut D) -> Result { let vec = Vec::decode(decoder)?; Ok(vec.into_boxed_slice()) } } impl<'de, T> BorrowDecode<'de> for Box<[T]> where T: BorrowDecode<'de> + 'de, { fn borrow_decode>(decoder: &mut D) -> Result { let vec = Vec::borrow_decode(decoder)?; Ok(vec.into_boxed_slice()) } } impl<'cow, T> Decode for Cow<'cow, T> where T: ToOwned + ?Sized, ::Owned: Decode, { fn decode(decoder: &mut D) -> Result { let t = ::Owned::decode(decoder)?; Ok(Cow::Owned(t)) } } impl<'cow, T> BorrowDecode<'cow> for Cow<'cow, T> where T: ToOwned + ?Sized, &'cow T: BorrowDecode<'cow>, { fn borrow_decode>(decoder: &mut D) -> Result { let t = <&T>::borrow_decode(decoder)?; Ok(Cow::Borrowed(t)) } } impl<'cow, T> Encode for Cow<'cow, T> where T: ToOwned + ?Sized, for<'a> &'a T: Encode, { fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { self.as_ref().encode(encoder) } } impl Decode for Rc where T: Decode, { fn decode(decoder: &mut D) -> Result { let t = T::decode(decoder)?; Ok(Rc::new(t)) } } impl<'de, T> BorrowDecode<'de> for Rc where T: BorrowDecode<'de>, { fn borrow_decode>(decoder: &mut D) -> Result { let t = T::borrow_decode(decoder)?; Ok(Rc::new(t)) } } impl Encode for Rc where T: Encode + ?Sized, { fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { T::encode(self, encoder) } } #[cfg(target_has_atomic = "ptr")] impl Decode for Arc where T: Decode, { fn decode(decoder: &mut D) -> Result { let t = T::decode(decoder)?; Ok(Arc::new(t)) } } #[cfg(target_has_atomic = "ptr")] impl Decode for Arc { fn decode(decoder: &mut D) -> Result { let decoded = String::decode(decoder)?; Ok(decoded.into()) } } #[cfg(target_has_atomic = "ptr")] impl<'de, T> BorrowDecode<'de> for Arc where T: BorrowDecode<'de>, { fn borrow_decode>(decoder: &mut D) -> Result { let t = T::borrow_decode(decoder)?; Ok(Arc::new(t)) } } #[cfg(target_has_atomic = "ptr")] impl<'de> BorrowDecode<'de> for Arc { fn borrow_decode>(decoder: &mut D) -> Result { let decoded = String::decode(decoder)?; Ok(decoded.into()) } } #[cfg(target_has_atomic = "ptr")] impl Encode for Arc where T: Encode + ?Sized, { fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { T::encode(self, encoder) } }