Skip to main content

bincode_next/de/
impls.rs

1#![allow(unsafe_code, clippy::cast_possible_truncation)]
2#![allow(clippy::redundant_else)]
3use super::BorrowDecode;
4use super::BorrowDecoder;
5use super::Decode;
6use super::Decoder;
7use super::read::BorrowReader;
8use super::read::Reader;
9use crate::config::Endianness;
10use crate::config::IntEncoding;
11use crate::config::InternalEndianConfig;
12use crate::config::InternalIntEncodingConfig;
13use crate::error::DecodeError;
14use crate::error::IntegerType;
15use crate::impl_borrow_decode;
16use core::cell::Cell;
17use core::cell::RefCell;
18use core::cmp::Reverse;
19use core::num::NonZeroI8;
20use core::num::NonZeroI16;
21use core::num::NonZeroI32;
22use core::num::NonZeroI64;
23use core::num::NonZeroI128;
24use core::num::NonZeroIsize;
25use core::num::NonZeroU8;
26use core::num::NonZeroU16;
27use core::num::NonZeroU32;
28use core::num::NonZeroU64;
29use core::num::NonZeroU128;
30use core::num::NonZeroUsize;
31use core::num::Wrapping;
32use core::ops::Bound;
33use core::ops::Range;
34use core::ops::RangeInclusive;
35use core::time::Duration;
36
37impl<Context> Decode<Context> for bool {
38    #[inline(always)]
39    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
40        decoder.decode_bool()
41    }
42}
43impl_borrow_decode!(bool);
44
45impl<Context> Decode<Context> for u8 {
46    #[inline(always)]
47    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
48        decoder.decode_u8()
49    }
50}
51impl_borrow_decode!(u8);
52
53impl<Context> Decode<Context> for NonZeroU8 {
54    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
55        Self::new(u8::decode(decoder)?).ok_or_else(|| {
56            crate::error::cold_decode_error_non_zero_type_is_zero::<()>(IntegerType::U8)
57                .unwrap_err()
58        })
59    }
60}
61impl_borrow_decode!(NonZeroU8);
62
63impl<Context> Decode<Context> for u16 {
64    #[inline(always)]
65    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
66        decoder.decode_u16()
67    }
68}
69impl_borrow_decode!(u16);
70
71impl<Context> Decode<Context> for NonZeroU16 {
72    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
73        Self::new(u16::decode(decoder)?).ok_or_else(|| {
74            crate::error::cold_decode_error_non_zero_type_is_zero::<()>(IntegerType::U16)
75                .unwrap_err()
76        })
77    }
78}
79impl_borrow_decode!(NonZeroU16);
80
81impl<Context> Decode<Context> for u32 {
82    #[inline(always)]
83    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
84        decoder.decode_u32()
85    }
86}
87impl_borrow_decode!(u32);
88
89impl<Context> Decode<Context> for NonZeroU32 {
90    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
91        Self::new(u32::decode(decoder)?).ok_or_else(|| {
92            crate::error::cold_decode_error_non_zero_type_is_zero::<()>(IntegerType::U32)
93                .unwrap_err()
94        })
95    }
96}
97impl_borrow_decode!(NonZeroU32);
98
99impl<Context> Decode<Context> for u64 {
100    #[inline(always)]
101    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
102        decoder.decode_u64()
103    }
104}
105impl_borrow_decode!(u64);
106
107impl<Context> Decode<Context> for NonZeroU64 {
108    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
109        Self::new(u64::decode(decoder)?).ok_or_else(|| {
110            crate::error::cold_decode_error_non_zero_type_is_zero::<()>(IntegerType::U64)
111                .unwrap_err()
112        })
113    }
114}
115impl_borrow_decode!(NonZeroU64);
116
117impl<Context> Decode<Context> for u128 {
118    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
119        decoder.decode_u128()
120    }
121}
122impl_borrow_decode!(u128);
123
124impl<Context> Decode<Context> for NonZeroU128 {
125    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
126        Self::new(u128::decode(decoder)?).ok_or_else(|| {
127            crate::error::cold_decode_error_non_zero_type_is_zero::<()>(IntegerType::U128)
128                .unwrap_err()
129        })
130    }
131}
132impl_borrow_decode!(NonZeroU128);
133
134impl<Context> Decode<Context> for usize {
135    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
136        decoder.decode_usize()
137    }
138}
139impl_borrow_decode!(usize);
140
141impl<Context> Decode<Context> for NonZeroUsize {
142    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
143        Self::new(usize::decode(decoder)?).ok_or_else(|| {
144            crate::error::cold_decode_error_non_zero_type_is_zero::<()>(IntegerType::Usize)
145                .unwrap_err()
146        })
147    }
148}
149impl_borrow_decode!(NonZeroUsize);
150
151impl<Context> Decode<Context> for i8 {
152    #[inline(always)]
153    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
154        decoder.decode_i8()
155    }
156}
157impl_borrow_decode!(i8);
158
159impl<Context> Decode<Context> for NonZeroI8 {
160    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
161        Self::new(i8::decode(decoder)?).ok_or_else(|| {
162            crate::error::cold_decode_error_non_zero_type_is_zero::<()>(IntegerType::I8)
163                .unwrap_err()
164        })
165    }
166}
167impl_borrow_decode!(NonZeroI8);
168
169impl<Context> Decode<Context> for i16 {
170    #[inline(always)]
171    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
172        decoder.decode_i16()
173    }
174}
175impl_borrow_decode!(i16);
176
177impl<Context> Decode<Context> for NonZeroI16 {
178    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
179        Self::new(i16::decode(decoder)?).ok_or_else(|| {
180            crate::error::cold_decode_error_non_zero_type_is_zero::<()>(IntegerType::I16)
181                .unwrap_err()
182        })
183    }
184}
185impl_borrow_decode!(NonZeroI16);
186
187impl<Context> Decode<Context> for i32 {
188    #[inline(always)]
189    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
190        decoder.decode_i32()
191    }
192}
193impl_borrow_decode!(i32);
194
195impl<Context> Decode<Context> for NonZeroI32 {
196    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
197        Self::new(i32::decode(decoder)?).ok_or_else(|| {
198            crate::error::cold_decode_error_non_zero_type_is_zero::<()>(IntegerType::I32)
199                .unwrap_err()
200        })
201    }
202}
203impl_borrow_decode!(NonZeroI32);
204
205impl<Context> Decode<Context> for i64 {
206    #[inline(always)]
207    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
208        decoder.decode_i64()
209    }
210}
211impl_borrow_decode!(i64);
212
213impl<Context> Decode<Context> for NonZeroI64 {
214    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
215        Self::new(i64::decode(decoder)?).ok_or_else(|| {
216            crate::error::cold_decode_error_non_zero_type_is_zero::<()>(IntegerType::I64)
217                .unwrap_err()
218        })
219    }
220}
221impl_borrow_decode!(NonZeroI64);
222
223impl<Context> Decode<Context> for i128 {
224    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
225        decoder.decode_i128()
226    }
227}
228impl_borrow_decode!(i128);
229
230impl<Context> Decode<Context> for NonZeroI128 {
231    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
232        Self::new(i128::decode(decoder)?).ok_or_else(|| {
233            crate::error::cold_decode_error_non_zero_type_is_zero::<()>(IntegerType::I128)
234                .unwrap_err()
235        })
236    }
237}
238impl_borrow_decode!(NonZeroI128);
239
240impl<Context> Decode<Context> for isize {
241    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
242        decoder.decode_isize()
243    }
244}
245impl_borrow_decode!(isize);
246
247impl<Context> Decode<Context> for NonZeroIsize {
248    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
249        Self::new(isize::decode(decoder)?).ok_or_else(|| {
250            crate::error::cold_decode_error_non_zero_type_is_zero::<()>(IntegerType::Isize)
251                .unwrap_err()
252        })
253    }
254}
255impl_borrow_decode!(NonZeroIsize);
256
257impl<Context> Decode<Context> for f32 {
258    #[inline(always)]
259    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
260        decoder.decode_f32()
261    }
262}
263impl_borrow_decode!(f32);
264
265impl<Context> Decode<Context> for f64 {
266    #[inline(always)]
267    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
268        decoder.decode_f64()
269    }
270}
271impl_borrow_decode!(f64);
272
273impl<Context, T: Decode<Context>> Decode<Context> for Wrapping<T> {
274    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
275        Ok(Self(T::decode(decoder)?))
276    }
277}
278impl<'de, Context, T: BorrowDecode<'de, Context>> BorrowDecode<'de, Context> for Wrapping<T> {
279    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
280        decoder: &mut D
281    ) -> Result<Self, DecodeError> {
282        Ok(Self(T::borrow_decode(decoder)?))
283    }
284}
285
286impl<Context, T: Decode<Context>> Decode<Context> for Reverse<T> {
287    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
288        Ok(Self(T::decode(decoder)?))
289    }
290}
291
292impl<'de, Context, T: BorrowDecode<'de, Context>> BorrowDecode<'de, Context> for Reverse<T> {
293    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
294        decoder: &mut D
295    ) -> Result<Self, DecodeError> {
296        Ok(Self(T::borrow_decode(decoder)?))
297    }
298}
299
300impl<Context> Decode<Context> for char {
301    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
302        let mut array = [0u8; 4];
303
304        // Look at the first byte to see how many bytes must be read
305        decoder.reader().read(&mut array[..1])?;
306
307        let width = utf8_char_width(array[0]);
308        if width == 0 {
309            return crate::error::cold_decode_error_invalid_char_encoding(array);
310        }
311        // Normally we have to `.claim_bytes_read` before reading, however in this
312        // case the amount of bytes read from `char` can vary wildly, and it should
313        // only read up to 4 bytes too much.
314        decoder.claim_bytes_read(width)?;
315        if width == 1 {
316            return Ok(array[0] as Self);
317        }
318
319        // read the remaining pain
320        decoder.reader().read(&mut array[1..width])?;
321        let res = core::str::from_utf8(&array[..width])
322            .ok()
323            .and_then(|s| s.chars().next())
324            .ok_or_else(|| {
325                crate::error::cold_decode_error_invalid_char_encoding::<()>(array).unwrap_err()
326            })?;
327        Ok(res)
328    }
329}
330impl_borrow_decode!(char);
331
332impl<'a, 'de: 'a, Context> BorrowDecode<'de, Context> for &'a [u8] {
333    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
334        decoder: &mut D
335    ) -> Result<Self, DecodeError> {
336        let len = decoder.decode_byte_slice_len()?;
337        decoder.claim_bytes_read(len)?;
338        decoder.borrow_reader().take_bytes(len)
339    }
340}
341
342impl<'a, 'de: 'a, Context> BorrowDecode<'de, Context> for &'a str {
343    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
344        decoder: &mut D
345    ) -> Result<Self, DecodeError> {
346        let len = decoder.decode_str_len()?;
347        decoder.claim_bytes_read(len)?;
348        let slice = decoder.borrow_reader().take_bytes(len)?;
349        core::str::from_utf8(slice)
350            .map_err(|inner| crate::error::cold_decode_error_utf8::<()>(inner).unwrap_err())
351    }
352}
353
354impl<Context, T, const N: usize> Decode<Context> for [T; N]
355where
356    T: Decode<Context>,
357{
358    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
359        let is_u8 = unty::type_equal::<T, u8>() || unty::type_equal::<T, i8>();
360        let is_bincode = matches!(
361            <D::C as crate::config::InternalFormatConfig>::FORMAT,
362            crate::config::Format::Bincode | crate::config::Format::BincodeDeterministic
363        );
364
365        if !is_bincode {
366            if is_u8 {
367                let len = decoder.decode_byte_slice_len()?;
368                if len != N {
369                    return Err(DecodeError::ArrayLengthMismatch {
370                        required: N,
371                        found: len,
372                    });
373                }
374                decoder.claim_bytes_read(N)?;
375                let mut res = core::mem::MaybeUninit::<[T; N]>::uninit();
376                unsafe {
377                    let slice_ptr = res.as_mut_ptr().cast::<u8>();
378                    let slice = core::slice::from_raw_parts_mut(slice_ptr, N);
379                    decoder.reader().read(slice)?;
380                    return Ok(res.assume_init());
381                }
382            } else {
383                let len = decoder.decode_array_len()?;
384                if len != N && len != usize::MAX {
385                    return Err(DecodeError::ArrayLengthMismatch {
386                        required: N,
387                        found: len,
388                    });
389                }
390            }
391        }
392
393        let is_fixed = matches!(D::C::INT_ENCODING, IntEncoding::Fixed);
394        let is_native_endian = match D::C::ENDIAN {
395            | Endianness::Little => cfg!(target_endian = "little"),
396            | Endianness::Big => cfg!(target_endian = "big"),
397        };
398
399        if is_bincode
400            && (is_u8
401                || (is_fixed
402                    && is_native_endian
403                    && (unty::type_equal::<T, u16>()
404                        || unty::type_equal::<T, i16>()
405                        || unty::type_equal::<T, u32>()
406                        || unty::type_equal::<T, i32>()
407                        || unty::type_equal::<T, u64>()
408                        || unty::type_equal::<T, i64>()
409                        || unty::type_equal::<T, u128>()
410                        || unty::type_equal::<T, i128>()
411                        || unty::type_equal::<T, f32>()
412                        || unty::type_equal::<T, f64>())))
413        {
414            decoder.claim_bytes_read(core::mem::size_of::<[T; N]>())?;
415            // SAFETY: T is a primitive type (pod), so it's safe to read its bytes directly.
416            // We've checked that the encoding is Fixed and Endianness matches,
417            // or that it's a 1-byte type (u8/i8).
418            let mut res = core::mem::MaybeUninit::<[T; N]>::uninit();
419            unsafe {
420                let slice_ptr = res.as_mut_ptr().cast::<u8>();
421                let slice =
422                    core::slice::from_raw_parts_mut(slice_ptr, core::mem::size_of::<[T; N]>());
423                decoder.reader().read(slice)?;
424                Ok(res.assume_init())
425            }
426        } else {
427            let result =
428                super::impl_core::collect_into_array(&mut (0..N).map(|_| T::decode(decoder)));
429
430            // result is only None if N does not match the values of `(0..N)`, which it always should
431            // So this unwrap should never occur
432            result.unwrap()
433        }
434    }
435}
436
437impl<'de, T, const N: usize, Context> BorrowDecode<'de, Context> for [T; N]
438where
439    T: BorrowDecode<'de, Context>,
440{
441    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
442        decoder: &mut D
443    ) -> Result<Self, DecodeError> {
444        let is_u8 = unty::type_equal::<T, u8>() || unty::type_equal::<T, i8>();
445        let is_bincode = matches!(
446            <D::C as crate::config::InternalFormatConfig>::FORMAT,
447            crate::config::Format::Bincode | crate::config::Format::BincodeDeterministic
448        );
449
450        if !is_bincode {
451            if is_u8 {
452                let len = decoder.decode_byte_slice_len()?;
453                if len != N {
454                    return Err(DecodeError::ArrayLengthMismatch {
455                        required: N,
456                        found: len,
457                    });
458                }
459                decoder.claim_bytes_read(N)?;
460                let mut res = core::mem::MaybeUninit::<[T; N]>::uninit();
461                unsafe {
462                    let slice_ptr = res.as_mut_ptr().cast::<u8>();
463                    let slice = core::slice::from_raw_parts_mut(slice_ptr, N);
464                    decoder.reader().read(slice)?;
465                    return Ok(res.assume_init());
466                }
467            } else {
468                let len = decoder.decode_array_len()?;
469                if len != N && len != usize::MAX {
470                    return Err(DecodeError::ArrayLengthMismatch {
471                        required: N,
472                        found: len,
473                    });
474                }
475            }
476        }
477
478        let is_fixed = matches!(D::C::INT_ENCODING, IntEncoding::Fixed);
479        let is_native_endian = match D::C::ENDIAN {
480            | Endianness::Little => cfg!(target_endian = "little"),
481            | Endianness::Big => cfg!(target_endian = "big"),
482        };
483
484        if is_bincode
485            && (is_u8
486                || (is_fixed
487                    && is_native_endian
488                    && (unty::type_equal::<T, u16>()
489                        || unty::type_equal::<T, i16>()
490                        || unty::type_equal::<T, u32>()
491                        || unty::type_equal::<T, i32>()
492                        || unty::type_equal::<T, u64>()
493                        || unty::type_equal::<T, i64>()
494                        || unty::type_equal::<T, u128>()
495                        || unty::type_equal::<T, i128>()
496                        || unty::type_equal::<T, f32>()
497                        || unty::type_equal::<T, f64>())))
498        {
499            decoder.claim_bytes_read(core::mem::size_of::<[T; N]>())?;
500            // SAFETY: T is a primitive type (pod), so it's safe to read its bytes directly.
501            // We've checked that the encoding is Fixed and Endianness matches,
502            // or that it's a 1-byte type (u8/i8).
503            let mut res = core::mem::MaybeUninit::<[T; N]>::uninit();
504            unsafe {
505                let slice_ptr = res.as_mut_ptr().cast::<u8>();
506                let slice =
507                    core::slice::from_raw_parts_mut(slice_ptr, core::mem::size_of::<[T; N]>());
508                decoder.reader().read(slice)?;
509                Ok(res.assume_init())
510            }
511        } else {
512            let result = super::impl_core::collect_into_array(
513                &mut (0..N).map(|_| T::borrow_decode(decoder)),
514            );
515
516            // result is only None if N does not match the values of `(0..N)`, which it always should
517            // So this unwrap should never occur
518            result.unwrap()
519        }
520    }
521}
522
523impl<Context> Decode<Context> for () {
524    fn decode<D: Decoder<Context = Context>>(_: &mut D) -> Result<Self, DecodeError> {
525        Ok(())
526    }
527}
528impl_borrow_decode!(());
529
530impl<Context, T> Decode<Context> for core::marker::PhantomData<T> {
531    fn decode<D: Decoder<Context = Context>>(_: &mut D) -> Result<Self, DecodeError> {
532        Ok(Self)
533    }
534}
535impl_borrow_decode!(core::marker::PhantomData<T>, T);
536
537impl<Context, T> Decode<Context> for Option<T>
538where
539    T: Decode<Context>,
540{
541    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
542        match super::decode_option_variant(decoder, core::any::type_name::<Self>())? {
543            | Some(()) => {
544                let val = T::decode(decoder)?;
545                Ok(Some(val))
546            },
547            | None => Ok(None),
548        }
549    }
550}
551
552impl<'de, T, Context> BorrowDecode<'de, Context> for Option<T>
553where
554    T: BorrowDecode<'de, Context>,
555{
556    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
557        decoder: &mut D
558    ) -> Result<Self, DecodeError> {
559        match super::decode_option_variant(decoder, core::any::type_name::<Self>())? {
560            | Some(()) => {
561                let val = T::borrow_decode(decoder)?;
562                Ok(Some(val))
563            },
564            | None => Ok(None),
565        }
566    }
567}
568
569impl<Context, T, U> Decode<Context> for Result<T, U>
570where
571    T: Decode<Context>,
572    U: Decode<Context>,
573{
574    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
575        let is_ok = decoder.decode_variant_index()?;
576        match is_ok {
577            | 0 => {
578                let t = T::decode(decoder)?;
579                Ok(Ok(t))
580            },
581            | 1 => {
582                let u = U::decode(decoder)?;
583                Ok(Err(u))
584            },
585            | x => {
586                crate::error::cold_decode_error_unexpected_variant(
587                    core::any::type_name::<Self>(),
588                    &crate::error::AllowedEnumVariants::Range { max: 1, min: 0 },
589                    x,
590                )
591            },
592        }
593    }
594}
595
596impl<'de, T, U, Context> BorrowDecode<'de, Context> for Result<T, U>
597where
598    T: BorrowDecode<'de, Context>,
599    U: BorrowDecode<'de, Context>,
600{
601    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
602        decoder: &mut D
603    ) -> Result<Self, DecodeError> {
604        let is_ok = decoder.decode_variant_index()?;
605        match is_ok {
606            | 0 => {
607                let t = T::borrow_decode(decoder)?;
608                Ok(Ok(t))
609            },
610            | 1 => {
611                let u = U::borrow_decode(decoder)?;
612                Ok(Err(u))
613            },
614            | x => {
615                crate::error::cold_decode_error_unexpected_variant(
616                    core::any::type_name::<Self>(),
617                    &crate::error::AllowedEnumVariants::Range { max: 1, min: 0 },
618                    x,
619                )
620            },
621        }
622    }
623}
624
625impl<Context, T> Decode<Context> for Cell<T>
626where
627    T: Decode<Context>,
628{
629    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
630        let t = T::decode(decoder)?;
631        Ok(Self::new(t))
632    }
633}
634
635impl<'de, T, Context> BorrowDecode<'de, Context> for Cell<T>
636where
637    T: BorrowDecode<'de, Context>,
638{
639    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
640        decoder: &mut D
641    ) -> Result<Self, DecodeError> {
642        let t = T::borrow_decode(decoder)?;
643        Ok(Self::new(t))
644    }
645}
646
647impl<Context, T> Decode<Context> for RefCell<T>
648where
649    T: Decode<Context>,
650{
651    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
652        let t = T::decode(decoder)?;
653        Ok(Self::new(t))
654    }
655}
656
657impl<'de, T, Context> BorrowDecode<'de, Context> for RefCell<T>
658where
659    T: BorrowDecode<'de, Context>,
660{
661    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
662        decoder: &mut D
663    ) -> Result<Self, DecodeError> {
664        let t = T::borrow_decode(decoder)?;
665        Ok(Self::new(t))
666    }
667}
668
669impl<Context> Decode<Context> for Duration {
670    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
671        const NANOS_PER_SEC: u64 = 1_000_000_000;
672        let secs: u64 = Decode::decode(decoder)?;
673        let nanos: u32 = Decode::decode(decoder)?;
674        if secs.checked_add(u64::from(nanos) / NANOS_PER_SEC).is_none() {
675            return crate::error::cold_decode_error_invalid_duration(secs, nanos);
676        }
677        Ok(Self::new(secs, nanos))
678    }
679}
680impl_borrow_decode!(Duration);
681
682impl<Context, T> Decode<Context> for Range<T>
683where
684    T: Decode<Context>,
685{
686    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
687        let min = T::decode(decoder)?;
688        let max = T::decode(decoder)?;
689        Ok(min..max)
690    }
691}
692impl<'de, T, Context> BorrowDecode<'de, Context> for Range<T>
693where
694    T: BorrowDecode<'de, Context>,
695{
696    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
697        decoder: &mut D
698    ) -> Result<Self, DecodeError> {
699        let min = T::borrow_decode(decoder)?;
700        let max = T::borrow_decode(decoder)?;
701        Ok(min..max)
702    }
703}
704
705impl<Context, T> Decode<Context> for RangeInclusive<T>
706where
707    T: Decode<Context>,
708{
709    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
710        let min = T::decode(decoder)?;
711        let max = T::decode(decoder)?;
712        Ok(Self::new(min, max))
713    }
714}
715
716impl<'de, T, Context> BorrowDecode<'de, Context> for RangeInclusive<T>
717where
718    T: BorrowDecode<'de, Context>,
719{
720    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
721        decoder: &mut D
722    ) -> Result<Self, DecodeError> {
723        let min = T::borrow_decode(decoder)?;
724        let max = T::borrow_decode(decoder)?;
725        Ok(Self::new(min, max))
726    }
727}
728
729impl<T, Context> Decode<Context> for Bound<T>
730where
731    T: Decode<Context>,
732{
733    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
734        match u32::decode(decoder)? {
735            | 0 => Ok(Self::Unbounded),
736            | 1 => Ok(Self::Included(T::decode(decoder)?)),
737            | 2 => Ok(Self::Excluded(T::decode(decoder)?)),
738            | x => {
739                crate::error::cold_decode_error_unexpected_variant(
740                    core::any::type_name::<Self>(),
741                    &crate::error::AllowedEnumVariants::Range { max: 2, min: 0 },
742                    x,
743                )
744            },
745        }
746    }
747}
748
749impl<'de, T, Context> BorrowDecode<'de, Context> for Bound<T>
750where
751    T: BorrowDecode<'de, Context>,
752{
753    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
754        decoder: &mut D
755    ) -> Result<Self, DecodeError> {
756        match u32::decode(decoder)? {
757            | 0 => Ok(Self::Unbounded),
758            | 1 => Ok(Self::Included(T::borrow_decode(decoder)?)),
759            | 2 => Ok(Self::Excluded(T::borrow_decode(decoder)?)),
760            | x => {
761                crate::error::cold_decode_error_unexpected_variant(
762                    core::any::type_name::<Self>(),
763                    &crate::error::AllowedEnumVariants::Range { max: 2, min: 0 },
764                    x,
765                )
766            },
767        }
768    }
769}
770
771const UTF8_CHAR_WIDTH: [u8; 256] = [
772    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
773    1, // 0x1F
774    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
775    1, // 0x3F
776    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
777    1, // 0x5F
778    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
779    1, // 0x7F
780    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
781    0, // 0x9F
782    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
783    0, // 0xBF
784    0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
785    2, // 0xDF
786    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 0xEF
787    4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0xFF
788];
789
790// This function is a copy of core::str::utf8_char_width
791const fn utf8_char_width(b: u8) -> usize {
792    UTF8_CHAR_WIDTH[b as usize] as usize
793}