1use crate::{
2 boxed::{ArchivedBox, BoxResolver},
3 collections::util::Entry,
4 niche::option_box::{ArchivedOptionBox, OptionBoxResolver},
5 ser::{ScratchSpace, Serializer},
6 string::{ArchivedString, StringResolver},
7 vec::{ArchivedVec, RawArchivedVec, VecResolver},
8 with::{
9 ArchiveWith, AsOwned, AsVec, CopyOptimize, DeserializeWith, Map, Niche, Raw, RefAsBox,
10 SerializeWith, With,
11 },
12 Archive, ArchiveUnsized, ArchivedMetadata, Deserialize, DeserializeUnsized, Fallible,
13 MetadataResolver, Serialize, SerializeUnsized,
14};
15use ::core::marker::PhantomData;
16#[cfg(not(feature = "std"))]
17use alloc::{
18 borrow::Cow,
19 boxed::Box,
20 collections::{BTreeMap, BTreeSet},
21 vec::Vec,
22};
23#[cfg(feature = "std")]
24use std::{
25 borrow::Cow,
26 boxed::Box,
27 collections::{BTreeMap, BTreeSet},
28};
29
30impl<A, O> ArchiveWith<Vec<O>> for Map<A>
33where
34 A: ArchiveWith<O>,
35{
36 type Archived = ArchivedVec<<A as ArchiveWith<O>>::Archived>;
37 type Resolver = VecResolver;
38
39 unsafe fn resolve_with(
40 field: &Vec<O>,
41 pos: usize,
42 resolver: Self::Resolver,
43 out: *mut Self::Archived,
44 ) {
45 ArchivedVec::resolve_from_len(field.len(), pos, resolver, out)
46 }
47}
48
49impl<A, O, S> SerializeWith<Vec<O>, S> for Map<A>
50where
51 S: Fallible + ScratchSpace + Serializer,
52 A: ArchiveWith<O> + SerializeWith<O, S>,
53{
54 fn serialize_with(field: &Vec<O>, s: &mut S) -> Result<Self::Resolver, S::Error> {
55 struct RefWrapper<'o, A, O>(&'o O, PhantomData<A>);
58
59 impl<A: ArchiveWith<O>, O> Archive for RefWrapper<'_, A, O> {
60 type Archived = <A as ArchiveWith<O>>::Archived;
61 type Resolver = <A as ArchiveWith<O>>::Resolver;
62
63 unsafe fn resolve(
64 &self,
65 pos: usize,
66 resolver: Self::Resolver,
67 out: *mut Self::Archived,
68 ) {
69 A::resolve_with(self.0, pos, resolver, out)
70 }
71 }
72
73 impl<A, O, S> Serialize<S> for RefWrapper<'_, A, O>
74 where
75 A: ArchiveWith<O> + SerializeWith<O, S>,
76 S: Fallible + Serializer,
77 {
78 fn serialize(&self, s: &mut S) -> Result<Self::Resolver, S::Error> {
79 A::serialize_with(self.0, s)
80 }
81 }
82
83 let iter = field
84 .iter()
85 .map(|value| RefWrapper::<'_, A, O>(value, PhantomData));
86
87 ArchivedVec::serialize_from_iter(iter, s)
88 }
89}
90
91impl<A, O, D> DeserializeWith<ArchivedVec<<A as ArchiveWith<O>>::Archived>, Vec<O>, D> for Map<A>
92where
93 A: ArchiveWith<O> + DeserializeWith<<A as ArchiveWith<O>>::Archived, O, D>,
94 D: Fallible,
95{
96 fn deserialize_with(
97 field: &ArchivedVec<<A as ArchiveWith<O>>::Archived>,
98 d: &mut D,
99 ) -> Result<Vec<O>, D::Error> {
100 field
101 .iter()
102 .map(|value| <A as DeserializeWith<_, _, D>>::deserialize_with(value, d))
103 .collect()
104 }
105}
106
107impl<'a, F: Archive + Clone> ArchiveWith<Cow<'a, F>> for AsOwned {
110 type Archived = F::Archived;
111 type Resolver = F::Resolver;
112
113 #[inline]
114 unsafe fn resolve_with(
115 field: &Cow<'a, F>,
116 pos: usize,
117 resolver: Self::Resolver,
118 out: *mut Self::Archived,
119 ) {
120 field.resolve(pos, resolver, out);
121 }
122}
123
124impl<'a, F: Serialize<S> + Clone, S: Fallible + ?Sized> SerializeWith<Cow<'a, F>, S> for AsOwned {
125 #[inline]
126 fn serialize_with(field: &Cow<'a, F>, serializer: &mut S) -> Result<Self::Resolver, S::Error> {
127 field.serialize(serializer)
128 }
129}
130
131impl<'a, T: Archive + Clone, D: Fallible + ?Sized> DeserializeWith<T::Archived, T, D> for AsOwned
132where
133 T::Archived: Deserialize<T, D>,
134{
135 #[inline]
136 fn deserialize_with(field: &T::Archived, deserializer: &mut D) -> Result<T, D::Error> {
137 field.deserialize(deserializer)
138 }
139}
140
141impl<'a, T: Archive + Clone> ArchiveWith<Cow<'a, [T]>> for AsOwned {
142 type Archived = ArchivedVec<T::Archived>;
143 type Resolver = VecResolver;
144
145 #[inline]
146 unsafe fn resolve_with(
147 field: &Cow<'a, [T]>,
148 pos: usize,
149 resolver: Self::Resolver,
150 out: *mut Self::Archived,
151 ) {
152 ArchivedVec::resolve_from_slice(field, pos, resolver, out);
153 }
154}
155
156impl<'a, T: Serialize<S> + Clone, S: ScratchSpace + Serializer + ?Sized>
157 SerializeWith<Cow<'a, [T]>, S> for AsOwned
158{
159 #[inline]
160 fn serialize_with(
161 field: &Cow<'a, [T]>,
162 serializer: &mut S,
163 ) -> Result<Self::Resolver, S::Error> {
164 ArchivedVec::serialize_from_slice(field, serializer)
165 }
166}
167
168impl<'a, T, D> DeserializeWith<ArchivedVec<T::Archived>, Cow<'a, [T]>, D> for AsOwned
169where
170 T: Archive + Clone,
171 T::Archived: Deserialize<T, D>,
172 D: Fallible + ?Sized,
173{
174 #[inline]
175 fn deserialize_with(
176 field: &ArchivedVec<T::Archived>,
177 deserializer: &mut D,
178 ) -> Result<Cow<'a, [T]>, D::Error> {
179 Ok(Cow::Owned(field.deserialize(deserializer)?))
180 }
181}
182
183impl<'a> ArchiveWith<Cow<'a, str>> for AsOwned {
184 type Archived = ArchivedString;
185 type Resolver = StringResolver;
186
187 #[inline]
188 unsafe fn resolve_with(
189 field: &Cow<'a, str>,
190 pos: usize,
191 resolver: Self::Resolver,
192 out: *mut Self::Archived,
193 ) {
194 ArchivedString::resolve_from_str(field, pos, resolver, out);
195 }
196}
197
198impl<'a, S: Serializer + ?Sized> SerializeWith<Cow<'a, str>, S> for AsOwned {
199 #[inline]
200 fn serialize_with(
201 field: &Cow<'a, str>,
202 serializer: &mut S,
203 ) -> Result<Self::Resolver, S::Error> {
204 ArchivedString::serialize_from_str(field, serializer)
205 }
206}
207
208impl<'a, D: Fallible + ?Sized> DeserializeWith<ArchivedString, Cow<'a, str>, D> for AsOwned {
209 #[inline]
210 fn deserialize_with(
211 field: &ArchivedString,
212 deserializer: &mut D,
213 ) -> Result<Cow<'a, str>, D::Error> {
214 Ok(Cow::Owned(field.deserialize(deserializer)?))
215 }
216}
217
218#[cfg(feature = "std")]
219const _: () = {
220 use crate::ffi::{ArchivedCString, CStringResolver};
221 use std::ffi::CStr;
222
223 impl<'a> ArchiveWith<Cow<'a, CStr>> for AsOwned {
224 type Archived = ArchivedCString;
225 type Resolver = CStringResolver;
226
227 #[inline]
228 unsafe fn resolve_with(
229 field: &Cow<'a, CStr>,
230 pos: usize,
231 resolver: Self::Resolver,
232 out: *mut Self::Archived,
233 ) {
234 ArchivedCString::resolve_from_c_str(field, pos, resolver, out);
235 }
236 }
237
238 impl<'a, S: Serializer + ?Sized> SerializeWith<Cow<'a, CStr>, S> for AsOwned {
239 #[inline]
240 fn serialize_with(
241 field: &Cow<'a, CStr>,
242 serializer: &mut S,
243 ) -> Result<Self::Resolver, S::Error> {
244 ArchivedCString::serialize_from_c_str(field, serializer)
245 }
246 }
247
248 impl<'a, D: Fallible + ?Sized> DeserializeWith<ArchivedCString, Cow<'a, CStr>, D> for AsOwned {
249 #[inline]
250 fn deserialize_with(
251 field: &ArchivedCString,
252 deserializer: &mut D,
253 ) -> Result<Cow<'a, CStr>, D::Error> {
254 Ok(Cow::Owned(field.deserialize(deserializer)?))
255 }
256 }
257};
258
259impl<K: Archive, V: Archive> ArchiveWith<BTreeMap<K, V>> for AsVec {
262 type Archived = ArchivedVec<Entry<K::Archived, V::Archived>>;
263 type Resolver = VecResolver;
264
265 unsafe fn resolve_with(
266 field: &BTreeMap<K, V>,
267 pos: usize,
268 resolver: Self::Resolver,
269 out: *mut Self::Archived,
270 ) {
271 ArchivedVec::resolve_from_len(field.len(), pos, resolver, out);
272 }
273}
274
275impl<K, V, S> SerializeWith<BTreeMap<K, V>, S> for AsVec
276where
277 K: Serialize<S>,
278 V: Serialize<S>,
279 S: ScratchSpace + Serializer + ?Sized,
280{
281 fn serialize_with(
282 field: &BTreeMap<K, V>,
283 serializer: &mut S,
284 ) -> Result<Self::Resolver, S::Error> {
285 ArchivedVec::serialize_from_iter(
286 field.iter().map(|(key, value)| Entry { key, value }),
287 serializer,
288 )
289 }
290}
291
292impl<K, V, D> DeserializeWith<ArchivedVec<Entry<K::Archived, V::Archived>>, BTreeMap<K, V>, D>
293 for AsVec
294where
295 K: Archive + Ord,
296 V: Archive,
297 K::Archived: Deserialize<K, D>,
298 V::Archived: Deserialize<V, D>,
299 D: Fallible + ?Sized,
300{
301 fn deserialize_with(
302 field: &ArchivedVec<Entry<K::Archived, V::Archived>>,
303 deserializer: &mut D,
304 ) -> Result<BTreeMap<K, V>, D::Error> {
305 let mut result = BTreeMap::new();
306 for entry in field.iter() {
307 result.insert(
308 entry.key.deserialize(deserializer)?,
309 entry.value.deserialize(deserializer)?,
310 );
311 }
312 Ok(result)
313 }
314}
315
316impl<T: Archive> ArchiveWith<BTreeSet<T>> for AsVec {
317 type Archived = ArchivedVec<T::Archived>;
318 type Resolver = VecResolver;
319
320 unsafe fn resolve_with(
321 field: &BTreeSet<T>,
322 pos: usize,
323 resolver: Self::Resolver,
324 out: *mut Self::Archived,
325 ) {
326 ArchivedVec::resolve_from_len(field.len(), pos, resolver, out);
327 }
328}
329
330impl<T, S> SerializeWith<BTreeSet<T>, S> for AsVec
331where
332 T: Serialize<S>,
333 S: ScratchSpace + Serializer + ?Sized,
334{
335 fn serialize_with(field: &BTreeSet<T>, serializer: &mut S) -> Result<Self::Resolver, S::Error> {
336 ArchivedVec::<T::Archived>::serialize_from_iter::<T, _, _, _>(field.iter(), serializer)
337 }
338}
339
340impl<T, D> DeserializeWith<ArchivedVec<T::Archived>, BTreeSet<T>, D> for AsVec
341where
342 T: Archive + Ord,
343 T::Archived: Deserialize<T, D>,
344 D: Fallible + ?Sized,
345{
346 fn deserialize_with(
347 field: &ArchivedVec<T::Archived>,
348 deserializer: &mut D,
349 ) -> Result<BTreeSet<T>, D::Error> {
350 let mut result = BTreeSet::new();
351 for key in field.iter() {
352 result.insert(key.deserialize(deserializer)?);
353 }
354 Ok(result)
355 }
356}
357
358impl<T: ArchiveUnsized + ?Sized> ArchiveWith<Option<Box<T>>> for Niche
361where
362 ArchivedMetadata<T>: Default,
363{
364 type Archived = ArchivedOptionBox<T::Archived>;
365 type Resolver = OptionBoxResolver<T::MetadataResolver>;
366
367 unsafe fn resolve_with(
368 field: &Option<Box<T>>,
369 pos: usize,
370 resolver: Self::Resolver,
371 out: *mut Self::Archived,
372 ) {
373 ArchivedOptionBox::resolve_from_option(field.as_deref(), pos, resolver, out);
374 }
375}
376
377impl<T, S> SerializeWith<Option<Box<T>>, S> for Niche
378where
379 T: SerializeUnsized<S> + ?Sized,
380 S: Serializer + ?Sized,
381 ArchivedMetadata<T>: Default,
382{
383 fn serialize_with(
384 field: &Option<Box<T>>,
385 serializer: &mut S,
386 ) -> Result<Self::Resolver, S::Error> {
387 ArchivedOptionBox::serialize_from_option(field.as_deref(), serializer)
388 }
389}
390
391impl<T, D> DeserializeWith<ArchivedOptionBox<T::Archived>, Option<Box<T>>, D> for Niche
392where
393 T: ArchiveUnsized + ?Sized,
394 T::Archived: DeserializeUnsized<T, D>,
395 D: Fallible + ?Sized,
396{
397 fn deserialize_with(
398 field: &ArchivedOptionBox<T::Archived>,
399 deserializer: &mut D,
400 ) -> Result<Option<Box<T>>, D::Error> {
401 if let Some(value) = field.as_ref() {
402 Ok(Some(value.deserialize(deserializer)?))
403 } else {
404 Ok(None)
405 }
406 }
407}
408
409impl<T: Archive> ArchiveWith<Vec<T>> for CopyOptimize {
412 type Archived = ArchivedVec<T::Archived>;
413 type Resolver = VecResolver;
414
415 unsafe fn resolve_with(
416 field: &Vec<T>,
417 pos: usize,
418 resolver: Self::Resolver,
419 out: *mut Self::Archived,
420 ) {
421 ArchivedVec::resolve_from_len(field.len(), pos, resolver, out);
422 }
423}
424
425impl<T, S> SerializeWith<Vec<T>, S> for CopyOptimize
426where
427 T: Serialize<S>,
428 S: Serializer,
429{
430 fn serialize_with(field: &Vec<T>, serializer: &mut S) -> Result<Self::Resolver, S::Error> {
431 use ::core::mem::size_of;
432
433 debug_assert_eq!(size_of::<T>(), size_of::<T::Archived>());
435
436 unsafe { ArchivedVec::serialize_copy_from_slice(field.as_slice(), serializer) }
437 }
438}
439
440impl<T, D> DeserializeWith<ArchivedVec<T::Archived>, Vec<T>, D> for CopyOptimize
441where
442 T: Archive,
443 T::Archived: Deserialize<T, D>,
444 D: Fallible + ?Sized,
445{
446 fn deserialize_with(field: &ArchivedVec<T::Archived>, _: &mut D) -> Result<Vec<T>, D::Error> {
447 use ::core::{mem::size_of, ptr::copy_nonoverlapping};
448
449 debug_assert_eq!(size_of::<T>(), size_of::<T::Archived>());
451
452 let mut result = Vec::with_capacity(field.len());
453 unsafe {
454 copy_nonoverlapping(field.as_ptr().cast(), result.as_mut_ptr(), field.len());
455 result.set_len(field.len());
456 }
457
458 Ok(result)
459 }
460}
461
462impl<T: Archive> ArchiveWith<Box<[T]>> for CopyOptimize {
463 type Archived = ArchivedBox<[T::Archived]>;
464 type Resolver = BoxResolver<MetadataResolver<[T]>>;
465
466 unsafe fn resolve_with(
467 field: &Box<[T]>,
468 pos: usize,
469 resolver: Self::Resolver,
470 out: *mut Self::Archived,
471 ) {
472 ArchivedBox::resolve_from_ref(&**field, pos, resolver, out);
473 }
474}
475
476impl<T, S> SerializeWith<Box<[T]>, S> for CopyOptimize
477where
478 T: Serialize<S>,
479 S: Serializer,
480{
481 fn serialize_with(field: &Box<[T]>, serializer: &mut S) -> Result<Self::Resolver, S::Error> {
482 use ::core::mem::size_of;
483
484 debug_assert_eq!(size_of::<T>(), size_of::<T::Archived>());
486
487 unsafe { ArchivedBox::<[T::Archived]>::serialize_copy_from_slice(&**field, serializer) }
488 }
489}
490
491impl<T, D> DeserializeWith<ArchivedBox<[T::Archived]>, Box<[T]>, D> for CopyOptimize
492where
493 T: Archive,
494 T::Archived: Deserialize<T, D>,
495 D: Fallible + ?Sized,
496{
497 fn deserialize_with(
498 field: &ArchivedBox<[T::Archived]>,
499 _: &mut D,
500 ) -> Result<Box<[T]>, D::Error> {
501 use ::core::{mem::size_of, ptr::copy_nonoverlapping};
502
503 debug_assert_eq!(size_of::<T>(), size_of::<T::Archived>());
505
506 let mut result = Vec::with_capacity(field.len());
507 unsafe {
508 copy_nonoverlapping(field.as_ptr().cast(), result.as_mut_ptr(), field.len());
509 result.set_len(field.len());
510 }
511
512 Ok(result.into_boxed_slice())
513 }
514}
515
516impl<'a, T: Archive> ArchiveWith<With<&'a [T], RefAsBox>> for CopyOptimize {
517 type Archived = ArchivedBox<[T::Archived]>;
518 type Resolver = BoxResolver<MetadataResolver<[T]>>;
519
520 unsafe fn resolve_with(
521 field: &With<&'a [T], RefAsBox>,
522 pos: usize,
523 resolver: Self::Resolver,
524 out: *mut Self::Archived,
525 ) {
526 ArchivedBox::resolve_from_ref(*field.as_ref(), pos, resolver, out);
527 }
528}
529
530impl<'a, T, S> SerializeWith<With<&'a [T], RefAsBox>, S> for CopyOptimize
531where
532 T: Serialize<S>,
533 S: Serializer,
534{
535 fn serialize_with(
536 field: &With<&'a [T], RefAsBox>,
537 serializer: &mut S,
538 ) -> Result<Self::Resolver, S::Error> {
539 use ::core::mem::size_of;
540
541 debug_assert_eq!(size_of::<T>(), size_of::<T::Archived>());
543
544 unsafe {
545 ArchivedBox::<[T::Archived]>::serialize_copy_from_slice(*field.as_ref(), serializer)
546 }
547 }
548}
549
550impl<T: Archive> ArchiveWith<Vec<T>> for Raw {
553 type Archived = RawArchivedVec<T::Archived>;
554 type Resolver = VecResolver;
555
556 unsafe fn resolve_with(
557 field: &Vec<T>,
558 pos: usize,
559 resolver: Self::Resolver,
560 out: *mut Self::Archived,
561 ) {
562 RawArchivedVec::resolve_from_slice(field.as_slice(), pos, resolver, out);
563 }
564}
565
566impl<T, S> SerializeWith<Vec<T>, S> for Raw
567where
568 T: Serialize<S>,
569 S: Serializer,
570{
571 fn serialize_with(field: &Vec<T>, serializer: &mut S) -> Result<Self::Resolver, S::Error> {
572 use ::core::mem::size_of;
573
574 debug_assert_eq!(size_of::<T>(), size_of::<T::Archived>());
576
577 unsafe { ArchivedVec::serialize_copy_from_slice(field.as_slice(), serializer) }
578 }
579}
580
581impl<T, D> DeserializeWith<RawArchivedVec<T::Archived>, Vec<T>, D> for Raw
582where
583 T: Archive,
584 T::Archived: Deserialize<T, D>,
585 D: Fallible + ?Sized,
586{
587 fn deserialize_with(
588 field: &RawArchivedVec<T::Archived>,
589 _: &mut D,
590 ) -> Result<Vec<T>, D::Error> {
591 use ::core::{mem::size_of, ptr::copy_nonoverlapping};
592
593 debug_assert_eq!(size_of::<T>(), size_of::<T::Archived>());
595
596 let mut result = Vec::with_capacity(field.len());
597 unsafe {
598 copy_nonoverlapping(field.as_ptr().cast(), result.as_mut_ptr(), field.len());
599 result.set_len(field.len());
600 }
601
602 Ok(result)
603 }
604}