Skip to main content

deser_core/foreign_impls/
smallvec.rs

1//! `SmallVec` of `smallvec`.
2//!
3//! It's serialized like `Vec`: `SmallVec<[u8; N]>` as bytes, everything
4//! else as sequence.  The impls are for arrays as backing store
5//! (`SmallVec<[T; N]>`) which requires the `const_generics` feature of
6//! `smallvec`.
7use ::smallvec::SmallVec;
8use alloc::borrow::Cow;
9use alloc::vec::Vec;
10
11use crate::State;
12use crate::adapters::bytes::{BytesBufImpl, encoding_adapter};
13use crate::de::impls::{SeqTarget, collection_methods, seq_expecting, seq_sink};
14use crate::de::update::Collection;
15use crate::de::{Deserialize, SinkHandle};
16use crate::error::Error;
17use crate::ser::Serialize;
18use crate::ser::impls::serialize_slice;
19
20serialize_slice! {
21    [T: Sync, A: Serialize<T>, const N: usize] SmallVec<[T; N]> => SmallVec<[A; N]>, A;
22}
23
24impl<T: Send, const N: usize> SeqTarget<T> for SmallVec<[T; N]> {
25    const NAME: &'static str = "SmallVec";
26
27    #[inline]
28    fn from_vec(vec: Vec<T>) -> Result<Self, Error> {
29        Ok(SmallVec::from_vec(vec))
30    }
31}
32
33impl<'de, T: Send, A: Deserialize<'de, T>, const N: usize> Deserialize<'de, SmallVec<[T; N]>>
34    for SmallVec<[A; N]>
35{
36    fn deserialize_into<'out>(
37        out: &'out mut Option<SmallVec<[T; N]>>,
38        state: &mut State,
39    ) -> SinkHandle<'out, 'de> {
40        seq_sink::<SmallVec<[T; N]>, T, A>(out, state)
41    }
42
43    fn expecting() -> Cow<'static, str> {
44        seq_expecting::<SmallVec<[T; N]>, T, A>()
45    }
46
47    collection_methods!(SmallVec<[T; N]>);
48}
49
50impl<T: Send, const N: usize> Collection<T> for SmallVec<[T; N]> {
51    fn empty() -> Self {
52        SmallVec::new()
53    }
54
55    fn add(&mut self, value: T) -> Result<(), Error> {
56        self.push(value);
57        Ok(())
58    }
59}
60
61impl<const N: usize> BytesBufImpl for SmallVec<[u8; N]> {
62    #[inline]
63    fn bytes(&self) -> &[u8] {
64        self
65    }
66
67    #[inline]
68    fn from_vec(bytes: Vec<u8>) -> Result<Self, Error> {
69        Ok(SmallVec::from_vec(bytes))
70    }
71
72    #[inline]
73    fn deserialize_into<'a, 'de>(
74        out: &'a mut Option<Self>,
75        state: &mut State,
76    ) -> SinkHandle<'a, 'de> {
77        <Self as Deserialize<'de>>::deserialize_into(out, state)
78    }
79
80    fn expecting() -> Cow<'static, str> {
81        <Self as Deserialize<'static>>::expecting()
82    }
83}
84
85encoding_adapter!(
86    [const N: usize,] SmallVec<[u8; N]>,
87);