4 /// This presumably exists to prevent denial of service attacks.
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)
15 use core
::hash
::{BuildHasher, Hash}
;
16 use core
::marker
::PhantomData
;
17 use serde
::de
::{Deserialize, Deserializer, MapAccess, Visitor}
;
18 use serde
::ser
::{Serialize, Serializer}
;
20 use crate::hash_map
::HashMap
;
24 impl<K
, V
, H
> Serialize
for HashMap
<K
, V
, H
>
26 K
: Serialize
+ Eq
+ Hash
,
30 #[cfg_attr(feature = "inline-more", inline)]
31 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
35 serializer
.collect_map(self)
39 impl<'de
, K
, V
, S
> Deserialize
<'de
> for HashMap
<K
, V
, S
>
41 K
: Deserialize
<'de
> + Eq
+ Hash
,
43 S
: BuildHasher
+ Default
,
45 fn deserialize
<D
>(deserializer
: D
) -> Result
<Self, D
::Error
>
49 struct MapVisitor
<K
, V
, S
> {
50 marker
: PhantomData
<HashMap
<K
, V
, S
>>,
53 impl<'de
, K
, V
, S
> Visitor
<'de
> for MapVisitor
<K
, V
, S
>
55 K
: Deserialize
<'de
> + Eq
+ Hash
,
57 S
: BuildHasher
+ Default
,
59 type Value
= HashMap
<K
, V
, S
>;
61 fn expecting(&self, formatter
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
62 formatter
.write_str("a map")
65 #[cfg_attr(feature = "inline-more", inline)]
66 fn visit_map
<A
>(self, mut map
: A
) -> Result
<Self::Value
, A
::Error
>
70 let mut values
= HashMap
::with_capacity_and_hasher(
71 size_hint
::cautious(map
.size_hint()),
75 while let Some((key
, value
)) = map
.next_entry()?
{
76 values
.insert(key
, value
);
83 let visitor
= MapVisitor
{
86 deserializer
.deserialize_map(visitor
)
93 use core
::hash
::{BuildHasher, Hash}
;
94 use core
::marker
::PhantomData
;
95 use serde
::de
::{Deserialize, Deserializer, SeqAccess, Visitor}
;
96 use serde
::ser
::{Serialize, Serializer}
;
98 use crate::hash_set
::HashSet
;
100 use super::size_hint
;
102 impl<T
, H
> Serialize
for HashSet
<T
, H
>
104 T
: Serialize
+ Eq
+ Hash
,
107 #[cfg_attr(feature = "inline-more", inline)]
108 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
112 serializer
.collect_seq(self)
116 impl<'de
, T
, S
> Deserialize
<'de
> for HashSet
<T
, S
>
118 T
: Deserialize
<'de
> + Eq
+ Hash
,
119 S
: BuildHasher
+ Default
,
121 fn deserialize
<D
>(deserializer
: D
) -> Result
<Self, D
::Error
>
123 D
: Deserializer
<'de
>,
125 struct SeqVisitor
<T
, S
> {
126 marker
: PhantomData
<HashSet
<T
, S
>>,
129 impl<'de
, T
, S
> Visitor
<'de
> for SeqVisitor
<T
, S
>
131 T
: Deserialize
<'de
> + Eq
+ Hash
,
132 S
: BuildHasher
+ Default
,
134 type Value
= HashSet
<T
, S
>;
136 fn expecting(&self, formatter
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
137 formatter
.write_str("a sequence")
140 #[cfg_attr(feature = "inline-more", inline)]
141 fn visit_seq
<A
>(self, mut seq
: A
) -> Result
<Self::Value
, A
::Error
>
145 let mut values
= HashSet
::with_capacity_and_hasher(
146 size_hint
::cautious(seq
.size_hint()),
150 while let Some(value
) = seq
.next_element()?
{
151 values
.insert(value
);
158 let visitor
= SeqVisitor
{
161 deserializer
.deserialize_seq(visitor
)
164 fn deserialize_in_place
<D
>(deserializer
: D
, place
: &mut Self) -> Result
<(), D
::Error
>
166 D
: Deserializer
<'de
>,
168 struct SeqInPlaceVisitor
<'a
, T
, S
>(&'a
mut HashSet
<T
, S
>);
170 impl<'a
, 'de
, T
, S
> Visitor
<'de
> for SeqInPlaceVisitor
<'a
, T
, S
>
172 T
: Deserialize
<'de
> + Eq
+ Hash
,
173 S
: BuildHasher
+ Default
,
177 fn expecting(&self, formatter
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
178 formatter
.write_str("a sequence")
181 #[cfg_attr(feature = "inline-more", inline)]
182 fn visit_seq
<A
>(self, mut seq
: A
) -> Result
<Self::Value
, A
::Error
>
187 self.0.reserve(size_hint
::cautious(seq
.size_hint()));
189 while let Some(value
) = seq
.next_element()?
{
190 self.0.insert
(value
);
197 deserializer
.deserialize_seq(SeqInPlaceVisitor(place
))