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 crate::error::cold_decode_error_array_length_mismatch(N, len);
370                }
371                decoder.claim_bytes_read(N)?;
372                let mut res = core::mem::MaybeUninit::<[T; N]>::uninit();
373                unsafe {
374                    let slice_ptr = res.as_mut_ptr().cast::<u8>();
375                    let slice = core::slice::from_raw_parts_mut(slice_ptr, N);
376                    decoder.reader().read(slice)?;
377                    return Ok(res.assume_init());
378                }
379            } else {
380                let len = decoder.decode_array_len()?;
381                if len != N && len != usize::MAX {
382                    return crate::error::cold_decode_error_array_length_mismatch(N, len);
383                }
384            }
385        }
386
387        let is_fixed = matches!(D::C::INT_ENCODING, IntEncoding::Fixed);
388        let is_native_endian = match D::C::ENDIAN {
389            | Endianness::Little => cfg!(target_endian = "little"),
390            | Endianness::Big => cfg!(target_endian = "big"),
391        };
392
393        if is_bincode
394            && (is_u8
395                || (is_fixed
396                    && is_native_endian
397                    && (unty::type_equal::<T, u16>()
398                        || unty::type_equal::<T, i16>()
399                        || unty::type_equal::<T, u32>()
400                        || unty::type_equal::<T, i32>()
401                        || unty::type_equal::<T, u64>()
402                        || unty::type_equal::<T, i64>()
403                        || unty::type_equal::<T, u128>()
404                        || unty::type_equal::<T, i128>()
405                        || unty::type_equal::<T, f32>()
406                        || unty::type_equal::<T, f64>())))
407        {
408            decoder.claim_bytes_read(core::mem::size_of::<[T; N]>())?;
409            // SAFETY: T is a primitive type (pod), so it's safe to read its bytes directly.
410            // We've checked that the encoding is Fixed and Endianness matches,
411            // or that it's a 1-byte type (u8/i8).
412            let mut res = core::mem::MaybeUninit::<[T; N]>::uninit();
413            unsafe {
414                let slice_ptr = res.as_mut_ptr().cast::<u8>();
415                let slice =
416                    core::slice::from_raw_parts_mut(slice_ptr, core::mem::size_of::<[T; N]>());
417                decoder.reader().read(slice)?;
418                Ok(res.assume_init())
419            }
420        } else {
421            let result =
422                super::impl_core::collect_into_array(&mut (0..N).map(|_| T::decode(decoder)));
423
424            // result is only None if N does not match the values of `(0..N)`, which it always should
425            // So this unwrap should never occur
426            result.unwrap()
427        }
428    }
429}
430
431impl<'de, T, const N: usize, Context> BorrowDecode<'de, Context> for [T; N]
432where
433    T: BorrowDecode<'de, Context>,
434{
435    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
436        decoder: &mut D
437    ) -> Result<Self, DecodeError> {
438        let is_u8 = unty::type_equal::<T, u8>() || unty::type_equal::<T, i8>();
439        let is_bincode = matches!(
440            <D::C as crate::config::InternalFormatConfig>::FORMAT,
441            crate::config::Format::Bincode | crate::config::Format::BincodeDeterministic
442        );
443
444        if !is_bincode {
445            if is_u8 {
446                let len = decoder.decode_byte_slice_len()?;
447                if len != N {
448                    return crate::error::cold_decode_error_array_length_mismatch(N, len);
449                }
450                decoder.claim_bytes_read(N)?;
451                let mut res = core::mem::MaybeUninit::<[T; N]>::uninit();
452                unsafe {
453                    let slice_ptr = res.as_mut_ptr().cast::<u8>();
454                    let slice = core::slice::from_raw_parts_mut(slice_ptr, N);
455                    decoder.reader().read(slice)?;
456                    return Ok(res.assume_init());
457                }
458            } else {
459                let len = decoder.decode_array_len()?;
460                if len != N && len != usize::MAX {
461                    return crate::error::cold_decode_error_array_length_mismatch(N, len);
462                }
463            }
464        }
465
466        let is_fixed = matches!(D::C::INT_ENCODING, IntEncoding::Fixed);
467        let is_native_endian = match D::C::ENDIAN {
468            | Endianness::Little => cfg!(target_endian = "little"),
469            | Endianness::Big => cfg!(target_endian = "big"),
470        };
471
472        if is_bincode
473            && (is_u8
474                || (is_fixed
475                    && is_native_endian
476                    && (unty::type_equal::<T, u16>()
477                        || unty::type_equal::<T, i16>()
478                        || unty::type_equal::<T, u32>()
479                        || unty::type_equal::<T, i32>()
480                        || unty::type_equal::<T, u64>()
481                        || unty::type_equal::<T, i64>()
482                        || unty::type_equal::<T, u128>()
483                        || unty::type_equal::<T, i128>()
484                        || unty::type_equal::<T, f32>()
485                        || unty::type_equal::<T, f64>())))
486        {
487            decoder.claim_bytes_read(core::mem::size_of::<[T; N]>())?;
488            // SAFETY: T is a primitive type (pod), so it's safe to read its bytes directly.
489            // We've checked that the encoding is Fixed and Endianness matches,
490            // or that it's a 1-byte type (u8/i8).
491            let mut res = core::mem::MaybeUninit::<[T; N]>::uninit();
492            unsafe {
493                let slice_ptr = res.as_mut_ptr().cast::<u8>();
494                let slice =
495                    core::slice::from_raw_parts_mut(slice_ptr, core::mem::size_of::<[T; N]>());
496                decoder.reader().read(slice)?;
497                Ok(res.assume_init())
498            }
499        } else {
500            let result = super::impl_core::collect_into_array(
501                &mut (0..N).map(|_| T::borrow_decode(decoder)),
502            );
503
504            // result is only None if N does not match the values of `(0..N)`, which it always should
505            // So this unwrap should never occur
506            result.unwrap()
507        }
508    }
509}
510
511impl<Context> Decode<Context> for () {
512    fn decode<D: Decoder<Context = Context>>(_: &mut D) -> Result<Self, DecodeError> {
513        Ok(())
514    }
515}
516impl_borrow_decode!(());
517
518impl<Context, T> Decode<Context> for core::marker::PhantomData<T> {
519    fn decode<D: Decoder<Context = Context>>(_: &mut D) -> Result<Self, DecodeError> {
520        Ok(Self)
521    }
522}
523impl_borrow_decode!(core::marker::PhantomData<T>, T);
524
525impl<Context, T> Decode<Context> for Option<T>
526where
527    T: Decode<Context>,
528{
529    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
530        match super::decode_option_variant(decoder, core::any::type_name::<Self>())? {
531            | Some(()) => {
532                let val = T::decode(decoder)?;
533                Ok(Some(val))
534            },
535            | None => Ok(None),
536        }
537    }
538}
539
540impl<'de, T, Context> BorrowDecode<'de, Context> for Option<T>
541where
542    T: BorrowDecode<'de, Context>,
543{
544    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
545        decoder: &mut D
546    ) -> Result<Self, DecodeError> {
547        match super::decode_option_variant(decoder, core::any::type_name::<Self>())? {
548            | Some(()) => {
549                let val = T::borrow_decode(decoder)?;
550                Ok(Some(val))
551            },
552            | None => Ok(None),
553        }
554    }
555}
556
557impl<Context, T, U> Decode<Context> for Result<T, U>
558where
559    T: Decode<Context>,
560    U: Decode<Context>,
561{
562    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
563        let is_ok = decoder.decode_variant_index()?;
564        match is_ok {
565            | 0 => {
566                let t = T::decode(decoder)?;
567                Ok(Ok(t))
568            },
569            | 1 => {
570                let u = U::decode(decoder)?;
571                Ok(Err(u))
572            },
573            | x => {
574                crate::error::cold_decode_error_unexpected_variant(
575                    core::any::type_name::<Self>(),
576                    &crate::error::AllowedEnumVariants::Range { max: 1, min: 0 },
577                    x,
578                )
579            },
580        }
581    }
582}
583
584impl<'de, T, U, Context> BorrowDecode<'de, Context> for Result<T, U>
585where
586    T: BorrowDecode<'de, Context>,
587    U: BorrowDecode<'de, Context>,
588{
589    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
590        decoder: &mut D
591    ) -> Result<Self, DecodeError> {
592        let is_ok = decoder.decode_variant_index()?;
593        match is_ok {
594            | 0 => {
595                let t = T::borrow_decode(decoder)?;
596                Ok(Ok(t))
597            },
598            | 1 => {
599                let u = U::borrow_decode(decoder)?;
600                Ok(Err(u))
601            },
602            | x => {
603                crate::error::cold_decode_error_unexpected_variant(
604                    core::any::type_name::<Self>(),
605                    &crate::error::AllowedEnumVariants::Range { max: 1, min: 0 },
606                    x,
607                )
608            },
609        }
610    }
611}
612
613impl<Context, T> Decode<Context> for Cell<T>
614where
615    T: Decode<Context>,
616{
617    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
618        let t = T::decode(decoder)?;
619        Ok(Self::new(t))
620    }
621}
622
623impl<'de, T, Context> BorrowDecode<'de, Context> for Cell<T>
624where
625    T: BorrowDecode<'de, Context>,
626{
627    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
628        decoder: &mut D
629    ) -> Result<Self, DecodeError> {
630        let t = T::borrow_decode(decoder)?;
631        Ok(Self::new(t))
632    }
633}
634
635impl<Context, T> Decode<Context> for RefCell<T>
636where
637    T: Decode<Context>,
638{
639    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
640        let t = T::decode(decoder)?;
641        Ok(Self::new(t))
642    }
643}
644
645impl<'de, T, Context> BorrowDecode<'de, Context> for RefCell<T>
646where
647    T: BorrowDecode<'de, Context>,
648{
649    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
650        decoder: &mut D
651    ) -> Result<Self, DecodeError> {
652        let t = T::borrow_decode(decoder)?;
653        Ok(Self::new(t))
654    }
655}
656
657impl<Context> Decode<Context> for Duration {
658    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
659        const NANOS_PER_SEC: u64 = 1_000_000_000;
660        let secs: u64 = Decode::decode(decoder)?;
661        let nanos: u32 = Decode::decode(decoder)?;
662        if secs.checked_add(u64::from(nanos) / NANOS_PER_SEC).is_none() {
663            return crate::error::cold_decode_error_invalid_duration(secs, nanos);
664        }
665        Ok(Self::new(secs, nanos))
666    }
667}
668impl_borrow_decode!(Duration);
669
670impl<Context, T> Decode<Context> for Range<T>
671where
672    T: Decode<Context>,
673{
674    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
675        let min = T::decode(decoder)?;
676        let max = T::decode(decoder)?;
677        Ok(min..max)
678    }
679}
680impl<'de, T, Context> BorrowDecode<'de, Context> for Range<T>
681where
682    T: BorrowDecode<'de, Context>,
683{
684    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
685        decoder: &mut D
686    ) -> Result<Self, DecodeError> {
687        let min = T::borrow_decode(decoder)?;
688        let max = T::borrow_decode(decoder)?;
689        Ok(min..max)
690    }
691}
692
693impl<Context, T> Decode<Context> for RangeInclusive<T>
694where
695    T: Decode<Context>,
696{
697    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
698        let min = T::decode(decoder)?;
699        let max = T::decode(decoder)?;
700        Ok(Self::new(min, max))
701    }
702}
703
704impl<'de, T, Context> BorrowDecode<'de, Context> for RangeInclusive<T>
705where
706    T: BorrowDecode<'de, Context>,
707{
708    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
709        decoder: &mut D
710    ) -> Result<Self, DecodeError> {
711        let min = T::borrow_decode(decoder)?;
712        let max = T::borrow_decode(decoder)?;
713        Ok(Self::new(min, max))
714    }
715}
716
717impl<T, Context> Decode<Context> for Bound<T>
718where
719    T: Decode<Context>,
720{
721    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
722        match u32::decode(decoder)? {
723            | 0 => Ok(Self::Unbounded),
724            | 1 => Ok(Self::Included(T::decode(decoder)?)),
725            | 2 => Ok(Self::Excluded(T::decode(decoder)?)),
726            | x => {
727                crate::error::cold_decode_error_unexpected_variant(
728                    core::any::type_name::<Self>(),
729                    &crate::error::AllowedEnumVariants::Range { max: 2, min: 0 },
730                    x,
731                )
732            },
733        }
734    }
735}
736
737impl<'de, T, Context> BorrowDecode<'de, Context> for Bound<T>
738where
739    T: BorrowDecode<'de, Context>,
740{
741    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
742        decoder: &mut D
743    ) -> Result<Self, DecodeError> {
744        match u32::decode(decoder)? {
745            | 0 => Ok(Self::Unbounded),
746            | 1 => Ok(Self::Included(T::borrow_decode(decoder)?)),
747            | 2 => Ok(Self::Excluded(T::borrow_decode(decoder)?)),
748            | x => {
749                crate::error::cold_decode_error_unexpected_variant(
750                    core::any::type_name::<Self>(),
751                    &crate::error::AllowedEnumVariants::Range { max: 2, min: 0 },
752                    x,
753                )
754            },
755        }
756    }
757}
758
759const UTF8_CHAR_WIDTH: [u8; 256] = [
760    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,
761    1, // 0x1F
762    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,
763    1, // 0x3F
764    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,
765    1, // 0x5F
766    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,
767    1, // 0x7F
768    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,
769    0, // 0x9F
770    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,
771    0, // 0xBF
772    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,
773    2, // 0xDF
774    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 0xEF
775    4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0xFF
776];
777
778// This function is a copy of core::str::utf8_char_width
779const fn utf8_char_width(b: u8) -> usize {
780    UTF8_CHAR_WIDTH[b as usize] as usize
781}