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 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 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.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 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.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, 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, 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, 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, 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, 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, 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, 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, ];
777
778const fn utf8_char_width(b: u8) -> usize {
780 UTF8_CHAR_WIDTH[b as usize] as usize
781}