use crate::{ de::{read::Reader, BorrowDecoder, Decode, Decoder}, enc::{ self, write::{SizeWriter, Writer}, Encode, Encoder, }, error::{DecodeError, EncodeError}, impl_borrow_decode, BorrowDecode, Config, }; use alloc::{ borrow::{Cow, ToOwned}, boxed::Box, collections::*, rc::Rc, string::String, vec::Vec, }; #[cfg(target_has_atomic = "ptr")] use alloc::sync::Arc; #[derive(Default)] pub(crate) struct VecWriter { inner: Vec, } impl VecWriter { /// Create a new vec writer with the given capacity pub fn with_capacity(cap: usize) -> Self { Self { inner: Vec::with_capacity(cap), } } // 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 { #[inline(always)] 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 size = { let mut size_writer = enc::EncoderImpl::<_, C>::new(SizeWriter::default(), config); val.encode(&mut size_writer)?; size_writer.into_writer().bytes_written }; let writer = VecWriter::with_capacity(size); 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 { Ok(Vec::::decode(decoder)?.into()) } } impl<'de, T, Context> BorrowDecode<'de, Context> for BinaryHeap where T: BorrowDecode<'de, Context> + Ord, { fn borrow_decode>( decoder: &mut D, ) -> Result { Ok(Vec::::borrow_decode(decoder)?.into()) } } impl Encode for BinaryHeap where T: Encode + Ord, { fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { // BLOCKEDTODO(https://github.com/rust-lang/rust/issues/83659): we can u8 optimize this with `.as_slice()` 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, Context> BorrowDecode<'de, Context> for BTreeMap where K: BorrowDecode<'de, Context> + Ord, V: BorrowDecode<'de, Context>, { 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, Context> BorrowDecode<'de, Context> for BTreeSet where T: BorrowDecode<'de, Context> + 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 { Ok(Vec::::decode(decoder)?.into()) } } impl<'de, T, Context> BorrowDecode<'de, Context> for VecDeque where T: BorrowDecode<'de, Context>, { fn borrow_decode>( decoder: &mut D, ) -> Result { Ok(Vec::::borrow_decode(decoder)?.into()) } } impl Encode for VecDeque where T: Encode, { fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { crate::enc::encode_slice_len(encoder, self.len())?; if unty::type_equal::() { let slices: (&[T], &[T]) = self.as_slices(); // Safety: T is u8 so turning this into `&[u8]` is okay let slices: (&[u8], &[u8]) = unsafe { ( core::slice::from_raw_parts(slices.0.as_ptr().cast(), slices.0.len()), core::slice::from_raw_parts(slices.1.as_ptr().cast(), slices.1.len()), ) }; encoder.writer().write(slices.0)?; encoder.writer().write(slices.1)?; } else { 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)?; if unty::type_equal::() { decoder.claim_container_read::(len)?; // optimize for reading u8 vecs let mut vec = alloc::vec![0u8; len]; decoder.reader().read(&mut vec)?; // Safety: Vec is Vec Ok(unsafe { core::mem::transmute::, Vec>(vec) }) } else { 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, Context> BorrowDecode<'de, Context> for Vec where T: BorrowDecode<'de, Context>, { fn borrow_decode>( decoder: &mut D, ) -> Result { let len = crate::de::decode_slice_len(decoder)?; if unty::type_equal::() { decoder.claim_container_read::(len)?; // optimize for reading u8 vecs let mut vec = alloc::vec![0u8; len]; decoder.reader().read(&mut vec)?; // Safety: Vec is Vec Ok(unsafe { core::mem::transmute::, Vec>(vec) }) } else { 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())?; if unty::type_equal::() { // Safety: T == u8 let slice: &[u8] = unsafe { core::mem::transmute(self.as_slice()) }; encoder.writer().write(slice)?; Ok(()) } else { 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 Decode for Box { fn decode(decoder: &mut D) -> Result { String::decode(decoder).map(String::into_boxed_str) } } impl_borrow_decode!(Box); 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, Context> BorrowDecode<'de, Context> for Box where T: BorrowDecode<'de, Context>, { 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 + 'static, { fn decode>(decoder: &mut D) -> Result { let vec = Vec::decode(decoder)?; Ok(vec.into_boxed_slice()) } } impl<'de, T, Context> BorrowDecode<'de, Context> for Box<[T]> where T: BorrowDecode<'de, Context> + 'de, { fn borrow_decode>( decoder: &mut D, ) -> Result { let vec = Vec::borrow_decode(decoder)?; Ok(vec.into_boxed_slice()) } } impl Decode for 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, Context> BorrowDecode<'cow, Context> for Cow<'cow, T> where T: ToOwned + ?Sized, &'cow T: BorrowDecode<'cow, Context>, { fn borrow_decode>( decoder: &mut D, ) -> Result { let t = <&T>::borrow_decode(decoder)?; Ok(Cow::Borrowed(t)) } } impl Encode for Cow<'_, T> where T: ToOwned + ?Sized, for<'a> &'a T: Encode, { fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { self.as_ref().encode(encoder) } } #[test] fn test_cow_round_trip() { let start = Cow::Borrowed("Foo"); let encoded = crate::encode_to_vec(&start, crate::config::standard()).unwrap(); let (end, _) = crate::borrow_decode_from_slice::, _>(&encoded, crate::config::standard()) .unwrap(); assert_eq!(start, end); let (end, _) = crate::decode_from_slice::, _>(&encoded, crate::config::standard()).unwrap(); assert_eq!(start, end); } impl Decode for Rc where T: Decode, { fn decode>(decoder: &mut D) -> Result { let t = T::decode(decoder)?; Ok(Rc::new(t)) } } impl Decode for Rc { fn decode>(decoder: &mut D) -> Result { let decoded = String::decode(decoder)?; Ok(decoded.into()) } } impl<'de, T, Context> BorrowDecode<'de, Context> for Rc where T: BorrowDecode<'de, Context>, { fn borrow_decode>( decoder: &mut D, ) -> Result { let t = T::borrow_decode(decoder)?; Ok(Rc::new(t)) } } impl<'de, Context> BorrowDecode<'de, Context> for Rc { fn borrow_decode>( decoder: &mut D, ) -> Result { let decoded = String::decode(decoder)?; Ok(decoded.into()) } } impl Encode for Rc where T: Encode + ?Sized, { fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { T::encode(self, encoder) } } impl Decode for Rc<[T]> where T: Decode + 'static, { fn decode>(decoder: &mut D) -> Result { let vec = Vec::decode(decoder)?; Ok(vec.into()) } } impl<'de, T, Context> BorrowDecode<'de, Context> for Rc<[T]> where T: BorrowDecode<'de, Context> + 'de, { fn borrow_decode>( decoder: &mut D, ) -> Result { let vec = Vec::borrow_decode(decoder)?; Ok(vec.into()) } } #[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, Context> BorrowDecode<'de, Context> for Arc where T: BorrowDecode<'de, Context>, { fn borrow_decode>( decoder: &mut D, ) -> Result { let t = T::borrow_decode(decoder)?; Ok(Arc::new(t)) } } #[cfg(target_has_atomic = "ptr")] impl<'de, Context> BorrowDecode<'de, Context> 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) } } #[cfg(target_has_atomic = "ptr")] impl Decode for Arc<[T]> where T: Decode + 'static, { fn decode>(decoder: &mut D) -> Result { let vec = Vec::decode(decoder)?; Ok(vec.into()) } } #[cfg(target_has_atomic = "ptr")] impl<'de, T, Context> BorrowDecode<'de, Context> for Arc<[T]> where T: BorrowDecode<'de, Context> + 'de, { fn borrow_decode>( decoder: &mut D, ) -> Result { let vec = Vec::borrow_decode(decoder)?; Ok(vec.into()) } }