smallvec 2.0.0-beta.4

'Small vector' optimization: store up to a small number of items on the stack
Documentation
use {
    super::{
        SmallVec,
        allocator::{
            Allocator,
            global::Global
        }
    },
    rkyv::{
        Archive,
        Archived,
        Deserialize as RkyvDeserialize,
        Place,
        Serialize as RkyvSerialize,
        rancor::Fallible,
        ser::{
            Allocator as RkyvAllocator,
            Writer
        },
        vec::{
            ArchivedVec,
            VecResolver
        }
    }
};

impl<Item: Archive, const INLINE: usize, Heap: Allocator> Archive for SmallVec<Item, INLINE, Heap> {
    type Archived = ArchivedVec<Archived<Item>>;
    type Resolver = VecResolver;

    fn resolve(&self, resolver: Self::Resolver, out: Place<Self::Archived>) {
        ArchivedVec::resolve_from_slice(self, resolver, out);
    }
}

impl<Item, S, const INLINE: usize, Heap: Allocator> RkyvSerialize<S>
    for SmallVec<Item, INLINE, Heap>
where
    Item: RkyvSerialize<S>,
    S: Fallible + RkyvAllocator + Writer + ?Sized
{
    fn serialize(&self, serializer: &mut S) -> Result<Self::Resolver, S::Error> {
        ArchivedVec::serialize_from_slice(self, serializer)
    }
}

impl<Item, D, const INLINE: usize> RkyvDeserialize<SmallVec<Item, INLINE, Global>, D>
    for ArchivedVec<Archived<Item>>
where
    Item: Archive,
    Archived<Item>: RkyvDeserialize<Item, D>,
    D: Fallible + ?Sized
{
    fn deserialize(
        &self,
        deserializer: &mut D
    ) -> Result<SmallVec<Item, INLINE, Global>, D::Error> {
        let mut result = SmallVec::<Item, INLINE, Global>::with_capacity(self.len());
        for item in self.as_slice() {
            result.push(item.deserialize(deserializer)?);
        }
        Ok(result)
    }
}