rkyv_test/impls/alloc/
vec.rs1use 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}