musli_core/impls/
range.rs1use 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);