1use core::{
18 convert::TryFrom,
19 fmt,
20 iter::FromIterator,
21 marker::PhantomData,
22 mem,
23 mem::MaybeUninit,
24 num::{
25 NonZeroI128, NonZeroI16, NonZeroI32, NonZeroI64, NonZeroI8, NonZeroU128, NonZeroU16,
26 NonZeroU32, NonZeroU64, NonZeroU8,
27 },
28 ops::{Deref, Range, RangeInclusive},
29 time::Duration,
30};
31
32use byte_slice_cast::{AsByteSlice, AsMutByteSlice, ToMutByteSlice};
33
34#[cfg(target_has_atomic = "ptr")]
35use crate::alloc::sync::Arc;
36use crate::{
37 alloc::{
38 borrow::{Cow, ToOwned},
39 boxed::Box,
40 collections::{BTreeMap, BTreeSet, BinaryHeap, LinkedList, VecDeque},
41 rc::Rc,
42 string::String,
43 vec::Vec,
44 },
45 compact::Compact,
46 encode_like::EncodeLike,
47 mem_tracking::DecodeWithMemTracking,
48 DecodeFinished, Error,
49};
50
51pub(crate) const MAX_PREALLOCATION: usize = 16 * 1024;
52const A_BILLION: u32 = 1_000_000_000;
53
54pub trait Input {
56 fn remaining_len(&mut self) -> Result<Option<usize>, Error>;
63
64 fn read(&mut self, into: &mut [u8]) -> Result<(), Error>;
69
70 fn read_byte(&mut self) -> Result<u8, Error> {
72 let mut buf = [0u8];
73 self.read(&mut buf[..])?;
74 Ok(buf[0])
75 }
76
77 fn descend_ref(&mut self) -> Result<(), Error> {
82 Ok(())
83 }
84
85 fn ascend_ref(&mut self) {}
88
89 fn on_before_alloc_mem(&mut self, _size: usize) -> Result<(), Error> {
97 Ok(())
98 }
99
100 #[cfg(feature = "bytes")]
104 #[doc(hidden)]
105 fn scale_internal_decode_bytes(&mut self) -> Result<bytes::Bytes, Error>
106 where
107 Self: Sized,
108 {
109 Vec::<u8>::decode(self).map(bytes::Bytes::from)
110 }
111}
112
113impl Input for &[u8] {
114 fn remaining_len(&mut self) -> Result<Option<usize>, Error> {
115 Ok(Some(self.len()))
116 }
117
118 fn read(&mut self, into: &mut [u8]) -> Result<(), Error> {
119 if into.len() > self.len() {
120 return Err("Not enough data to fill buffer".into());
121 }
122 let len = into.len();
123 into.copy_from_slice(&self[..len]);
124 *self = &self[len..];
125 Ok(())
126 }
127}
128
129#[cfg(feature = "std")]
130impl From<std::io::Error> for Error {
131 fn from(err: std::io::Error) -> Self {
132 use std::io::ErrorKind::*;
133 match err.kind() {
134 NotFound => "io error: NotFound".into(),
135 PermissionDenied => "io error: PermissionDenied".into(),
136 ConnectionRefused => "io error: ConnectionRefused".into(),
137 ConnectionReset => "io error: ConnectionReset".into(),
138 ConnectionAborted => "io error: ConnectionAborted".into(),
139 NotConnected => "io error: NotConnected".into(),
140 AddrInUse => "io error: AddrInUse".into(),
141 AddrNotAvailable => "io error: AddrNotAvailable".into(),
142 BrokenPipe => "io error: BrokenPipe".into(),
143 AlreadyExists => "io error: AlreadyExists".into(),
144 WouldBlock => "io error: WouldBlock".into(),
145 InvalidInput => "io error: InvalidInput".into(),
146 InvalidData => "io error: InvalidData".into(),
147 TimedOut => "io error: TimedOut".into(),
148 WriteZero => "io error: WriteZero".into(),
149 Interrupted => "io error: Interrupted".into(),
150 Other => "io error: Other".into(),
151 UnexpectedEof => "io error: UnexpectedEof".into(),
152 _ => "io error: Unknown".into(),
153 }
154 }
155}
156
157#[cfg(feature = "std")]
159pub struct IoReader<R: std::io::Read>(pub R);
160
161#[cfg(feature = "std")]
162impl<R: std::io::Read> Input for IoReader<R> {
163 fn remaining_len(&mut self) -> Result<Option<usize>, Error> {
164 Ok(None)
165 }
166
167 fn read(&mut self, into: &mut [u8]) -> Result<(), Error> {
168 self.0.read_exact(into).map_err(Into::into)
169 }
170}
171
172pub trait Output {
174 fn write(&mut self, bytes: &[u8]);
176
177 fn push_byte(&mut self, byte: u8) {
179 self.write(&[byte]);
180 }
181}
182
183#[cfg(not(feature = "std"))]
184impl Output for Vec<u8> {
185 fn write(&mut self, bytes: &[u8]) {
186 self.extend_from_slice(bytes)
187 }
188}
189
190#[cfg(feature = "std")]
191impl<W: std::io::Write> Output for W {
192 fn write(&mut self, bytes: &[u8]) {
193 (self as &mut dyn std::io::Write)
194 .write_all(bytes)
195 .expect("Codec outputs are infallible");
196 }
197}
198
199#[doc(hidden)]
203#[non_exhaustive]
204pub enum TypeInfo {
205 Unknown,
208 U8,
209 I8,
210 U16,
211 I16,
212 U32,
213 I32,
214 U64,
215 I64,
216 U128,
217 I128,
218 F32,
219 F64,
220}
221
222pub trait Encode {
227 #[doc(hidden)]
230 const TYPE_INFO: TypeInfo = TypeInfo::Unknown;
231
232 fn size_hint(&self) -> usize {
237 0
238 }
239
240 fn encode_to<T: Output + ?Sized>(&self, dest: &mut T) {
242 self.using_encoded(|buf| dest.write(buf));
243 }
244
245 fn encode(&self) -> Vec<u8> {
247 let mut r = Vec::with_capacity(self.size_hint());
248 self.encode_to(&mut r);
249 r
250 }
251
252 fn using_encoded<R, F: FnOnce(&[u8]) -> R>(&self, f: F) -> R {
254 f(&self.encode())
255 }
256
257 fn encoded_size(&self) -> usize {
267 let mut size_tracker = SizeTracker { written: 0 };
268 self.encode_to(&mut size_tracker);
269 size_tracker.written
270 }
271}
272
273struct SizeTracker {
275 written: usize,
276}
277
278impl Output for SizeTracker {
279 fn write(&mut self, bytes: &[u8]) {
280 self.written += bytes.len();
281 }
282
283 fn push_byte(&mut self, _byte: u8) {
284 self.written += 1;
285 }
286}
287
288pub trait DecodeLength {
291 fn len(self_encoded: &[u8]) -> Result<usize, Error>;
293}
294
295pub trait Decode: Sized {
297 #[doc(hidden)]
300 const TYPE_INFO: TypeInfo = TypeInfo::Unknown;
301
302 fn decode<I: Input>(input: &mut I) -> Result<Self, Error>;
304
305 fn decode_into<I: Input>(
317 input: &mut I,
318 dst: &mut MaybeUninit<Self>,
319 ) -> Result<DecodeFinished, Error> {
320 let value = Self::decode(input)?;
321 dst.write(value);
322
323 unsafe { Ok(DecodeFinished::assert_decoding_finished()) }
325 }
326
327 fn skip<I: Input>(input: &mut I) -> Result<(), Error> {
332 Self::decode(input).map(|_| ())
333 }
334
335 fn encoded_fixed_size() -> Option<usize> {
342 None
343 }
344}
345
346pub trait Codec: Decode + Encode {}
348impl<S: Decode + Encode> Codec for S {}
349
350pub trait FullEncode: Encode + EncodeLike {}
353impl<S: Encode + EncodeLike> FullEncode for S {}
354
355pub trait FullCodec: Decode + FullEncode {}
358impl<S: Decode + FullEncode> FullCodec for S {}
359
360pub trait WrapperTypeEncode: Deref {}
368
369impl<T: ?Sized> WrapperTypeEncode for Box<T> {}
370impl<T: ?Sized + Encode> EncodeLike for Box<T> {}
371impl<T: Encode> EncodeLike<T> for Box<T> {}
372impl<T: Encode> EncodeLike<Box<T>> for T {}
373
374impl<T: ?Sized> WrapperTypeEncode for &T {}
375impl<T: ?Sized + Encode> EncodeLike for &T {}
376impl<T: Encode> EncodeLike<T> for &T {}
377impl<T: Encode> EncodeLike<&T> for T {}
378impl<T: Encode> EncodeLike<T> for &&T {}
379impl<T: Encode> EncodeLike<&&T> for T {}
380
381impl<T: ?Sized> WrapperTypeEncode for &mut T {}
382impl<T: ?Sized + Encode> EncodeLike for &mut T {}
383impl<T: Encode> EncodeLike<T> for &mut T {}
384impl<T: Encode> EncodeLike<&mut T> for T {}
385
386impl<T: ToOwned + ?Sized> WrapperTypeEncode for Cow<'_, T> {}
387impl<T: ToOwned + Encode + ?Sized> EncodeLike for Cow<'_, T> {}
388impl<T: ToOwned + Encode> EncodeLike<T> for Cow<'_, T> {}
389impl<T: ToOwned + Encode> EncodeLike<Cow<'_, T>> for T {}
390
391impl<T: ?Sized> WrapperTypeEncode for Rc<T> {}
392impl<T: ?Sized + Encode> EncodeLike for Rc<T> {}
393impl<T: Encode> EncodeLike<T> for Rc<T> {}
394impl<T: Encode> EncodeLike<Rc<T>> for T {}
395
396impl WrapperTypeEncode for String {}
397impl EncodeLike for String {}
398impl EncodeLike<&str> for String {}
399impl EncodeLike<String> for &str {}
400
401#[cfg(target_has_atomic = "ptr")]
402mod atomic_ptr_targets {
403 use super::*;
404 impl<T: ?Sized> WrapperTypeEncode for Arc<T> {}
405 impl<T: ?Sized + Encode> EncodeLike for Arc<T> {}
406 impl<T: Encode> EncodeLike<T> for Arc<T> {}
407 impl<T: Encode> EncodeLike<Arc<T>> for T {}
408}
409
410#[cfg(feature = "bytes")]
411mod feature_wrapper_bytes {
412 use super::*;
413 use bytes::Bytes;
414
415 impl WrapperTypeEncode for Bytes {}
416 impl EncodeLike for Bytes {}
417 impl EncodeLike<&[u8]> for Bytes {}
418 impl EncodeLike<Vec<u8>> for Bytes {}
419 impl EncodeLike<Bytes> for &[u8] {}
420 impl EncodeLike<Bytes> for Vec<u8> {}
421}
422
423#[cfg(feature = "bytes")]
424struct BytesCursor {
425 bytes: bytes::Bytes,
426 position: usize,
427}
428
429#[cfg(feature = "bytes")]
430impl Input for BytesCursor {
431 fn remaining_len(&mut self) -> Result<Option<usize>, Error> {
432 Ok(Some(self.bytes.len() - self.position))
433 }
434
435 fn read(&mut self, into: &mut [u8]) -> Result<(), Error> {
436 if into.len() > self.bytes.len() - self.position {
437 return Err("Not enough data to fill buffer".into());
438 }
439
440 into.copy_from_slice(&self.bytes[self.position..self.position + into.len()]);
441 self.position += into.len();
442 Ok(())
443 }
444
445 fn scale_internal_decode_bytes(&mut self) -> Result<bytes::Bytes, Error> {
446 let length = <Compact<u32>>::decode(self)?.0 as usize;
447
448 bytes::Buf::advance(&mut self.bytes, self.position);
449 self.position = 0;
450
451 if length > self.bytes.len() {
452 return Err("Not enough data to fill buffer".into());
453 }
454
455 self.on_before_alloc_mem(length)?;
456 Ok(self.bytes.split_to(length))
457 }
458}
459
460#[cfg(feature = "bytes")]
462pub fn decode_from_bytes<T>(bytes: bytes::Bytes) -> Result<T, Error>
463where
464 T: Decode,
465{
466 let mut input = BytesCursor { bytes, position: 0 };
483 T::decode(&mut input)
484}
485
486#[cfg(feature = "bytes")]
487impl Decode for bytes::Bytes {
488 fn decode<I: Input>(input: &mut I) -> Result<Self, Error> {
489 input.scale_internal_decode_bytes()
490 }
491}
492
493#[cfg(feature = "bytes")]
494impl DecodeWithMemTracking for bytes::Bytes {}
495
496impl<T, X> Encode for X
497where
498 T: Encode + ?Sized,
499 X: WrapperTypeEncode<Target = T>,
500{
501 fn size_hint(&self) -> usize {
502 (**self).size_hint()
503 }
504
505 fn using_encoded<R, F: FnOnce(&[u8]) -> R>(&self, f: F) -> R {
506 (**self).using_encoded(f)
507 }
508
509 fn encode(&self) -> Vec<u8> {
510 (**self).encode()
511 }
512
513 fn encode_to<W: Output + ?Sized>(&self, dest: &mut W) {
514 (**self).encode_to(dest)
515 }
516}
517
518pub trait WrapperTypeDecode: Sized {
522 type Wrapped: Into<Self>;
524
525 #[doc(hidden)]
528 #[inline]
529 fn decode_wrapped<I: Input>(input: &mut I) -> Result<Self, Error>
530 where
531 Self::Wrapped: Decode,
532 {
533 input.descend_ref()?;
534 let result = Ok(Self::Wrapped::decode(input)?.into());
535 input.ascend_ref();
536 result
537 }
538}
539
540impl<T> WrapperTypeDecode for Box<T> {
541 type Wrapped = T;
542
543 fn decode_wrapped<I: Input>(input: &mut I) -> Result<Self, Error>
544 where
545 Self::Wrapped: Decode,
546 {
547 input.descend_ref()?;
548
549 let layout = core::alloc::Layout::new::<MaybeUninit<T>>();
556
557 input.on_before_alloc_mem(layout.size())?;
558 let ptr: *mut MaybeUninit<T> = if layout.size() == 0 {
559 core::ptr::NonNull::dangling().as_ptr()
560 } else {
561 let ptr: *mut u8 = unsafe { crate::alloc::alloc::alloc(layout) };
563
564 if ptr.is_null() {
565 crate::alloc::alloc::handle_alloc_error(layout);
566 }
567
568 ptr.cast()
569 };
570
571 let mut boxed: Box<MaybeUninit<T>> = unsafe { Box::from_raw(ptr) };
578
579 T::decode_into(input, &mut boxed)?;
580
581 let ptr: *mut MaybeUninit<T> = Box::into_raw(boxed);
585 let ptr: *mut T = ptr.cast();
586
587 let boxed: Box<T> = unsafe { Box::from_raw(ptr) };
590
591 input.ascend_ref();
592 Ok(boxed)
593 }
594}
595
596impl<T: DecodeWithMemTracking> DecodeWithMemTracking for Box<T> {}
597
598impl<T> WrapperTypeDecode for Rc<T> {
599 type Wrapped = T;
600
601 fn decode_wrapped<I: Input>(input: &mut I) -> Result<Self, Error>
602 where
603 Self::Wrapped: Decode,
604 {
605 Box::<T>::decode(input).map(|output| output.into())
607 }
608}
609
610impl<T: DecodeWithMemTracking> DecodeWithMemTracking for Rc<T> {}
612
613#[cfg(target_has_atomic = "ptr")]
614impl<T> WrapperTypeDecode for Arc<T> {
615 type Wrapped = T;
616
617 fn decode_wrapped<I: Input>(input: &mut I) -> Result<Self, Error>
618 where
619 Self::Wrapped: Decode,
620 {
621 Box::<T>::decode(input).map(|output| output.into())
623 }
624}
625
626impl<T: DecodeWithMemTracking> DecodeWithMemTracking for Arc<T> {}
628
629impl<T, X> Decode for X
630where
631 T: Decode + Into<X>,
632 X: WrapperTypeDecode<Wrapped = T>,
633{
634 #[inline]
635 fn decode<I: Input>(input: &mut I) -> Result<Self, Error> {
636 Self::decode_wrapped(input)
637 }
638}
639
640macro_rules! with_type_info {
647 ( $type_info:expr, $macro:ident $( ( $( $params:ident ),* ) )?, { $( $unknown_variant:tt )* }, ) => {
648 match $type_info {
649 TypeInfo::U8 => { $macro!(u8 $( $( , $params )* )? ) },
650 TypeInfo::I8 => { $macro!(i8 $( $( , $params )* )? ) },
651 TypeInfo::U16 => { $macro!(u16 $( $( , $params )* )? ) },
652 TypeInfo::I16 => { $macro!(i16 $( $( , $params )* )? ) },
653 TypeInfo::U32 => { $macro!(u32 $( $( , $params )* )? ) },
654 TypeInfo::I32 => { $macro!(i32 $( $( , $params )* )? ) },
655 TypeInfo::U64 => { $macro!(u64 $( $( , $params )* )? ) },
656 TypeInfo::I64 => { $macro!(i64 $( $( , $params )* )? ) },
657 TypeInfo::U128 => { $macro!(u128 $( $( , $params )* )? ) },
658 TypeInfo::I128 => { $macro!(i128 $( $( , $params )* )? ) },
659 TypeInfo::Unknown => { $( $unknown_variant )* },
660 TypeInfo::F32 => { $macro!(f32 $( $( , $params )* )? ) },
661 TypeInfo::F64 => { $macro!(f64 $( $( , $params )* )? ) },
662 }
663 };
664}
665
666pub trait EncodeAsRef<'a, T: 'a> {
668 type RefType: Encode + From<&'a T>;
670}
671
672impl<T: Encode, E: Encode> Encode for Result<T, E> {
673 fn size_hint(&self) -> usize {
674 1 + match *self {
675 Ok(ref t) => t.size_hint(),
676 Err(ref t) => t.size_hint(),
677 }
678 }
679
680 fn encode_to<W: Output + ?Sized>(&self, dest: &mut W) {
681 match *self {
682 Ok(ref t) => {
683 dest.push_byte(0);
684 t.encode_to(dest);
685 },
686 Err(ref e) => {
687 dest.push_byte(1);
688 e.encode_to(dest);
689 },
690 }
691 }
692}
693
694impl<T, LikeT, E, LikeE> EncodeLike<Result<LikeT, LikeE>> for Result<T, E>
695where
696 T: EncodeLike<LikeT>,
697 LikeT: Encode,
698 E: EncodeLike<LikeE>,
699 LikeE: Encode,
700{
701}
702
703impl<T: Decode, E: Decode> Decode for Result<T, E> {
704 fn decode<I: Input>(input: &mut I) -> Result<Self, Error> {
705 match input
706 .read_byte()
707 .map_err(|e| e.chain("Could not result variant byte for `Result`"))?
708 {
709 0 => Ok(Ok(T::decode(input).map_err(|e| e.chain("Could not Decode `Result::Ok(T)`"))?)),
710 1 => Ok(Err(
711 E::decode(input).map_err(|e| e.chain("Could not decode `Result::Error(E)`"))?
712 )),
713 _ => Err("unexpected first byte decoding Result".into()),
714 }
715 }
716}
717
718impl<T: DecodeWithMemTracking, E: DecodeWithMemTracking> DecodeWithMemTracking for Result<T, E> {}
719
720#[derive(Eq, PartialEq, Clone, Copy)]
722pub struct OptionBool(pub Option<bool>);
723
724impl fmt::Debug for OptionBool {
725 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
726 self.0.fmt(f)
727 }
728}
729
730impl Encode for OptionBool {
731 fn size_hint(&self) -> usize {
732 1
733 }
734
735 fn using_encoded<R, F: FnOnce(&[u8]) -> R>(&self, f: F) -> R {
736 f(&[match *self {
737 OptionBool(None) => 0u8,
738 OptionBool(Some(true)) => 1u8,
739 OptionBool(Some(false)) => 2u8,
740 }])
741 }
742}
743
744impl EncodeLike for OptionBool {}
745
746impl Decode for OptionBool {
747 fn decode<I: Input>(input: &mut I) -> Result<Self, Error> {
748 match input.read_byte()? {
749 0 => Ok(OptionBool(None)),
750 1 => Ok(OptionBool(Some(true))),
751 2 => Ok(OptionBool(Some(false))),
752 _ => Err("unexpected first byte decoding OptionBool".into()),
753 }
754 }
755}
756
757impl DecodeWithMemTracking for OptionBool {}
758
759impl<T: EncodeLike<U>, U: Encode> EncodeLike<Option<U>> for Option<T> {}
760
761impl<T: Encode> Encode for Option<T> {
762 fn size_hint(&self) -> usize {
763 1 + match *self {
764 Some(ref t) => t.size_hint(),
765 None => 0,
766 }
767 }
768
769 fn encode_to<W: Output + ?Sized>(&self, dest: &mut W) {
770 match *self {
771 Some(ref t) => {
772 dest.push_byte(1);
773 t.encode_to(dest);
774 },
775 None => dest.push_byte(0),
776 }
777 }
778}
779
780impl<T: Decode> Decode for Option<T> {
781 fn decode<I: Input>(input: &mut I) -> Result<Self, Error> {
782 match input
783 .read_byte()
784 .map_err(|e| e.chain("Could not decode variant byte for `Option`"))?
785 {
786 0 => Ok(None),
787 1 => Ok(Some(
788 T::decode(input).map_err(|e| e.chain("Could not decode `Option::Some(T)`"))?,
789 )),
790 _ => Err("unexpected first byte decoding Option".into()),
791 }
792 }
793}
794
795impl<T: DecodeWithMemTracking> DecodeWithMemTracking for Option<T> {}
796
797macro_rules! impl_for_non_zero {
798 ( $( $name:ty ),* $(,)? ) => {
799 $(
800 impl Encode for $name {
801 fn size_hint(&self) -> usize {
802 self.get().size_hint()
803 }
804
805 fn encode_to<W: Output + ?Sized>(&self, dest: &mut W) {
806 self.get().encode_to(dest)
807 }
808
809 fn encode(&self) -> Vec<u8> {
810 self.get().encode()
811 }
812
813 fn using_encoded<R, F: FnOnce(&[u8]) -> R>(&self, f: F) -> R {
814 self.get().using_encoded(f)
815 }
816 }
817
818 impl EncodeLike for $name {}
819
820 impl Decode for $name {
821 fn decode<I: Input>(input: &mut I) -> Result<Self, Error> {
822 Self::new(Decode::decode(input)?)
823 .ok_or_else(|| Error::from("cannot create non-zero number from 0"))
824 }
825 }
826
827 impl DecodeWithMemTracking for $name {}
828 )*
829 }
830}
831
832pub(crate) fn encode_slice_no_len<T: Encode, W: Output + ?Sized>(slice: &[T], dest: &mut W) {
836 macro_rules! encode_to {
837 ( u8, $slice:ident, $dest:ident ) => {{
838 let typed = unsafe { mem::transmute::<&[T], &[u8]>(&$slice[..]) };
839 $dest.write(&typed)
840 }};
841 ( i8, $slice:ident, $dest:ident ) => {{
842 let typed = unsafe { mem::transmute::<&[T], &[u8]>(&$slice[..]) };
845 $dest.write(&typed)
846 }};
847 ( $ty:ty, $slice:ident, $dest:ident ) => {{
848 if cfg!(target_endian = "little") {
849 let typed = unsafe { mem::transmute::<&[T], &[$ty]>(&$slice[..]) };
850 $dest.write(<[$ty] as AsByteSlice<$ty>>::as_byte_slice(typed))
851 } else {
852 for item in $slice.iter() {
853 item.encode_to(dest);
854 }
855 }
856 }};
857 }
858
859 with_type_info! {
860 <T as Encode>::TYPE_INFO,
861 encode_to(slice, dest),
862 {
863 for item in slice.iter() {
864 item.encode_to(dest);
865 }
866 },
867 }
868}
869
870impl_for_non_zero! {
871 NonZeroI8,
872 NonZeroI16,
873 NonZeroI32,
874 NonZeroI64,
875 NonZeroI128,
876 NonZeroU8,
877 NonZeroU16,
878 NonZeroU32,
879 NonZeroU64,
880 NonZeroU128,
881}
882
883impl<T: Encode, const N: usize> Encode for [T; N] {
884 fn size_hint(&self) -> usize {
885 mem::size_of::<T>() * N
886 }
887
888 fn encode_to<W: Output + ?Sized>(&self, dest: &mut W) {
889 encode_slice_no_len(&self[..], dest)
890 }
891}
892
893const fn calculate_array_bytesize<T, const N: usize>() -> usize {
894 struct AssertNotOverflow<T, const N: usize>(PhantomData<T>);
895
896 impl<T, const N: usize> AssertNotOverflow<T, N> {
897 const OK: () = assert!(mem::size_of::<T>().checked_mul(N).is_some(), "array size overflow");
898 }
899
900 #[allow(clippy::let_unit_value)]
901 let () = AssertNotOverflow::<T, N>::OK;
902 mem::size_of::<T>() * N
903}
904
905impl<T: Decode, const N: usize> Decode for [T; N] {
906 #[inline(always)]
907 fn decode<I: Input>(input: &mut I) -> Result<Self, Error> {
908 let mut array = MaybeUninit::uninit();
909 Self::decode_into(input, &mut array)?;
910
911 unsafe { Ok(array.assume_init()) }
913 }
914
915 fn decode_into<I: Input>(
916 input: &mut I,
917 dst: &mut MaybeUninit<Self>,
918 ) -> Result<DecodeFinished, Error> {
919 let is_primitive = match <T as Decode>::TYPE_INFO {
920 | TypeInfo::U8 | TypeInfo::I8 => true,
921 | TypeInfo::U16 |
922 TypeInfo::I16 |
923 TypeInfo::U32 |
924 TypeInfo::I32 |
925 TypeInfo::U64 |
926 TypeInfo::I64 |
927 TypeInfo::U128 |
928 TypeInfo::I128 |
929 TypeInfo::F32 |
930 TypeInfo::F64 => cfg!(target_endian = "little"),
931 TypeInfo::Unknown => false,
932 };
933
934 if is_primitive {
935 let ptr: *mut [T; N] = dst.as_mut_ptr();
939 let ptr: *mut u8 = ptr.cast();
940
941 let bytesize = calculate_array_bytesize::<T, N>();
942
943 unsafe {
948 ptr.write_bytes(0, bytesize);
949 }
950
951 let slice: &mut [u8] = unsafe { core::slice::from_raw_parts_mut(ptr, bytesize) };
953
954 input.read(slice)?;
955
956 unsafe {
958 return Ok(DecodeFinished::assert_decoding_finished());
959 }
960 }
961
962 let slice: &mut [MaybeUninit<T>; N] = {
963 let ptr: *mut [T; N] = dst.as_mut_ptr();
964 let ptr: *mut [MaybeUninit<T>; N] = ptr.cast();
965 unsafe { &mut *ptr }
967 };
968
969 struct State<'a, T, const N: usize> {
972 count: usize,
973 slice: &'a mut [MaybeUninit<T>; N],
974 }
975
976 impl<T, const N: usize> Drop for State<'_, T, N> {
977 fn drop(&mut self) {
978 if !mem::needs_drop::<T>() {
979 return;
985 }
986
987 for item in &mut self.slice[..self.count] {
990 unsafe {
994 item.assume_init_drop();
995 }
996 }
997 }
998 }
999
1000 let mut state = State { count: 0, slice };
1001
1002 while state.count < state.slice.len() {
1003 T::decode_into(input, &mut state.slice[state.count])?;
1004 state.count += 1;
1005 }
1006
1007 mem::forget(state);
1009
1010 unsafe { Ok(DecodeFinished::assert_decoding_finished()) }
1012 }
1013
1014 fn skip<I: Input>(input: &mut I) -> Result<(), Error> {
1015 if Self::encoded_fixed_size().is_some() {
1016 for _ in 0..N {
1018 T::skip(input)?;
1019 }
1020 } else {
1021 Self::decode(input)?;
1022 }
1023 Ok(())
1024 }
1025
1026 fn encoded_fixed_size() -> Option<usize> {
1027 Some(<T as Decode>::encoded_fixed_size()? * N)
1028 }
1029}
1030
1031impl<T: DecodeWithMemTracking, const N: usize> DecodeWithMemTracking for [T; N] {}
1032
1033impl<T: EncodeLike<U>, U: Encode, const N: usize> EncodeLike<[U; N]> for [T; N] {}
1034
1035impl Encode for str {
1036 fn size_hint(&self) -> usize {
1037 self.as_bytes().size_hint()
1038 }
1039
1040 fn encode_to<W: Output + ?Sized>(&self, dest: &mut W) {
1041 self.as_bytes().encode_to(dest)
1042 }
1043
1044 fn encode(&self) -> Vec<u8> {
1045 self.as_bytes().encode()
1046 }
1047
1048 fn using_encoded<R, F: FnOnce(&[u8]) -> R>(&self, f: F) -> R {
1049 self.as_bytes().using_encoded(f)
1050 }
1051}
1052
1053impl<T: ToOwned + ?Sized> Decode for Cow<'_, T>
1054where
1055 <T as ToOwned>::Owned: Decode,
1056{
1057 fn decode<I: Input>(input: &mut I) -> Result<Self, Error> {
1058 Ok(Cow::Owned(Decode::decode(input)?))
1059 }
1060}
1061
1062impl<'a, T: ToOwned + DecodeWithMemTracking> DecodeWithMemTracking for Cow<'a, T> where
1063 Cow<'a, T>: Decode
1064{
1065}
1066
1067impl<T> EncodeLike for PhantomData<T> {}
1068
1069impl<T> Encode for PhantomData<T> {
1070 fn encode_to<W: Output + ?Sized>(&self, _dest: &mut W) {}
1071}
1072
1073impl<T> Decode for PhantomData<T> {
1074 fn decode<I: Input>(_input: &mut I) -> Result<Self, Error> {
1075 Ok(PhantomData)
1076 }
1077}
1078
1079impl<T> DecodeWithMemTracking for PhantomData<T> where PhantomData<T>: Decode {}
1080
1081impl Decode for String {
1082 fn decode<I: Input>(input: &mut I) -> Result<Self, Error> {
1083 Self::from_utf8(Vec::decode(input)?).map_err(|_| "Invalid utf8 sequence".into())
1084 }
1085}
1086
1087impl DecodeWithMemTracking for String {}
1088
1089pub(crate) fn compact_encode_len_to<W: Output + ?Sized>(
1091 dest: &mut W,
1092 len: usize,
1093) -> Result<(), Error> {
1094 if len > u32::MAX as usize {
1095 return Err("Attempted to serialize a collection with too many elements.".into());
1096 }
1097
1098 Compact(len as u32).encode_to(dest);
1099 Ok(())
1100}
1101
1102impl<T: Encode> Encode for [T] {
1103 fn size_hint(&self) -> usize {
1104 mem::size_of::<u32>() + mem::size_of_val(self)
1105 }
1106
1107 fn encode_to<W: Output + ?Sized>(&self, dest: &mut W) {
1108 compact_encode_len_to(dest, self.len()).expect("Compact encodes length");
1109
1110 encode_slice_no_len(self, dest)
1111 }
1112}
1113
1114fn decode_vec_chunked<T, I: Input, F>(
1115 input: &mut I,
1116 len: usize,
1117 mut decode_chunk: F,
1118) -> Result<Vec<T>, Error>
1119where
1120 F: FnMut(&mut I, &mut Vec<T>, usize) -> Result<(), Error>,
1121{
1122 let chunk_len = MAX_PREALLOCATION.checked_div(mem::size_of::<T>()).unwrap_or(usize::MAX);
1126
1127 let mut decoded_vec = vec![];
1128 let mut num_undecoded_items = len;
1129 while num_undecoded_items > 0 {
1130 let chunk_len = chunk_len.min(num_undecoded_items);
1131 input.on_before_alloc_mem(chunk_len.saturating_mul(mem::size_of::<T>()))?;
1132 decoded_vec.reserve_exact(chunk_len);
1133
1134 decode_chunk(input, &mut decoded_vec, chunk_len)?;
1135
1136 num_undecoded_items -= chunk_len;
1137 }
1138
1139 Ok(decoded_vec)
1140}
1141
1142fn read_vec_from_u8s<T, I>(input: &mut I, len: usize) -> Result<Vec<T>, Error>
1147where
1148 T: ToMutByteSlice + Default + Clone,
1149 I: Input,
1150{
1151 let byte_len = len
1152 .checked_mul(mem::size_of::<T>())
1153 .ok_or("Item is too big and cannot be allocated")?;
1154
1155 if let Some(input_len) = input.remaining_len()? {
1157 if input_len < byte_len {
1158 return Err("Not enough data to decode vector".into());
1159 }
1160 }
1161
1162 decode_vec_chunked(input, len, |input, decoded_vec, chunk_len| {
1163 let decoded_vec_len = decoded_vec.len();
1164 let decoded_vec_size = decoded_vec_len * mem::size_of::<T>();
1165 unsafe {
1166 decoded_vec.set_len(decoded_vec_len + chunk_len);
1167 }
1168
1169 let bytes_slice = decoded_vec.as_mut_byte_slice();
1170 input.read(&mut bytes_slice[decoded_vec_size..])
1171 })
1172}
1173
1174fn decode_vec_from_items<T, I>(input: &mut I, len: usize) -> Result<Vec<T>, Error>
1175where
1176 T: Decode,
1177 I: Input,
1178{
1179 input.descend_ref()?;
1180 let vec = decode_vec_chunked(input, len, |input, decoded_vec, chunk_len| {
1181 for _ in 0..chunk_len {
1182 decoded_vec.push(T::decode(input)?);
1183 }
1184
1185 Ok(())
1186 })?;
1187 input.ascend_ref();
1188
1189 Ok(vec)
1190}
1191
1192pub fn decode_vec_with_len<T: Decode, I: Input>(
1197 input: &mut I,
1198 len: usize,
1199) -> Result<Vec<T>, Error> {
1200 macro_rules! decode {
1201 ( $ty:ty, $input:ident, $len:ident ) => {{
1202 if cfg!(target_endian = "little") || mem::size_of::<T>() == 1 {
1203 let vec = read_vec_from_u8s::<$ty, _>($input, $len)?;
1204 Ok(unsafe { mem::transmute::<Vec<$ty>, Vec<T>>(vec) })
1205 } else {
1206 decode_vec_from_items::<T, _>($input, $len)
1207 }
1208 }};
1209 }
1210
1211 with_type_info! {
1212 <T as Decode>::TYPE_INFO,
1213 decode(input, len),
1214 {
1215 decode_vec_from_items::<T, _>(input, len)
1216 },
1217 }
1218}
1219
1220impl<T> WrapperTypeEncode for Vec<T> {}
1221impl<T: EncodeLike<U>, U: Encode> EncodeLike<Vec<U>> for Vec<T> {}
1222impl<T: EncodeLike<U>, U: Encode> EncodeLike<&[U]> for Vec<T> {}
1223impl<T: EncodeLike<U>, U: Encode> EncodeLike<Vec<U>> for &[T] {}
1224
1225impl<T: Decode> Decode for Vec<T> {
1226 fn decode<I: Input>(input: &mut I) -> Result<Self, Error> {
1227 <Compact<u32>>::decode(input)
1228 .and_then(move |Compact(len)| decode_vec_with_len(input, len as usize))
1229 }
1230}
1231
1232impl<T: DecodeWithMemTracking> DecodeWithMemTracking for Vec<T> {}
1233
1234macro_rules! impl_encode_for_collection {
1235 ($(
1236 $type:ident
1237 { $( $generics:ident $( : $decode_additional:ident )? ),* }
1238 { $( $type_like_generics:ident ),* }
1239 { $( $impl_like_generics:tt )* }
1240 )*) => {$(
1241 impl<$( $generics: Encode ),*> Encode for $type<$( $generics, )*> {
1242 fn size_hint(&self) -> usize {
1243 mem::size_of::<u32>() + mem::size_of::<($($generics,)*)>().saturating_mul(self.len())
1244 }
1245
1246 fn encode_to<W: Output + ?Sized>(&self, dest: &mut W) {
1247 compact_encode_len_to(dest, self.len()).expect("Compact encodes length");
1248
1249 for i in self.iter() {
1250 i.encode_to(dest);
1251 }
1252 }
1253 }
1254
1255 impl<$( $impl_like_generics )*> EncodeLike<$type<$( $type_like_generics ),*>>
1256 for $type<$( $generics ),*> {}
1257 impl<$( $impl_like_generics )*> EncodeLike<&[( $( $type_like_generics, )* )]>
1258 for $type<$( $generics ),*> {}
1259 impl<$( $impl_like_generics )*> EncodeLike<$type<$( $type_like_generics ),*>>
1260 for &[( $( $generics, )* )] {}
1261 )*}
1262}
1263
1264impl_encode_for_collection! {
1265 BTreeMap { K: Ord, V } { LikeK, LikeV}
1266 { K: EncodeLike<LikeK>, LikeK: Encode, V: EncodeLike<LikeV>, LikeV: Encode }
1267}
1268
1269impl<K: Decode + Ord, V: Decode> Decode for BTreeMap<K, V> {
1270 fn decode<I: Input>(input: &mut I) -> Result<Self, Error> {
1271 <Compact<u32>>::decode(input).and_then(move |Compact(len)| {
1272 input.descend_ref()?;
1273 input.on_before_alloc_mem(super::btree_utils::mem_size_of_btree::<(K, V)>(len))?;
1274 let result = Result::from_iter((0..len).map(|_| Decode::decode(input)));
1275 input.ascend_ref();
1276 result
1277 })
1278 }
1279}
1280
1281impl<K: DecodeWithMemTracking, V: DecodeWithMemTracking> DecodeWithMemTracking for BTreeMap<K, V> where
1282 BTreeMap<K, V>: Decode
1283{
1284}
1285
1286impl_encode_for_collection! {
1287 BTreeSet { T: Ord } { LikeT }
1288 { T: EncodeLike<LikeT>, LikeT: Encode }
1289}
1290
1291impl<T: Decode + Ord> Decode for BTreeSet<T> {
1292 fn decode<I: Input>(input: &mut I) -> Result<Self, Error> {
1293 <Compact<u32>>::decode(input).and_then(move |Compact(len)| {
1294 input.descend_ref()?;
1295 input.on_before_alloc_mem(super::btree_utils::mem_size_of_btree::<T>(len))?;
1296 let result = Result::from_iter((0..len).map(|_| Decode::decode(input)));
1297 input.ascend_ref();
1298 result
1299 })
1300 }
1301}
1302impl<T: DecodeWithMemTracking> DecodeWithMemTracking for BTreeSet<T> where BTreeSet<T>: Decode {}
1303
1304impl_encode_for_collection! {
1305 LinkedList { T } { LikeT }
1306 { T: EncodeLike<LikeT>, LikeT: Encode }
1307}
1308
1309impl<T: Decode> Decode for LinkedList<T> {
1310 fn decode<I: Input>(input: &mut I) -> Result<Self, Error> {
1311 <Compact<u32>>::decode(input).and_then(move |Compact(len)| {
1312 input.descend_ref()?;
1313 input.on_before_alloc_mem((len as usize).saturating_mul(mem::size_of::<(
1316 usize,
1317 usize,
1318 T,
1319 )>()))?;
1320 let result = Result::from_iter((0..len).map(|_| Decode::decode(input)));
1321 input.ascend_ref();
1322 result
1323 })
1324 }
1325}
1326
1327impl<T: DecodeWithMemTracking> DecodeWithMemTracking for LinkedList<T> where LinkedList<T>: Decode {}
1328
1329impl_encode_for_collection! {
1330 BinaryHeap { T: Ord } { LikeT }
1331 { T: EncodeLike<LikeT>, LikeT: Encode }
1332}
1333
1334impl<T: Decode + Ord> Decode for BinaryHeap<T> {
1335 fn decode<I: Input>(input: &mut I) -> Result<Self, Error> {
1336 Ok(Vec::decode(input)?.into())
1337 }
1338}
1339impl<T: DecodeWithMemTracking> DecodeWithMemTracking for BinaryHeap<T> where BinaryHeap<T>: Decode {}
1340
1341impl<T: Encode> EncodeLike for VecDeque<T> {}
1342impl<T: EncodeLike<U>, U: Encode> EncodeLike<&[U]> for VecDeque<T> {}
1343impl<T: EncodeLike<U>, U: Encode> EncodeLike<VecDeque<U>> for &[T] {}
1344impl<T: EncodeLike<U>, U: Encode> EncodeLike<Vec<U>> for VecDeque<T> {}
1345impl<T: EncodeLike<U>, U: Encode> EncodeLike<VecDeque<U>> for Vec<T> {}
1346
1347impl<T: Encode> Encode for VecDeque<T> {
1348 fn size_hint(&self) -> usize {
1349 mem::size_of::<u32>() + mem::size_of::<T>() * self.len()
1350 }
1351
1352 fn encode_to<W: Output + ?Sized>(&self, dest: &mut W) {
1353 compact_encode_len_to(dest, self.len()).expect("Compact encodes length");
1354
1355 let slices = self.as_slices();
1356 encode_slice_no_len(slices.0, dest);
1357 encode_slice_no_len(slices.1, dest);
1358 }
1359}
1360
1361impl<T: Decode> Decode for VecDeque<T> {
1362 fn decode<I: Input>(input: &mut I) -> Result<Self, Error> {
1363 Ok(<Vec<T>>::decode(input)?.into())
1364 }
1365}
1366
1367impl<T: DecodeWithMemTracking> DecodeWithMemTracking for VecDeque<T> {}
1368
1369impl EncodeLike for () {}
1370
1371impl Encode for () {
1372 fn encode_to<W: Output + ?Sized>(&self, _dest: &mut W) {}
1373
1374 fn using_encoded<R, F: FnOnce(&[u8]) -> R>(&self, f: F) -> R {
1375 f(&[])
1376 }
1377
1378 fn encode(&self) -> Vec<u8> {
1379 Vec::new()
1380 }
1381}
1382
1383impl Decode for () {
1384 fn decode<I: Input>(_: &mut I) -> Result<(), Error> {
1385 Ok(())
1386 }
1387}
1388
1389macro_rules! impl_len {
1390 ( $( $type:ident< $($g:ident),* > ),* ) => { $(
1391 impl<$($g),*> DecodeLength for $type<$($g),*> {
1392 fn len(mut self_encoded: &[u8]) -> Result<usize, Error> {
1393 usize::try_from(u32::from(Compact::<u32>::decode(&mut self_encoded)?))
1394 .map_err(|_| "Failed convert decoded size into usize.".into())
1395 }
1396 }
1397 )*}
1398}
1399
1400impl_len!(Vec<T>, BTreeSet<T>, BTreeMap<K, V>, VecDeque<T>, BinaryHeap<T>, LinkedList<T>);
1402
1403macro_rules! tuple_impl {
1404 (
1405 ($one:ident, $extra:ident),
1406 ) => {
1407 impl<$one: Encode> Encode for ($one,) {
1408 fn size_hint(&self) -> usize {
1409 self.0.size_hint()
1410 }
1411
1412 fn encode_to<T: Output + ?Sized>(&self, dest: &mut T) {
1413 self.0.encode_to(dest);
1414 }
1415
1416 fn encode(&self) -> Vec<u8> {
1417 self.0.encode()
1418 }
1419
1420 fn using_encoded<R, F: FnOnce(&[u8]) -> R>(&self, f: F) -> R {
1421 self.0.using_encoded(f)
1422 }
1423 }
1424
1425 impl<$one: Decode> Decode for ($one,) {
1426 fn decode<I: Input>(input: &mut I) -> Result<Self, Error> {
1427 match $one::decode(input) {
1428 Err(e) => Err(e),
1429 Ok($one) => Ok(($one,)),
1430 }
1431 }
1432 }
1433
1434 impl<$one: DecodeLength> DecodeLength for ($one,) {
1435 fn len(self_encoded: &[u8]) -> Result<usize, Error> {
1436 $one::len(self_encoded)
1437 }
1438 }
1439
1440 impl<$one: EncodeLike<$extra>, $extra: Encode> crate::EncodeLike<($extra,)> for ($one,) {}
1441 };
1442 (($first:ident, $fextra:ident), $( ( $rest:ident, $rextra:ident ), )+) => {
1443 impl<$first: Encode, $($rest: Encode),+> Encode for ($first, $($rest),+) {
1444 fn size_hint(&self) -> usize {
1445 let (
1446 ref $first,
1447 $(ref $rest),+
1448 ) = *self;
1449 $first.size_hint()
1450 $( + $rest.size_hint() )+
1451 }
1452
1453 fn encode_to<T: Output + ?Sized>(&self, dest: &mut T) {
1454 let (
1455 ref $first,
1456 $(ref $rest),+
1457 ) = *self;
1458
1459 $first.encode_to(dest);
1460 $($rest.encode_to(dest);)+
1461 }
1462 }
1463
1464 impl<$first: Decode, $($rest: Decode),+> Decode for ($first, $($rest),+) {
1465 fn decode<INPUT: Input>(input: &mut INPUT) -> Result<Self, super::Error> {
1466 Ok((
1467 match $first::decode(input) {
1468 Ok(x) => x,
1469 Err(e) => return Err(e),
1470 },
1471 $(match $rest::decode(input) {
1472 Ok(x) => x,
1473 Err(e) => return Err(e),
1474 },)+
1475 ))
1476 }
1477 }
1478
1479 impl<$first: EncodeLike<$fextra>, $fextra: Encode,
1480 $($rest: EncodeLike<$rextra>, $rextra: Encode),+> crate::EncodeLike<($fextra, $( $rextra ),+)>
1481 for ($first, $($rest),+) {}
1482
1483 impl<$first: DecodeLength, $($rest),+> DecodeLength for ($first, $($rest),+) {
1484 fn len(self_encoded: &[u8]) -> Result<usize, Error> {
1485 $first::len(self_encoded)
1486 }
1487 }
1488
1489 tuple_impl!( $( ($rest, $rextra), )+ );
1490 }
1491}
1492
1493#[allow(non_snake_case)]
1494mod inner_tuple_impl {
1495 use super::*;
1496
1497 tuple_impl!(
1498 (A0, A1),
1499 (B0, B1),
1500 (C0, C1),
1501 (D0, D1),
1502 (E0, E1),
1503 (F0, F1),
1504 (G0, G1),
1505 (H0, H1),
1506 (I0, I1),
1507 (J0, J1),
1508 (K0, K1),
1509 (L0, L1),
1510 (M0, M1),
1511 (N0, N1),
1512 (O0, O1),
1513 (P0, P1),
1514 (Q0, Q1),
1515 (R0, R1),
1516 );
1517}
1518
1519macro_rules! impl_endians {
1520 ( $( $t:ty; $ty_info:ident ),* ) => { $(
1521 impl EncodeLike for $t {}
1522
1523 impl Encode for $t {
1524 const TYPE_INFO: TypeInfo = TypeInfo::$ty_info;
1525
1526 fn size_hint(&self) -> usize {
1527 mem::size_of::<$t>()
1528 }
1529
1530 fn using_encoded<R, F: FnOnce(&[u8]) -> R>(&self, f: F) -> R {
1531 let buf = self.to_le_bytes();
1532 f(&buf[..])
1533 }
1534 }
1535
1536 impl Decode for $t {
1537 const TYPE_INFO: TypeInfo = TypeInfo::$ty_info;
1538
1539 fn decode<I: Input>(input: &mut I) -> Result<Self, Error> {
1540 let mut buf = [0u8; mem::size_of::<$t>()];
1541 input.read(&mut buf)?;
1542 Ok(<$t>::from_le_bytes(buf))
1543 }
1544
1545 fn encoded_fixed_size() -> Option<usize> {
1546 Some(mem::size_of::<$t>())
1547 }
1548 }
1549
1550 impl DecodeWithMemTracking for $t {}
1551 )* }
1552}
1553macro_rules! impl_one_byte {
1554 ( $( $t:ty; $ty_info:ident ),* ) => { $(
1555 impl EncodeLike for $t {}
1556
1557 impl Encode for $t {
1558 const TYPE_INFO: TypeInfo = TypeInfo::$ty_info;
1559
1560 fn size_hint(&self) -> usize {
1561 mem::size_of::<$t>()
1562 }
1563
1564 fn using_encoded<R, F: FnOnce(&[u8]) -> R>(&self, f: F) -> R {
1565 f(&[*self as u8][..])
1566 }
1567 }
1568
1569 impl Decode for $t {
1570 const TYPE_INFO: TypeInfo = TypeInfo::$ty_info;
1571
1572 fn decode<I: Input>(input: &mut I) -> Result<Self, Error> {
1573 Ok(input.read_byte()? as $t)
1574 }
1575 }
1576
1577 impl DecodeWithMemTracking for $t {}
1578 )* }
1579}
1580
1581impl_endians!(u16; U16, u32; U32, u64; U64, u128; U128, i16; I16, i32; I32, i64; I64, i128; I128);
1582impl_one_byte!(u8; U8, i8; I8);
1583
1584impl_endians!(f32; F32, f64; F64);
1585
1586impl EncodeLike for bool {}
1587
1588impl Encode for bool {
1589 fn size_hint(&self) -> usize {
1590 mem::size_of::<bool>()
1591 }
1592
1593 fn using_encoded<R, F: FnOnce(&[u8]) -> R>(&self, f: F) -> R {
1594 f(&[*self as u8][..])
1595 }
1596}
1597
1598impl Decode for bool {
1599 fn decode<I: Input>(input: &mut I) -> Result<Self, Error> {
1600 let byte = input.read_byte()?;
1601 match byte {
1602 0 => Ok(false),
1603 1 => Ok(true),
1604 _ => Err("Invalid boolean representation".into()),
1605 }
1606 }
1607
1608 fn encoded_fixed_size() -> Option<usize> {
1609 Some(1)
1610 }
1611}
1612
1613impl DecodeWithMemTracking for bool {}
1614
1615impl Encode for Duration {
1616 fn size_hint(&self) -> usize {
1617 mem::size_of::<u64>() + mem::size_of::<u32>()
1618 }
1619
1620 fn encode(&self) -> Vec<u8> {
1621 let secs = self.as_secs();
1622 let nanos = self.subsec_nanos();
1623 (secs, nanos).encode()
1624 }
1625}
1626
1627impl Decode for Duration {
1628 fn decode<I: Input>(input: &mut I) -> Result<Self, Error> {
1629 let (secs, nanos) = <(u64, u32)>::decode(input)
1630 .map_err(|e| e.chain("Could not decode `Duration(u64, u32)`"))?;
1631 if nanos >= A_BILLION {
1632 Err("Could not decode `Duration`: Number of nanoseconds should not be higher than 10^9.".into())
1633 } else {
1634 Ok(Duration::new(secs, nanos))
1635 }
1636 }
1637}
1638
1639impl DecodeWithMemTracking for Duration {}
1640
1641impl EncodeLike for Duration {}
1642
1643impl<T> Encode for Range<T>
1644where
1645 T: Encode,
1646{
1647 fn size_hint(&self) -> usize {
1648 2 * mem::size_of::<T>()
1649 }
1650
1651 fn encode(&self) -> Vec<u8> {
1652 (&self.start, &self.end).encode()
1653 }
1654}
1655
1656impl<T> Decode for Range<T>
1657where
1658 T: Decode,
1659{
1660 fn decode<I: Input>(input: &mut I) -> Result<Self, Error> {
1661 let (start, end) =
1662 <(T, T)>::decode(input).map_err(|e| e.chain("Could not decode `Range<T>`"))?;
1663 Ok(Range { start, end })
1664 }
1665}
1666
1667impl<T: DecodeWithMemTracking> DecodeWithMemTracking for Range<T> {}
1668
1669impl<T> Encode for RangeInclusive<T>
1670where
1671 T: Encode,
1672{
1673 fn size_hint(&self) -> usize {
1674 2 * mem::size_of::<T>()
1675 }
1676
1677 fn encode(&self) -> Vec<u8> {
1678 (self.start(), self.end()).encode()
1679 }
1680}
1681
1682impl<T> Decode for RangeInclusive<T>
1683where
1684 T: Decode,
1685{
1686 fn decode<I: Input>(input: &mut I) -> Result<Self, Error> {
1687 let (start, end) =
1688 <(T, T)>::decode(input).map_err(|e| e.chain("Could not decode `RangeInclusive<T>`"))?;
1689 Ok(RangeInclusive::new(start, end))
1690 }
1691}
1692
1693impl<T: DecodeWithMemTracking> DecodeWithMemTracking for RangeInclusive<T> {}
1694
1695#[cfg(test)]
1696mod tests {
1697 use super::*;
1698 use std::borrow::Cow;
1699
1700 #[test]
1701 fn vec_is_sliceable() {
1702 let v = b"Hello world".to_vec();
1703 v.using_encoded(|ref slice| assert_eq!(slice, &b"\x0bHello world"));
1704 }
1705
1706 #[test]
1707 fn encode_borrowed_tuple() {
1708 let x = vec![1u8, 2, 3, 4];
1709 let y = 128i64;
1710
1711 let encoded = (&x, &y).encode();
1712
1713 assert_eq!((x, y), Decode::decode(&mut &encoded[..]).unwrap());
1714 }
1715
1716 #[test]
1717 fn cow_works() {
1718 let x = &[1u32, 2, 3, 4, 5, 6][..];
1719 let y = Cow::Borrowed(&x);
1720 assert_eq!(x.encode(), y.encode());
1721
1722 let z: Cow<'_, [u32]> = Cow::decode(&mut &x.encode()[..]).unwrap();
1723 assert_eq!(*z, *x);
1724 }
1725
1726 #[test]
1727 fn cow_string_works() {
1728 let x = "Hello world!";
1729 let y = Cow::Borrowed(&x);
1730 assert_eq!(x.encode(), y.encode());
1731
1732 let z: Cow<'_, str> = Cow::decode(&mut &x.encode()[..]).unwrap();
1733 assert_eq!(*z, *x);
1734 }
1735
1736 fn hexify(bytes: &[u8]) -> String {
1737 bytes
1738 .iter()
1739 .map(|ref b| format!("{:02x}", b))
1740 .collect::<Vec<String>>()
1741 .join(" ")
1742 }
1743
1744 #[test]
1745 fn string_encoded_as_expected() {
1746 let value = String::from("Hello, World!");
1747 let encoded = value.encode();
1748 assert_eq!(hexify(&encoded), "0d 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21");
1749 assert_eq!(<String>::decode(&mut &encoded[..]).unwrap(), value);
1750 }
1751
1752 #[test]
1753 fn vec_of_u8_encoded_as_expected() {
1754 let value = vec![0u8, 1, 1, 2, 3, 5, 8, 13, 21, 34];
1755 let encoded = value.encode();
1756 assert_eq!(hexify(&encoded), "0a 00 01 01 02 03 05 08 0d 15 22");
1757 assert_eq!(<Vec<u8>>::decode(&mut &encoded[..]).unwrap(), value);
1758 }
1759
1760 #[test]
1761 fn vec_of_i16_encoded_as_expected() {
1762 let value = vec![0i16, 1, -1, 2, -2, 3, -3];
1763 let encoded = value.encode();
1764 assert_eq!(hexify(&encoded), "07 00 00 01 00 ff ff 02 00 fe ff 03 00 fd ff");
1765 assert_eq!(<Vec<i16>>::decode(&mut &encoded[..]).unwrap(), value);
1766 }
1767
1768 #[test]
1769 fn vec_of_option_int_encoded_as_expected() {
1770 let value = vec![Some(1i8), Some(-1), None];
1771 let encoded = value.encode();
1772 assert_eq!(hexify(&encoded), "03 01 01 01 ff 00");
1773 assert_eq!(<Vec<Option<i8>>>::decode(&mut &encoded[..]).unwrap(), value);
1774 }
1775
1776 #[test]
1777 fn vec_of_option_bool_encoded_as_expected() {
1778 let value = vec![OptionBool(Some(true)), OptionBool(Some(false)), OptionBool(None)];
1779 let encoded = value.encode();
1780 assert_eq!(hexify(&encoded), "03 01 02 00");
1781 assert_eq!(<Vec<OptionBool>>::decode(&mut &encoded[..]).unwrap(), value);
1782 }
1783
1784 #[test]
1785 fn vec_of_empty_tuples_encoded_as_expected() {
1786 let value = vec![(), (), (), (), ()];
1787 let encoded = value.encode();
1788 assert_eq!(hexify(&encoded), "05");
1789 assert_eq!(<Vec<()>>::decode(&mut &encoded[..]).unwrap(), value);
1790 }
1791
1792 #[cfg(feature = "bytes")]
1793 #[test]
1794 fn bytes_works_as_expected() {
1795 let input = bytes::Bytes::from_static(b"hello");
1796 let encoded = Encode::encode(&input);
1797 let encoded_vec = input.to_vec().encode();
1798 assert_eq!(encoded, encoded_vec);
1799
1800 assert_eq!(&b"hello"[..], bytes::Bytes::decode(&mut &encoded[..]).unwrap(),);
1801 }
1802
1803 #[cfg(feature = "bytes")]
1804 #[test]
1805 fn bytes_deserialized_from_bytes_is_zero_copy() {
1806 let encoded = bytes::Bytes::from(Encode::encode(&b"hello".to_vec()));
1807 let decoded = decode_from_bytes::<bytes::Bytes>(encoded.clone()).unwrap();
1808 assert_eq!(decoded, &b"hello"[..]);
1809
1810 assert_eq!(encoded.slice_ref(&decoded), &b"hello"[..]);
1812 }
1813
1814 #[cfg(feature = "bytes")]
1815 #[test]
1816 fn nested_bytes_deserialized_from_bytes_is_zero_copy() {
1817 let encoded = bytes::Bytes::from(Encode::encode(&Some(b"hello".to_vec())));
1818 let decoded = decode_from_bytes::<Option<bytes::Bytes>>(encoded.clone()).unwrap();
1819 let decoded = decoded.as_ref().unwrap();
1820 assert_eq!(decoded, &b"hello"[..]);
1821
1822 assert_eq!(encoded.slice_ref(decoded), &b"hello"[..]);
1824 }
1825
1826 fn test_encode_length<T: Encode + Decode + DecodeLength>(thing: &T, len: usize) {
1827 assert_eq!(<T as DecodeLength>::len(&thing.encode()[..]).unwrap(), len);
1828 }
1829
1830 #[test]
1831 fn len_works_for_decode_collection_types() {
1832 let vector = vec![10; 10];
1833 let mut btree_map: BTreeMap<u32, u32> = BTreeMap::new();
1834 btree_map.insert(1, 1);
1835 btree_map.insert(2, 2);
1836 let mut btree_set: BTreeSet<u32> = BTreeSet::new();
1837 btree_set.insert(1);
1838 btree_set.insert(2);
1839 let mut vd = VecDeque::new();
1840 vd.push_front(1);
1841 vd.push_front(2);
1842 let mut bh = BinaryHeap::new();
1843 bh.push(1);
1844 bh.push(2);
1845 let mut ll = LinkedList::new();
1846 ll.push_back(1);
1847 ll.push_back(2);
1848 let t1: (Vec<_>,) = (vector.clone(),);
1849 let t2: (Vec<_>, u32) = (vector.clone(), 3u32);
1850
1851 test_encode_length(&vector, 10);
1852 test_encode_length(&btree_map, 2);
1853 test_encode_length(&btree_set, 2);
1854 test_encode_length(&vd, 2);
1855 test_encode_length(&bh, 2);
1856 test_encode_length(&ll, 2);
1857 test_encode_length(&t1, 10);
1858 test_encode_length(&t2, 10);
1859 }
1860
1861 #[test]
1862 fn vec_of_string_encoded_as_expected() {
1863 let value = vec![
1864 "Hamlet".to_owned(),
1865 "Война и мир".to_owned(),
1866 "三国演义".to_owned(),
1867 "أَلْف لَيْلَة وَلَيْلَة".to_owned(),
1868 ];
1869 let encoded = value.encode();
1870 assert_eq!(
1871 hexify(&encoded),
1872 "04 06 48 61 6d 6c 65 74 14 d0 92 d0 be d0 b9 d0 bd d0 b0 20 d0 \
1873 b8 20 d0 bc d0 b8 d1 80 0c e4 b8 89 e5 9b bd e6 bc 94 e4 b9 89 2f d8 a3 d9 8e d9 84 d9 92 \
1874 d9 81 20 d9 84 d9 8e d9 8a d9 92 d9 84 d9 8e d8 a9 20 d9 88 d9 8e d9 84 d9 8e d9 8a d9 92 \
1875 d9 84 d9 8e d8 a9 e2 80 8e"
1876 );
1877 assert_eq!(<Vec<String>>::decode(&mut &encoded[..]).unwrap(), value);
1878 }
1879
1880 #[derive(Debug, PartialEq)]
1881 struct MyWrapper(Compact<u32>);
1882 impl Deref for MyWrapper {
1883 type Target = Compact<u32>;
1884 fn deref(&self) -> &Self::Target {
1885 &self.0
1886 }
1887 }
1888 impl WrapperTypeEncode for MyWrapper {}
1889
1890 impl From<Compact<u32>> for MyWrapper {
1891 fn from(c: Compact<u32>) -> Self {
1892 MyWrapper(c)
1893 }
1894 }
1895 impl WrapperTypeDecode for MyWrapper {
1896 type Wrapped = Compact<u32>;
1897 }
1898
1899 #[test]
1900 fn should_work_for_wrapper_types() {
1901 let result = vec![3];
1902
1903 assert_eq!(MyWrapper(3u32.into()).encode(), result);
1904 assert_eq!(MyWrapper::decode(&mut &*result).unwrap(), MyWrapper(3_u32.into()));
1905 }
1906
1907 #[test]
1908 fn codec_vec_deque_u8_and_u16() {
1909 let mut v_u8 = VecDeque::new();
1910 let mut v_u16 = VecDeque::new();
1911
1912 for i in 0..50 {
1913 v_u8.push_front(i as u8);
1914 v_u16.push_front(i as u16);
1915 }
1916 for i in 50..100 {
1917 v_u8.push_back(i as u8);
1918 v_u16.push_back(i as u16);
1919 }
1920
1921 assert_eq!(Decode::decode(&mut &v_u8.encode()[..]), Ok(v_u8));
1922 assert_eq!(Decode::decode(&mut &v_u16.encode()[..]), Ok(v_u16));
1923 }
1924
1925 #[test]
1926 fn codec_iterator() {
1927 let t1: BTreeSet<u32> = FromIterator::from_iter((0..10).flat_map(|i| 0..i));
1928 let t2: LinkedList<u32> = FromIterator::from_iter((0..10).flat_map(|i| 0..i));
1929 let t3: BinaryHeap<u32> = FromIterator::from_iter((0..10).flat_map(|i| 0..i));
1930 let t4: BTreeMap<u16, u32> =
1931 FromIterator::from_iter((0..10).flat_map(|i| 0..i).map(|i| (i as u16, i + 10)));
1932 let t5: BTreeSet<Vec<u8>> = FromIterator::from_iter((0..10).map(|i| Vec::from_iter(0..i)));
1933 let t6: LinkedList<Vec<u8>> =
1934 FromIterator::from_iter((0..10).map(|i| Vec::from_iter(0..i)));
1935 let t7: BinaryHeap<Vec<u8>> =
1936 FromIterator::from_iter((0..10).map(|i| Vec::from_iter(0..i)));
1937 let t8: BTreeMap<Vec<u8>, u32> = FromIterator::from_iter(
1938 (0..10).map(|i| Vec::from_iter(0..i)).map(|i| (i.clone(), i.len() as u32)),
1939 );
1940
1941 assert_eq!(Decode::decode(&mut &t1.encode()[..]), Ok(t1));
1942 assert_eq!(Decode::decode(&mut &t2.encode()[..]), Ok(t2));
1943 assert_eq!(
1944 Decode::decode(&mut &t3.encode()[..]).map(BinaryHeap::into_sorted_vec),
1945 Ok(t3.into_sorted_vec()),
1946 );
1947 assert_eq!(Decode::decode(&mut &t4.encode()[..]), Ok(t4));
1948 assert_eq!(Decode::decode(&mut &t5.encode()[..]), Ok(t5));
1949 assert_eq!(Decode::decode(&mut &t6.encode()[..]), Ok(t6));
1950 assert_eq!(
1951 Decode::decode(&mut &t7.encode()[..]).map(BinaryHeap::into_sorted_vec),
1952 Ok(t7.into_sorted_vec()),
1953 );
1954 assert_eq!(Decode::decode(&mut &t8.encode()[..]), Ok(t8));
1955 }
1956
1957 #[test]
1958 fn io_reader() {
1959 let mut io_reader = IoReader(std::io::Cursor::new(&[1u8, 2, 3][..]));
1960
1961 let mut v = [0; 2];
1962 io_reader.read(&mut v[..]).unwrap();
1963 assert_eq!(v, [1, 2]);
1964
1965 assert_eq!(io_reader.read_byte().unwrap(), 3);
1966
1967 assert_eq!(io_reader.read_byte(), Err("io error: UnexpectedEof".into()));
1968 }
1969
1970 #[test]
1971 fn shared_references_implement_encode() {
1972 Arc::new(10u32).encode();
1973 Rc::new(10u32).encode();
1974 }
1975
1976 #[test]
1977 fn not_limit_input_test() {
1978 use crate::Input;
1979
1980 struct NoLimit<'a>(&'a [u8]);
1981
1982 impl Input for NoLimit<'_> {
1983 fn remaining_len(&mut self) -> Result<Option<usize>, Error> {
1984 Ok(None)
1985 }
1986
1987 fn read(&mut self, into: &mut [u8]) -> Result<(), Error> {
1988 self.0.read(into)
1989 }
1990 }
1991
1992 let len = MAX_PREALLOCATION * 2 + 1;
1993 let mut i = Compact(len as u32).encode();
1994 i.resize(i.len() + len, 0);
1995 assert_eq!(<Vec<u8>>::decode(&mut NoLimit(&i[..])).unwrap(), vec![0u8; len]);
1996
1997 let i = Compact(len as u32).encode();
1998 assert_eq!(
1999 <Vec<u8>>::decode(&mut NoLimit(&i[..])).err().unwrap().to_string(),
2000 "Not enough data to fill buffer",
2001 );
2002
2003 let i = Compact(1000u32).encode();
2004 assert_eq!(
2005 <Vec<u8>>::decode(&mut NoLimit(&i[..])).err().unwrap().to_string(),
2006 "Not enough data to fill buffer",
2007 );
2008 }
2009
2010 #[test]
2011 fn boolean() {
2012 assert_eq!(true.encode(), vec![1]);
2013 assert_eq!(false.encode(), vec![0]);
2014 assert!(bool::decode(&mut &[1][..]).unwrap());
2015 assert!(!bool::decode(&mut &[0][..]).unwrap());
2016 }
2017
2018 #[test]
2019 fn some_encode_like() {
2020 fn t<B: EncodeLike>() {}
2021 t::<&[u8]>();
2022 t::<&str>();
2023 t::<NonZeroU32>();
2024 }
2025
2026 #[test]
2027 fn vec_deque_encode_like_vec() {
2028 let data: VecDeque<u32> = vec![1, 2, 3, 4, 5, 6].into();
2029 let encoded = data.encode();
2030
2031 let decoded = Vec::<u32>::decode(&mut &encoded[..]).unwrap();
2032 assert!(decoded.iter().all(|v| data.contains(v)));
2033 assert_eq!(data.len(), decoded.len());
2034
2035 let encoded = decoded.encode();
2036 let decoded = VecDeque::<u32>::decode(&mut &encoded[..]).unwrap();
2037 assert_eq!(data, decoded);
2038 }
2039
2040 #[test]
2041 fn vec_decode_right_capacity() {
2042 let data: Vec<u32> = vec![1, 2, 3];
2043 let mut encoded = data.encode();
2044 encoded.resize(encoded.len() * 2, 0);
2045 let decoded = Vec::<u32>::decode(&mut &encoded[..]).unwrap();
2046 assert_eq!(data, decoded);
2047 assert_eq!(decoded.capacity(), decoded.len());
2048 let data: Vec<String> = vec!["1".into(), "2".into(), "3".into()];
2050 let mut encoded = data.encode();
2051 encoded.resize(65536, 0);
2052 let decoded = Vec::<String>::decode(&mut &encoded[..]).unwrap();
2053 assert_eq!(data, decoded);
2054 assert_eq!(decoded.capacity(), decoded.len());
2055 }
2056
2057 #[test]
2058 fn duration() {
2059 let num_secs = 13;
2060 let num_nanos = 37;
2061
2062 let duration = Duration::new(num_secs, num_nanos);
2063 let expected = (num_secs, num_nanos).encode();
2064
2065 assert_eq!(duration.encode(), expected);
2066 assert_eq!(Duration::decode(&mut &expected[..]).unwrap(), duration);
2067 }
2068
2069 #[test]
2070 fn malformed_duration_encoding_fails() {
2071 let invalid_nanos = A_BILLION;
2073 let encoded = (0u64, invalid_nanos).encode();
2074 assert!(Duration::decode(&mut &encoded[..]).is_err());
2075
2076 let num_secs = 1u64;
2077 let num_nanos = 37u32;
2078 let invalid_nanos = num_secs as u32 * A_BILLION + num_nanos;
2079 let encoded = (num_secs, invalid_nanos).encode();
2080 assert!(Duration::decode(&mut &encoded[..]).is_err());
2082
2083 let duration = Duration::from_nanos(invalid_nanos as u64);
2085 let expected = (num_secs, num_nanos).encode();
2086
2087 assert_eq!(duration.encode(), expected);
2088 assert_eq!(Duration::decode(&mut &expected[..]).unwrap(), duration);
2089 }
2090
2091 #[test]
2092 fn u64_max() {
2093 let num_secs = u64::MAX;
2094 let num_nanos = 0;
2095 let duration = Duration::new(num_secs, num_nanos);
2096 let expected = (num_secs, num_nanos).encode();
2097
2098 assert_eq!(duration.encode(), expected);
2099 assert_eq!(Duration::decode(&mut &expected[..]).unwrap(), duration);
2100 }
2101
2102 #[test]
2103 fn decoding_does_not_overflow() {
2104 let num_secs = u64::MAX;
2105 let num_nanos = A_BILLION;
2106
2107 let encoded = (num_secs, num_nanos).encode();
2110 assert!(Duration::decode(&mut &encoded[..]).is_err());
2111 }
2112
2113 #[test]
2114 fn string_invalid_utf8() {
2115 let mut bytes: &[u8] = &[20, 114, 167, 10, 20, 114];
2117
2118 let obj = <String>::decode(&mut bytes);
2119 assert!(obj.is_err());
2120 }
2121
2122 #[test]
2123 fn empty_array_encode_and_decode() {
2124 let data: [u32; 0] = [];
2125 let encoded = data.encode();
2126 assert!(encoded.is_empty());
2127 <[u32; 0]>::decode(&mut &encoded[..]).unwrap();
2128 }
2129
2130 macro_rules! test_array_encode_and_decode {
2131 ( $( $name:ty ),* $(,)? ) => {
2132 $(
2133 paste::item! {
2134 #[test]
2135 fn [<test_array_encode_and_decode _ $name>]() {
2136 let data: [$name; 32] = [123 as $name; 32];
2137 let encoded = data.encode();
2138 let decoded: [$name; 32] = Decode::decode(&mut &encoded[..]).unwrap();
2139 assert_eq!(decoded, data);
2140 }
2141 }
2142 )*
2143 }
2144 }
2145
2146 test_array_encode_and_decode!(u8, i8, u16, i16, u32, i32, u64, i64, u128, i128);
2147
2148 test_array_encode_and_decode!(f32, f64);
2149
2150 fn test_encoded_size(val: impl Encode) {
2151 let length = val.using_encoded(|v| v.len());
2152
2153 assert_eq!(length, val.encoded_size());
2154 }
2155
2156 struct TestStruct {
2157 data: Vec<u32>,
2158 other: u8,
2159 compact: Compact<u128>,
2160 }
2161
2162 impl Encode for TestStruct {
2163 fn encode_to<W: Output + ?Sized>(&self, dest: &mut W) {
2164 self.data.encode_to(dest);
2165 self.other.encode_to(dest);
2166 self.compact.encode_to(dest);
2167 }
2168 }
2169
2170 #[test]
2171 fn encoded_size_works() {
2172 test_encoded_size(120u8);
2173 test_encoded_size(30u16);
2174 test_encoded_size(1u32);
2175 test_encoded_size(2343545u64);
2176 test_encoded_size(34358394245459854u128);
2177 test_encoded_size(vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10u32]);
2178 test_encoded_size(Compact(32445u32));
2179 test_encoded_size(Compact(34353454453545u128));
2180 test_encoded_size(TestStruct {
2181 data: vec![1, 2, 4, 5, 6],
2182 other: 45,
2183 compact: Compact(123234545),
2184 });
2185 }
2186
2187 #[test]
2188 fn ranges() {
2189 let range = Range { start: 1, end: 100 };
2190 let range_bytes = (1, 100).encode();
2191 assert_eq!(range.encode(), range_bytes);
2192 assert_eq!(Range::decode(&mut &range_bytes[..]), Ok(range));
2193
2194 let range_inclusive = RangeInclusive::new(1, 100);
2195 let range_inclusive_bytes = (1, 100).encode();
2196 assert_eq!(range_inclusive.encode(), range_inclusive_bytes);
2197 assert_eq!(RangeInclusive::decode(&mut &range_inclusive_bytes[..]), Ok(range_inclusive));
2198 }
2199}