rkyv_test/impls/alloc/
vec.rs

1use crate::{
2    ser::{ScratchSpace, Serializer},
3    vec::{ArchivedVec, VecResolver},
4    Archive, Deserialize, DeserializeUnsized, Fallible, Serialize,
5};
6#[cfg(not(feature = "std"))]
7use ::alloc::{alloc, boxed::Box, vec::Vec};
8use ::core::cmp;
9#[cfg(feature = "std")]
10use ::std::alloc;
11
12impl<T: PartialEq<U>, U> PartialEq<Vec<U>> for ArchivedVec<T> {
13    #[inline]
14    fn eq(&self, other: &Vec<U>) -> bool {
15        self.as_slice().eq(other.as_slice())
16    }
17}
18
19impl<T: PartialEq<U>, U> PartialEq<ArchivedVec<U>> for Vec<T> {
20    #[inline]
21    fn eq(&self, other: &ArchivedVec<U>) -> bool {
22        self.as_slice().eq(other.as_slice())
23    }
24}
25
26impl<T: PartialOrd> PartialOrd<Vec<T>> for ArchivedVec<T> {
27    #[inline]
28    fn partial_cmp(&self, other: &Vec<T>) -> Option<cmp::Ordering> {
29        self.as_slice().partial_cmp(other.as_slice())
30    }
31}
32
33impl<T: PartialOrd> PartialOrd<ArchivedVec<T>> for Vec<T> {
34    #[inline]
35    fn partial_cmp(&self, other: &ArchivedVec<T>) -> Option<cmp::Ordering> {
36        self.as_slice().partial_cmp(other.as_slice())
37    }
38}
39
40impl<T: Archive> Archive for Vec<T> {
41    type Archived = ArchivedVec<T::Archived>;
42    type Resolver = VecResolver;
43
44    #[inline]
45    unsafe fn resolve(&self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived) {
46        ArchivedVec::resolve_from_slice(self.as_slice(), pos, resolver, out);
47    }
48}
49
50impl<T: Serialize<S>, S: ScratchSpace + Serializer + ?Sized> Serialize<S> for Vec<T> {
51    #[inline]
52    fn serialize(&self, serializer: &mut S) -> Result<Self::Resolver, S::Error> {
53        ArchivedVec::<T::Archived>::serialize_from_slice(self.as_slice(), serializer)
54    }
55}
56
57impl<T: Archive, D: Fallible + ?Sized> Deserialize<Vec<T>, D> for ArchivedVec<T::Archived>
58where
59    [T::Archived]: DeserializeUnsized<[T], D>,
60{
61    #[inline]
62    fn deserialize(&self, deserializer: &mut D) -> Result<Vec<T>, D::Error> {
63        unsafe {
64            let data_address = self
65                .as_slice()
66                .deserialize_unsized(deserializer, |layout| alloc::alloc(layout))?;
67            let metadata = self.as_slice().deserialize_metadata(deserializer)?;
68            let ptr = ptr_meta::from_raw_parts_mut(data_address, metadata);
69            Ok(Box::<[T]>::from_raw(ptr).into())
70        }
71    }
72}