1use alloc::vec::Vec;
2
3use crate::{
4 buffer::Buffer,
5 bytes::Bytes,
6 deserialize::{Deserialize, DeserializeError, Deserializer},
7 formula::{reference_size, Formula},
8 iter::{deserialize_extend_iter, owned_iter_fast_sizes, ref_iter_fast_sizes},
9 reference::Ref,
10 serialize::{write_bytes, write_ref, write_reference, write_slice, Serialize, Sizes},
11};
12
13impl<F> Formula for Vec<F>
14where
15 F: Formula,
16{
17 const MAX_STACK_SIZE: Option<usize> = <Ref<[F]> as Formula>::MAX_STACK_SIZE;
18 const EXACT_SIZE: bool = <Ref<[F]> as Formula>::EXACT_SIZE;
19 const HEAPLESS: bool = <Ref<[F]> as Formula>::HEAPLESS;
20}
21
22impl<F, T> Serialize<Vec<F>> for T
23where
24 F: Formula,
25 T: Serialize<[F]>,
26{
27 #[inline(always)]
28 fn serialize<B>(self, sizes: &mut Sizes, mut buffer: B) -> Result<(), B::Error>
29 where
30 B: Buffer,
31 {
32 let size = write_ref::<[F], T, _>(self, sizes, buffer.reborrow())?;
33 write_reference::<[F], B>(size, sizes.heap, sizes.heap, sizes.stack, buffer)?;
34 sizes.stack += reference_size::<[F]>();
35 Ok(())
36 }
37
38 #[inline(always)]
39 fn size_hint(&self) -> Option<Sizes> {
40 let mut sizes = <Self as Serialize<[F]>>::size_hint(self)?;
41 sizes.to_heap(0);
42 sizes.add_stack(reference_size::<[F]>());
43 Some(sizes)
44 }
45}
46
47impl<'de, F, T> Deserialize<'de, Vec<F>> for T
48where
49 F: Formula,
50 T: Deserialize<'de, [F]>,
51{
52 #[inline(always)]
53 fn deserialize(de: Deserializer<'de>) -> Result<T, DeserializeError> {
54 let de = de.deref::<[F]>()?;
55 <T as Deserialize<[F]>>::deserialize(de)
56 }
57
58 #[inline(always)]
59 fn deserialize_in_place(&mut self, de: Deserializer<'de>) -> Result<(), DeserializeError> {
60 let de = de.deref::<[F]>()?;
61 <T as Deserialize<[F]>>::deserialize_in_place(self, de)
62 }
63}
64
65impl<F, T> Serialize<[F]> for Vec<T>
66where
67 F: Formula,
68 T: Serialize<F>,
69{
70 #[inline(always)]
71 fn serialize<B>(self, sizes: &mut Sizes, buffer: B) -> Result<(), B::Error>
72 where
73 B: Buffer,
74 {
75 write_slice(self.into_iter(), sizes, buffer)
76 }
77
78 #[inline(always)]
79 fn size_hint(&self) -> Option<Sizes> {
80 ref_iter_fast_sizes::<F, _, _>(self.iter())
81 }
82}
83
84impl<'ser, F, T> Serialize<[F]> for &'ser Vec<T>
85where
86 F: Formula,
87 &'ser T: Serialize<F>,
88{
89 #[inline(always)]
90 fn serialize<B>(self, sizes: &mut Sizes, buffer: B) -> Result<(), B::Error>
91 where
92 B: Buffer,
93 {
94 write_slice(self.iter(), sizes, buffer)
95 }
96
97 #[inline(always)]
98 fn size_hint(&self) -> Option<Sizes> {
99 owned_iter_fast_sizes::<F, _, _>(self.iter())
100 }
101}
102
103impl<'de, F, T> Deserialize<'de, [F]> for Vec<T>
104where
105 F: Formula,
106 T: Deserialize<'de, F>,
107{
108 #[inline(always)]
109 fn deserialize(de: Deserializer<'de>) -> Result<Self, DeserializeError> {
110 let iter = de.into_unsized_iter();
111 let (lower, _) = Iterator::size_hint(&iter);
112 let mut vec = Vec::with_capacity(lower);
113 deserialize_extend_iter(&mut vec, iter)?;
114 Ok(vec)
115 }
116
117 #[inline(always)]
118 fn deserialize_in_place(&mut self, de: Deserializer<'de>) -> Result<(), DeserializeError> {
119 self.clear();
120 let iter = de.into_unsized_iter();
121 let (lower, _) = Iterator::size_hint(&iter);
122 self.reserve(lower);
123 deserialize_extend_iter(self, iter)
124 }
125}
126
127impl<'de, F, T, const N: usize> Deserialize<'de, [F; N]> for Vec<T>
128where
129 F: Formula,
130 T: Deserialize<'de, F>,
131{
132 #[inline(always)]
133 fn deserialize(de: Deserializer<'de>) -> Result<Self, DeserializeError> {
134 let mut vec = Vec::with_capacity(N);
135 deserialize_extend_iter(&mut vec, de.into_unsized_array_iter(N))?;
136 Ok(vec)
137 }
138
139 #[inline(always)]
140 fn deserialize_in_place(&mut self, de: Deserializer<'de>) -> Result<(), DeserializeError> {
141 self.clear();
142 self.reserve(N);
143 deserialize_extend_iter(self, de.into_unsized_array_iter(N))
144 }
145}
146
147impl Serialize<Bytes> for Vec<u8> {
148 #[inline(always)]
149 fn serialize<B>(self, sizes: &mut Sizes, buffer: B) -> Result<(), B::Error>
150 where
151 B: Buffer,
152 {
153 write_bytes(self.as_slice(), sizes, buffer)
154 }
155
156 #[inline(always)]
157 fn size_hint(&self) -> Option<Sizes> {
158 Some(Sizes::with_stack(self.len()))
159 }
160}
161
162impl Serialize<Bytes> for &Vec<u8> {
163 #[inline(always)]
164 fn serialize<B>(self, sizes: &mut Sizes, buffer: B) -> Result<(), B::Error>
165 where
166 B: Buffer,
167 {
168 write_bytes(self.as_slice(), sizes, buffer)
169 }
170
171 #[inline(always)]
172 fn size_hint(&self) -> Option<Sizes> {
173 Some(Sizes::with_stack(self.len()))
174 }
175}
176
177impl<'de> Deserialize<'de, Bytes> for Vec<u8> {
178 #[inline(always)]
179 fn deserialize(de: Deserializer) -> Result<Self, DeserializeError> {
180 let mut vec = Vec::new();
181 vec.extend_from_slice(de.read_all_bytes());
182 Ok(vec)
183 }
184
185 #[inline(always)]
186 fn deserialize_in_place(&mut self, de: Deserializer) -> Result<(), DeserializeError> {
187 self.clear();
188 self.extend_from_slice(de.read_all_bytes());
189 Ok(())
190 }
191}