hashbrown/external_trait_impls/
serde.rs

1mod size_hint {
2    use core::cmp;
3
4    /// This presumably exists to prevent denial of service attacks.
5    ///
6    /// Original discussion: https://github.com/serde-rs/serde/issues/1114.
7    #[cfg_attr(feature = "inline-more", inline)]
8    pub(super) fn cautious(hint: Option<usize>) -> usize {
9        cmp::min(hint.unwrap_or(0), 4096)
10    }
11}
12
13mod map {
14    use crate::raw::Allocator;
15    use core::fmt;
16    use core::hash::{BuildHasher, Hash};
17    use core::marker::PhantomData;
18    use serde::de::{Deserialize, Deserializer, MapAccess, Visitor};
19    use serde::ser::{Serialize, Serializer};
20
21    use crate::hash_map::HashMap;
22
23    use super::size_hint;
24
25    impl<K, V, H, A> Serialize for HashMap<K, V, H, A>
26    where
27        K: Serialize + Eq + Hash,
28        V: Serialize,
29        H: BuildHasher,
30        A: Allocator,
31    {
32        #[cfg_attr(feature = "inline-more", inline)]
33        fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
34        where
35            S: Serializer,
36        {
37            serializer.collect_map(self)
38        }
39    }
40
41    impl<'de, K, V, S, A> Deserialize<'de> for HashMap<K, V, S, A>
42    where
43        K: Deserialize<'de> + Eq + Hash,
44        V: Deserialize<'de>,
45        S: BuildHasher + Default,
46        A: Allocator + Default,
47    {
48        fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
49        where
50            D: Deserializer<'de>,
51        {
52            struct MapVisitor<K, V, S, A>
53            where
54                A: Allocator,
55            {
56                marker: PhantomData<HashMap<K, V, S, A>>,
57            }
58
59            impl<'de, K, V, S, A> Visitor<'de> for MapVisitor<K, V, S, A>
60            where
61                K: Deserialize<'de> + Eq + Hash,
62                V: Deserialize<'de>,
63                S: BuildHasher + Default,
64                A: Allocator + Default,
65            {
66                type Value = HashMap<K, V, S, A>;
67
68                fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
69                    formatter.write_str("a map")
70                }
71
72                #[cfg_attr(feature = "inline-more", inline)]
73                fn visit_map<M>(self, mut map: M) -> Result<Self::Value, M::Error>
74                where
75                    M: MapAccess<'de>,
76                {
77                    let mut values = HashMap::with_capacity_and_hasher_in(
78                        size_hint::cautious(map.size_hint()),
79                        S::default(),
80                        A::default(),
81                    );
82
83                    while let Some((key, value)) = map.next_entry()? {
84                        values.insert(key, value);
85                    }
86
87                    Ok(values)
88                }
89            }
90
91            let visitor = MapVisitor {
92                marker: PhantomData,
93            };
94            deserializer.deserialize_map(visitor)
95        }
96    }
97}
98
99mod set {
100    use crate::raw::Allocator;
101    use core::fmt;
102    use core::hash::{BuildHasher, Hash};
103    use core::marker::PhantomData;
104    use serde::de::{Deserialize, Deserializer, SeqAccess, Visitor};
105    use serde::ser::{Serialize, Serializer};
106
107    use crate::hash_set::HashSet;
108
109    use super::size_hint;
110
111    impl<T, H, A> Serialize for HashSet<T, H, A>
112    where
113        T: Serialize + Eq + Hash,
114        H: BuildHasher,
115        A: Allocator,
116    {
117        #[cfg_attr(feature = "inline-more", inline)]
118        fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
119        where
120            S: Serializer,
121        {
122            serializer.collect_seq(self)
123        }
124    }
125
126    impl<'de, T, S, A> Deserialize<'de> for HashSet<T, S, A>
127    where
128        T: Deserialize<'de> + Eq + Hash,
129        S: BuildHasher + Default,
130        A: Allocator + Default,
131    {
132        fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
133        where
134            D: Deserializer<'de>,
135        {
136            struct SeqVisitor<T, S, A>
137            where
138                A: Allocator,
139            {
140                marker: PhantomData<HashSet<T, S, A>>,
141            }
142
143            impl<'de, T, S, A> Visitor<'de> for SeqVisitor<T, S, A>
144            where
145                T: Deserialize<'de> + Eq + Hash,
146                S: BuildHasher + Default,
147                A: Allocator + Default,
148            {
149                type Value = HashSet<T, S, A>;
150
151                fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
152                    formatter.write_str("a sequence")
153                }
154
155                #[cfg_attr(feature = "inline-more", inline)]
156                fn visit_seq<M>(self, mut seq: M) -> Result<Self::Value, M::Error>
157                where
158                    M: SeqAccess<'de>,
159                {
160                    let mut values = HashSet::with_capacity_and_hasher_in(
161                        size_hint::cautious(seq.size_hint()),
162                        S::default(),
163                        A::default(),
164                    );
165
166                    while let Some(value) = seq.next_element()? {
167                        values.insert(value);
168                    }
169
170                    Ok(values)
171                }
172            }
173
174            let visitor = SeqVisitor {
175                marker: PhantomData,
176            };
177            deserializer.deserialize_seq(visitor)
178        }
179
180        #[allow(clippy::missing_errors_doc)]
181        fn deserialize_in_place<D>(deserializer: D, place: &mut Self) -> Result<(), D::Error>
182        where
183            D: Deserializer<'de>,
184        {
185            struct SeqInPlaceVisitor<'a, T, S, A>(&'a mut HashSet<T, S, A>)
186            where
187                A: Allocator;
188
189            impl<'a, 'de, T, S, A> Visitor<'de> for SeqInPlaceVisitor<'a, T, S, A>
190            where
191                T: Deserialize<'de> + Eq + Hash,
192                S: BuildHasher + Default,
193                A: Allocator,
194            {
195                type Value = ();
196
197                fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
198                    formatter.write_str("a sequence")
199                }
200
201                #[cfg_attr(feature = "inline-more", inline)]
202                fn visit_seq<M>(self, mut seq: M) -> Result<Self::Value, M::Error>
203                where
204                    M: SeqAccess<'de>,
205                {
206                    self.0.clear();
207                    self.0.reserve(size_hint::cautious(seq.size_hint()));
208
209                    while let Some(value) = seq.next_element()? {
210                        self.0.insert(value);
211                    }
212
213                    Ok(())
214                }
215            }
216
217            deserializer.deserialize_seq(SeqInPlaceVisitor(place))
218        }
219    }
220}