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 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 decoder.claim_bytes_read(width)?;
315 if width == 1 {
316 return Ok(array[0] as Self);
317 }
318
319 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 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.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 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.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, 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, 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, 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, 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, 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, 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, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ];
789
790const fn utf8_char_width(b: u8) -> usize {
792 UTF8_CHAR_WIDTH[b as usize] as usize
793}