1#[cfg(feature = "halfbrown")]
2use halfbrown::HashMap as Halfbrown;
3#[cfg(feature = "hashbrown")]
4use hashbrown::HashMap as Hashbrown;
5use std::collections::HashMap;
6use std::hash::Hash;
7use std::{borrow::Borrow, hash::BuildHasher};
8
9pub trait Object {
11 type Key: ?Sized;
13 type Element;
15
16 #[must_use]
20 fn get<Q>(&self, k: &Q) -> Option<&Self::Element>
21 where
22 Self::Key: Borrow<Q>,
23 Q: ?Sized + Hash + Eq + Ord;
24
25 #[must_use]
27 fn iter(&self) -> Box<dyn Iterator<Item = (&Self::Key, &Self::Element)> + '_>;
28
29 #[must_use]
31 fn keys(&self) -> Box<dyn Iterator<Item = &Self::Key> + '_>;
32
33 #[must_use]
35 fn values(&self) -> Box<dyn Iterator<Item = &Self::Element> + '_>;
36
37 #[must_use]
39 fn len(&self) -> usize;
40
41 #[must_use]
43 fn is_empty(&self) -> bool {
44 self.len() == 0
45 }
46}
47
48pub trait ObjectMut {
50 type Key: ?Sized;
52 type Element;
54
55 #[must_use]
57 fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut Self::Element>
58 where
59 Self::Key: Borrow<Q>,
60 Q: ?Sized + Hash + Eq + Ord;
61
62 #[must_use]
64 fn insert<K, V>(&mut self, k: K, v: V) -> Option<Self::Element>
65 where
66 Self::Key: From<K> + Hash + Eq,
67 V: Into<Self::Element>;
68
69 #[must_use]
71 fn remove<Q>(&mut self, k: &Q) -> Option<Self::Element>
72 where
73 Self::Key: Borrow<Q>,
74 Q: ?Sized + Hash + Eq + Ord;
75}
76
77#[cfg(feature = "halfbrown")]
78impl<MapK, MapE, S> Object for Halfbrown<MapK, MapE, S>
79where
80 MapK: Hash + Eq,
81 S: BuildHasher + Default,
82{
83 type Key = MapK;
84 type Element = MapE;
85
86 #[inline]
87 fn get<Q>(&self, k: &Q) -> Option<&Self::Element>
88 where
89 Self::Key: Borrow<Q>,
90 Q: ?Sized + Hash + Eq + Ord,
91 {
92 Halfbrown::get(self, k)
93 }
94
95 #[inline]
96 fn iter(&self) -> Box<dyn Iterator<Item = (&Self::Key, &Self::Element)> + '_> {
97 Box::new(Halfbrown::iter(self))
98 }
99
100 #[inline]
101 fn keys(&self) -> Box<dyn Iterator<Item = &Self::Key> + '_> {
102 Box::new(Halfbrown::keys(self))
103 }
104
105 #[inline]
106 fn values(&self) -> Box<dyn Iterator<Item = &Self::Element> + '_> {
107 Box::new(Halfbrown::values(self))
108 }
109
110 #[inline]
111 fn len(&self) -> usize {
112 Halfbrown::len(self)
113 }
114}
115
116#[cfg(feature = "halfbrown")]
117impl<MapK, MapE, S> ObjectMut for Halfbrown<MapK, MapE, S>
118where
119 MapK: Hash + Eq,
120 S: BuildHasher + Default,
121{
122 type Key = MapK;
123 type Element = MapE;
124
125 #[inline]
126 fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut Self::Element>
127 where
128 Self::Key: Borrow<Q>,
129 Q: ?Sized + Hash + Eq + Ord,
130 {
131 Halfbrown::get_mut(self, k)
132 }
133
134 #[inline]
135 fn insert<K, V>(&mut self, k: K, v: V) -> Option<Self::Element>
136 where
137 K: Into<Self::Key>,
138 V: Into<Self::Element>,
139 Self::Key: Hash + Eq,
140 {
141 Halfbrown::insert(self, k.into(), v.into())
142 }
143
144 #[inline]
145 fn remove<Q>(&mut self, k: &Q) -> Option<Self::Element>
146 where
147 Self::Key: Borrow<Q>,
148 Q: ?Sized + Hash + Eq + Ord,
149 {
150 Halfbrown::remove(self, k)
151 }
152}
153
154impl<MapK, MapE, S: BuildHasher> Object for HashMap<MapK, MapE, S>
155where
156 MapK: Hash + Eq,
157{
158 type Key = MapK;
159 type Element = MapE;
160
161 #[inline]
162 fn get<Q>(&self, k: &Q) -> Option<&Self::Element>
163 where
164 Self::Key: Borrow<Q>,
165 Q: ?Sized + Hash + Eq + Ord,
166 {
167 HashMap::get(self, k)
168 }
169
170 #[inline]
171 fn iter(&self) -> Box<dyn Iterator<Item = (&Self::Key, &Self::Element)> + '_> {
172 Box::new(HashMap::iter(self))
173 }
174
175 #[inline]
176 fn keys(&self) -> Box<dyn Iterator<Item = &Self::Key> + '_> {
177 Box::new(HashMap::keys(self))
178 }
179
180 #[inline]
181 fn values(&self) -> Box<dyn Iterator<Item = &Self::Element> + '_> {
182 Box::new(HashMap::values(self))
183 }
184
185 #[inline]
186 fn len(&self) -> usize {
187 HashMap::len(self)
188 }
189}
190
191impl<MapK, MapE, S: BuildHasher> ObjectMut for HashMap<MapK, MapE, S>
192where
193 MapK: Hash + Eq,
194{
195 type Key = MapK;
196 type Element = MapE;
197
198 #[inline]
199 fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut Self::Element>
200 where
201 Self::Key: Borrow<Q>,
202 Q: ?Sized + Hash + Eq + Ord,
203 {
204 HashMap::get_mut(self, k)
205 }
206
207 #[inline]
208 fn insert<K, V>(&mut self, k: K, v: V) -> Option<Self::Element>
209 where
210 K: Into<Self::Key>,
211 V: Into<Self::Element>,
212 Self::Key: Hash + Eq,
213 {
214 HashMap::insert(self, k.into(), v.into())
215 }
216
217 #[inline]
218 fn remove<Q>(&mut self, k: &Q) -> Option<Self::Element>
219 where
220 Self::Key: Borrow<Q>,
221 Q: ?Sized + Hash + Eq + Ord,
222 {
223 HashMap::remove(self, k)
224 }
225}
226
227#[cfg(feature = "hashbrown")]
228impl<MapK, MapE, S: BuildHasher> Object for Hashbrown<MapK, MapE, S>
229where
230 MapK: Hash + Eq,
231{
232 type Key = MapK;
233 type Element = MapE;
234
235 #[inline]
236 fn get<Q>(&self, k: &Q) -> Option<&Self::Element>
237 where
238 Self::Key: Borrow<Q>,
239 Q: ?Sized + Hash + Eq + Ord,
240 {
241 Hashbrown::get(self, k)
242 }
243
244 #[inline]
245 fn iter<'i>(&'i self) -> Box<dyn Iterator<Item = (&Self::Key, &Self::Element)> + 'i> {
246 Box::new(Hashbrown::iter(self))
247 }
248
249 #[inline]
250 fn keys<'i>(&'i self) -> Box<dyn Iterator<Item = &Self::Key> + 'i> {
251 Box::new(Hashbrown::keys(self))
252 }
253
254 #[inline]
255 fn values<'i>(&'i self) -> Box<dyn Iterator<Item = &Self::Element> + 'i> {
256 Box::new(Hashbrown::values(self))
257 }
258
259 #[inline]
260 fn len(&self) -> usize {
261 Hashbrown::len(self)
262 }
263}
264#[cfg(feature = "hashbrown")]
265impl<MapK, MapE, S: BuildHasher> ObjectMut for Hashbrown<MapK, MapE, S>
266where
267 MapK: Hash + Eq,
268{
269 type Key = MapK;
270 type Element = MapE;
271
272 #[inline]
273 fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut Self::Element>
274 where
275 Self::Key: Borrow<Q>,
276 Q: ?Sized + Hash + Eq + Ord,
277 {
278 Hashbrown::get_mut(self, k)
279 }
280
281 #[inline]
282 fn insert<K, V>(&mut self, k: K, v: V) -> Option<Self::Element>
283 where
284 K: Into<Self::Key>,
285 V: Into<Self::Element>,
286 Self::Key: Hash + Eq,
287 {
288 Hashbrown::insert(self, k.into(), v.into())
289 }
290
291 #[inline]
292 fn remove<Q>(&mut self, k: &Q) -> Option<Self::Element>
293 where
294 Self::Key: Borrow<Q>,
295 Q: ?Sized + Hash + Eq + Ord,
296 {
297 Hashbrown::remove(self, k)
298 }
299}
300
301#[cfg(feature = "c-abi")]
302impl<MapK, MapE, S: ::std::hash::BuildHasher> Object
303 for abi_stable::std_types::RHashMap<MapK, MapE, S>
304where
305 MapK: Hash + Eq,
306{
307 type Key = MapK;
308 type Element = MapE;
309
310 #[inline]
311 fn get<Q>(&self, k: &Q) -> Option<&Self::Element>
312 where
313 Self::Key: Borrow<Q>,
314 Q: ?Sized + Hash + Eq + Ord,
315 {
316 abi_stable::std_types::RHashMap::get(self, k)
317 }
318
319 #[inline]
320 fn iter<'i>(&'i self) -> Box<dyn Iterator<Item = (&Self::Key, &Self::Element)> + 'i> {
321 Box::new(abi_stable::std_types::RHashMap::iter(self).map(Into::into))
322 }
323
324 #[inline]
325 fn keys<'i>(&'i self) -> Box<dyn Iterator<Item = &Self::Key> + 'i> {
326 Box::new(abi_stable::std_types::RHashMap::keys(self))
327 }
328
329 #[inline]
330 fn values<'i>(&'i self) -> Box<dyn Iterator<Item = &Self::Element> + 'i> {
331 Box::new(abi_stable::std_types::RHashMap::values(self))
332 }
333
334 #[inline]
335 fn len(&self) -> usize {
336 abi_stable::std_types::RHashMap::len(self)
337 }
338}
339
340#[cfg(feature = "c-abi")]
341impl<MapK, MapE, S: ::std::hash::BuildHasher> ObjectMut
342 for abi_stable::std_types::RHashMap<MapK, MapE, S>
343where
344 MapK: Hash + Eq,
345{
346 type Key = MapK;
347 type Element = MapE;
348
349 #[inline]
350 fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut Self::Element>
351 where
352 Self::Key: Borrow<Q>,
353 Q: ?Sized + Hash + Eq + Ord,
354 {
355 abi_stable::std_types::RHashMap::get_mut(self, k)
356 }
357
358 #[inline]
359 fn insert<K, V>(&mut self, k: K, v: V) -> Option<Self::Element>
360 where
361 K: Into<Self::Key>,
362 V: Into<Self::Element>,
363 Self::Key: Hash + Eq,
364 {
365 abi_stable::std_types::RHashMap::insert(self, k.into(), v.into()).into()
366 }
367
368 #[inline]
369 fn remove<Q>(&mut self, k: &Q) -> Option<Self::Element>
370 where
371 Self::Key: Borrow<Q>,
372 Q: ?Sized + Hash + Eq + Ord,
373 {
374 abi_stable::std_types::RHashMap::remove(self, k).into()
375 }
376}