musli_core/impls/
range.rs

1use core::ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo, RangeToInclusive};
2
3use crate::en::SequenceEncoder;
4use crate::{Allocator, Decode, Decoder, Encode, Encoder};
5
6macro_rules! implement {
7    ($ty:ident $(<$type:ident>)? { $($field:ident),* }, $count:expr) => {
8        impl<M, $($type)*> Encode<M> for $ty $(<$type>)*
9        where
10            $($type: Encode<M>,)*
11        {
12            const IS_BITWISE_ENCODE: bool = false;
13
14            #[inline]
15            #[allow(unused)]
16            fn encode<E>(&self, encoder: E) -> Result<(), E::Error>
17            where
18                E: Encoder<Mode = M>,
19            {
20                encoder.encode_sequence_fn($count, |tuple| {
21                    $(tuple.encode_next()?.encode(&self.$field)?;)*
22                    Ok(())
23                })
24            }
25
26            type Encode = Self;
27
28            #[inline]
29            fn as_encode(&self) -> &Self::Encode {
30                self
31            }
32        }
33
34        impl<'de, M, A, $($type)*> Decode<'de, M, A> for $ty $(<$type>)*
35        where
36            A: Allocator,
37            $($type: Decode<'de, M, A>,)*
38        {
39            const IS_BITWISE_DECODE: bool = false;
40
41            #[inline]
42            fn decode<D>(decoder: D) -> Result<Self, D::Error>
43            where
44                D: Decoder<'de, Mode = M, Allocator = A>,
45            {
46                let ($($field,)*) = decoder.decode()?;
47                Ok($ty { $($field,)* })
48            }
49        }
50    }
51}
52
53macro_rules! implement_new {
54    ($ty:ident { $($field:ident),* }, $count:expr) => {
55        impl<M, T> Encode<M> for $ty<T>
56        where
57            T: Encode<M>,
58        {
59            const IS_BITWISE_ENCODE: bool = false;
60
61            #[inline]
62            fn encode<E>(&self, encoder: E) -> Result<(), E::Error>
63            where
64                E: Encoder<Mode = M>,
65            {
66                encoder.encode_sequence_fn($count, |tuple| {
67                    $(tuple.encode_next()?.encode(self.$field())?;)*
68                    Ok(())
69                })
70            }
71
72            type Encode = Self;
73
74            #[inline]
75            fn as_encode(&self) -> &Self::Encode {
76                self
77            }
78        }
79
80        impl<'de, M, A, T> Decode<'de, M, A> for $ty<T>
81        where
82            A: Allocator,
83            T: Decode<'de, M, A>,
84        {
85            const IS_BITWISE_DECODE: bool = false;
86
87            #[inline]
88            fn decode<D>(decoder: D) -> Result<Self, D::Error>
89            where
90                D: Decoder<'de, Mode = M, Allocator = A>,
91            {
92                let ($($field,)*) = Decode::decode(decoder)?;
93                Ok($ty::new($($field,)*))
94            }
95        }
96    }
97}
98
99implement!(RangeFull {}, 0);
100implement!(Range<T> { start, end }, 2);
101implement!(RangeFrom<T> { start }, 1);
102implement!(RangeTo<T> { end }, 1);
103implement!(RangeToInclusive<T> { end }, 1);
104implement_new!(RangeInclusive { start, end }, 2);