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