turbocow 0.3.0-beta.2

Compact, clone-on-write vectors, strings, maps and sets with inline + referenced storage — a superset of ecow.
Documentation
use core::fmt;
use core::marker::PhantomData;

use crate::allocator::AllocatorProvider;
use crate::vec::types::EcoVec;

impl<T, A> serde::Serialize for EcoVec<T, A>
where
    T: serde::Serialize,
    A: AllocatorProvider,
{
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        self.as_slice().serialize(serializer)
    }
}

struct EcoVecVisitor<T, A>(PhantomData<(T, A)>);

impl<'de, T, A> serde::de::Visitor<'de> for EcoVecVisitor<T, A>
where
    T: serde::Deserialize<'de> + Clone,
    A: AllocatorProvider + Default + Clone,
{
    type Value = EcoVec<T, A>;

    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
        formatter.write_str("a sequence")
    }

    fn visit_seq<Acc>(self, mut seq: Acc) -> Result<Self::Value, Acc::Error>
    where
        Acc: serde::de::SeqAccess<'de>,
    {
        let len = seq.size_hint().unwrap_or(0);
        let mut values = EcoVec::<T, A>::with_capacity_in(len, A::default());
        while let Some(value) = seq.next_element()? {
            values.push(value);
        }
        Ok(values)
    }
}

impl<'de, T, A> serde::Deserialize<'de> for EcoVec<T, A>
where
    T: serde::Deserialize<'de> + Clone,
    A: AllocatorProvider + Default + Clone,
{
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: serde::Deserializer<'de>,
    {
        deserializer.deserialize_seq(EcoVecVisitor(PhantomData))
    }
}