musli_core/internal/
macros.rs1macro_rules! __slice_sequence {
2 (
3 $(#[$($meta:meta)*])*
4 $cx:ident,
5 $ty:ident <T $(, $alloc:ident)?>,
6 || $new:expr,
7 |$vec:ident, $value:ident| $insert:expr,
8 |$reserve_vec:ident, $reserve_capacity:ident| $reserve:expr,
9 |$capacity:ident| $with_capacity:expr,
10 ) => {
11 $(#[$($meta)*])*
12 impl<M, T $(, $alloc)*> $crate::en::Encode<M> for $ty<T $(, $alloc)*>
13 where
14 T: $crate::en::Encode<M>,
15 $($alloc: Allocator,)*
16 {
17 const IS_BITWISE_ENCODE: bool = false;
18
19 type Encode = Self;
20
21 #[inline]
22 fn encode<E>(&self, encoder: E) -> Result<(), E::Error>
23 where
24 E: $crate::en::Encoder<Mode = M>,
25 {
26 encoder.encode_slice(self)
27 }
28
29 #[inline]
30 fn as_encode(&self) -> &Self::Encode {
31 self
32 }
33 }
34
35 $(#[$($meta)*])*
36 impl<'de, M, A, T> $crate::de::Decode<'de, M, A> for $ty<T $(, $alloc)*>
37 where
38 A: $crate::alloc::Allocator,
39 T: $crate::de::Decode<'de, M, A>,
40 {
41 const IS_BITWISE_DECODE: bool = false;
42
43 #[inline]
44 fn decode<D>(decoder: D) -> Result<Self, D::Error>
45 where
46 D: Decoder<'de, Mode = M, Allocator = A>,
47 {
48 struct Builder<'de, M, A, T>
49 where
50 $($alloc: $crate::alloc::Allocator,)*
51 {
52 vec: $ty<T $(, $alloc)*>,
53 _marker: core::marker::PhantomData<(M, A, &'de ())>
54 }
55
56 #[allow(unused_variables)]
57 impl<'de, M, A, T> $crate::de::DecodeSliceBuilder<T, A> for Builder<'de, M, A, T>
58 where
59 T: $crate::de::Decode<'de, M, A>,
60 A: $crate::alloc::Allocator,
61 {
62 #[inline]
63 fn new<C>($cx: C) -> Result<Self, C::Error>
64 where
65 C: $crate::Context<Allocator = A>,
66 {
67 Ok(Builder {
68 vec: $new,
69 _marker: core::marker::PhantomData
70 })
71 }
72
73 #[inline]
74 fn with_capacity<C>($cx: C, $capacity: usize) -> Result<Self, C::Error>
75 where
76 C: $crate::Context<Allocator = A>,
77 {
78 Ok(Builder {
79 vec: $with_capacity,
80 _marker: core::marker::PhantomData
81 })
82 }
83
84 #[inline]
85 fn push<C>(&mut self, $cx: C, $value: T) -> Result<(), C::Error>
86 where
87 C: $crate::Context<Allocator = A>,
88 {
89 let $vec = &mut self.vec;
90 $insert;
91 Ok(())
92 }
93
94 #[inline]
95 fn reserve<C>( &mut self, $cx: C, $reserve_capacity: usize) -> Result<(), C::Error>
96 where
97 C: $crate::Context<Allocator = A>,
98 {
99 let $reserve_vec = &mut self.vec;
100 $reserve;
101 Ok(())
102 }
103
104 #[inline]
105 unsafe fn set_len(&mut self, len: usize) {
106 unsafe {
107 self.vec.set_len(len);
108 }
109 }
110
111 #[inline]
112 fn as_mut_ptr(&mut self) -> *mut T {
113 self.vec.as_mut_ptr()
114 }
115 }
116
117 let Builder { vec, _marker: core::marker::PhantomData } = decoder.decode_slice()?;
118 Ok(vec)
119 }
120 }
121
122 $(#[$($meta)*])*
123 impl<M, T $(, $alloc)*> $crate::en::EncodePacked<M> for $ty<T $(, $alloc)*>
124 where
125 T: $crate::en::Encode<M>,
126 $($alloc: $crate::alloc::Allocator,)*
127 {
128 #[inline]
129 fn encode_packed<E>(&self, encoder: E) -> Result<(), E::Error>
130 where
131 E: $crate::en::Encoder<Mode = M>,
132 {
133 encoder.encode_pack_fn(|pack| {
134 $crate::en::SequenceEncoder::encode_slice(pack, self)
135 })
136 }
137 }
138 }
139}
140
141pub(crate) use __slice_sequence as slice_sequence;