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::vec::Vec;
9
10use crate::State;
11use crate::adapters::bytes::{BytesBufImpl, encoding_adapter};
12use crate::adapters::ser_impls::serialize_as_slice;
13use crate::adapters::{DeserializeAs, Same, SerializeAs};
14use crate::de::impls::{SeqTarget, collection_methods, collection_methods_as, seq_sink};
15use crate::de::update::Collection;
16use crate::de::{Deserialize, SinkHandle};
17use crate::error::Error;
18use crate::ser::Serialize;
19use crate::ser::impls::serialize_slice;
20
21serialize_slice!(
22    [T: Serialize, const N: usize] SmallVec<[T; N]>,
23);
24
25serialize_as_slice! {
26    [T: Sync, A: SerializeAs<T>, const N: usize] SmallVec<[T; N]> => SmallVec<[A; N]>;
27}
28
29impl<T: Send, const N: usize> SeqTarget<T> for SmallVec<[T; N]> {
30    const NAME: &'static str = "SmallVec";
31
32    #[inline]
33    fn from_vec(vec: Vec<T>) -> Result<Self, Error> {
34        Ok(SmallVec::from_vec(vec))
35    }
36}
37
38impl<'de, T: Deserialize<'de>, const N: usize> Deserialize<'de> for SmallVec<[T; N]> {
39    #[inline]
40    fn deserialize_into<'out>(
41        out: &'out mut Option<Self>,
42        state: &mut State,
43    ) -> SinkHandle<'out, 'de> {
44        seq_sink::<Self, T, Same>(out, state)
45    }
46
47    collection_methods!(Same);
48}
49
50impl<'de, T: Send, A: DeserializeAs<'de, T>, const N: usize> DeserializeAs<'de, SmallVec<[T; N]>>
51    for SmallVec<[A; N]>
52{
53    fn deserialize_into_as<'out>(
54        out: &'out mut Option<SmallVec<[T; N]>>,
55        state: &mut State,
56    ) -> SinkHandle<'out, 'de> {
57        seq_sink::<SmallVec<[T; N]>, T, A>(out, state)
58    }
59
60    collection_methods_as!(SmallVec<[T; N]>);
61}
62
63impl<T: Send, const N: usize> Collection<T> for SmallVec<[T; N]> {
64    fn empty() -> Self {
65        SmallVec::new()
66    }
67
68    fn add(&mut self, value: T) -> Result<(), Error> {
69        self.push(value);
70        Ok(())
71    }
72}
73
74impl<const N: usize> BytesBufImpl for SmallVec<[u8; N]> {
75    #[inline]
76    fn bytes(&self) -> &[u8] {
77        self
78    }
79
80    #[inline]
81    fn from_vec(bytes: Vec<u8>) -> Result<Self, Error> {
82        Ok(SmallVec::from_vec(bytes))
83    }
84
85    #[inline]
86    fn deserialize_into<'a, 'de>(
87        out: &'a mut Option<Self>,
88        state: &mut State,
89    ) -> SinkHandle<'a, 'de> {
90        Deserialize::deserialize_into(out, state)
91    }
92}
93
94encoding_adapter!(
95    [const N: usize,] SmallVec<[u8; N]>,
96);