1use crate::{mapref, setref, DashMap, DashSet};
2use core::fmt;
3use core::hash::{BuildHasher, Hash};
4use core::marker::PhantomData;
5use serde::de::{Deserialize, MapAccess, SeqAccess, Visitor};
6use serde::ser::{Serialize, SerializeMap, SerializeSeq, Serializer};
7use serde::Deserializer;
8
9pub struct DashMapVisitor<K, V, S> {
10 marker: PhantomData<fn() -> DashMap<K, V, S>>,
11}
12
13impl<K, V, S> DashMapVisitor<K, V, S>
14where
15 K: Eq + Hash,
16 S: BuildHasher + Clone,
17{
18 fn new() -> Self {
19 DashMapVisitor {
20 marker: PhantomData,
21 }
22 }
23}
24
25impl<'de, K, V, S> Visitor<'de> for DashMapVisitor<K, V, S>
26where
27 K: Deserialize<'de> + Eq + Hash,
28 V: Deserialize<'de>,
29 S: BuildHasher + Clone + Default,
30{
31 type Value = DashMap<K, V, S>;
32
33 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
34 formatter.write_str("a DashMap")
35 }
36
37 fn visit_map<M>(self, mut access: M) -> Result<Self::Value, M::Error>
38 where
39 M: MapAccess<'de>,
40 {
41 let map =
42 DashMap::with_capacity_and_hasher(access.size_hint().unwrap_or(0), Default::default());
43
44 while let Some((key, value)) = access.next_entry()? {
45 map.insert(key, value);
46 }
47
48 Ok(map)
49 }
50}
51
52impl<'de, K, V, S> Deserialize<'de> for DashMap<K, V, S>
53where
54 K: Deserialize<'de> + Eq + Hash,
55 V: Deserialize<'de>,
56 S: BuildHasher + Clone + Default,
57{
58 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
59 where
60 D: Deserializer<'de>,
61 {
62 deserializer.deserialize_map(DashMapVisitor::<K, V, S>::new())
63 }
64}
65
66impl<K, V, H> Serialize for DashMap<K, V, H>
67where
68 K: Serialize + Eq + Hash,
69 V: Serialize,
70 H: BuildHasher + Clone,
71{
72 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
73 where
74 S: Serializer,
75 {
76 let mut map = serializer.serialize_map(Some(self.len()))?;
77
78 for ref_multi in self.iter() {
79 map.serialize_entry(ref_multi.key(), ref_multi.value())?;
80 }
81
82 map.end()
83 }
84}
85
86pub struct DashSetVisitor<K, S> {
87 marker: PhantomData<fn() -> DashSet<K, S>>,
88}
89
90impl<K, S> DashSetVisitor<K, S>
91where
92 K: Eq + Hash,
93 S: BuildHasher + Clone,
94{
95 fn new() -> Self {
96 DashSetVisitor {
97 marker: PhantomData,
98 }
99 }
100}
101
102impl<'de, K, S> Visitor<'de> for DashSetVisitor<K, S>
103where
104 K: Deserialize<'de> + Eq + Hash,
105 S: BuildHasher + Clone + Default,
106{
107 type Value = DashSet<K, S>;
108
109 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
110 formatter.write_str("a DashSet")
111 }
112
113 fn visit_seq<M>(self, mut access: M) -> Result<Self::Value, M::Error>
114 where
115 M: SeqAccess<'de>,
116 {
117 let map =
118 DashSet::with_capacity_and_hasher(access.size_hint().unwrap_or(0), Default::default());
119
120 while let Some(key) = access.next_element()? {
121 map.insert(key);
122 }
123
124 Ok(map)
125 }
126}
127
128impl<'de, K, S> Deserialize<'de> for DashSet<K, S>
129where
130 K: Deserialize<'de> + Eq + Hash,
131 S: BuildHasher + Clone + Default,
132{
133 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
134 where
135 D: Deserializer<'de>,
136 {
137 deserializer.deserialize_seq(DashSetVisitor::<K, S>::new())
138 }
139}
140
141impl<K, H> Serialize for DashSet<K, H>
142where
143 K: Serialize + Eq + Hash,
144 H: BuildHasher + Clone,
145{
146 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
147 where
148 S: Serializer,
149 {
150 let mut seq = serializer.serialize_seq(Some(self.len()))?;
151
152 for ref_multi in self.iter() {
153 seq.serialize_element(ref_multi.key())?;
154 }
155
156 seq.end()
157 }
158}
159
160macro_rules! serialize_impl {
161 () => {
162 fn serialize<Ser>(&self, serializer: Ser) -> Result<Ser::Ok, Ser::Error>
163 where
164 Ser: serde::Serializer,
165 {
166 std::ops::Deref::deref(self).serialize(serializer)
167 }
168 };
169}
170
171impl<'a, K: Eq + Hash, V: Serialize, S: BuildHasher> Serialize
173 for mapref::multiple::RefMulti<'a, K, V, S>
174{
175 serialize_impl! {}
176}
177
178impl<'a, K: Eq + Hash, V: Serialize, S: BuildHasher> Serialize
179 for mapref::multiple::RefMutMulti<'a, K, V, S>
180{
181 serialize_impl! {}
182}
183
184impl<'a, K: Eq + Hash, V: Serialize, S: BuildHasher> Serialize for mapref::one::Ref<'a, K, V, S> {
185 serialize_impl! {}
186}
187
188impl<'a, K: Eq + Hash, V: Serialize, S: BuildHasher> Serialize
189 for mapref::one::RefMut<'a, K, V, S>
190{
191 serialize_impl! {}
192}
193
194impl<'a, K: Eq + Hash, V, T: Serialize, S: BuildHasher> Serialize
195 for mapref::one::MappedRef<'a, K, V, T, S>
196{
197 serialize_impl! {}
198}
199
200impl<'a, K: Eq + Hash, V, T: Serialize, S: BuildHasher> Serialize
201 for mapref::one::MappedRefMut<'a, K, V, T, S>
202{
203 serialize_impl! {}
204}
205
206impl<'a, V: Hash + Eq + Serialize, S: BuildHasher> Serialize
208 for setref::multiple::RefMulti<'a, V, S>
209{
210 serialize_impl! {}
211}
212
213impl<'a, V: Hash + Eq + Serialize, S: BuildHasher> Serialize for setref::one::Ref<'a, V, S> {
214 serialize_impl! {}
215}